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

ds3000.c (26130B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3    Montage Technology DS3000 - DVBS/S2 Demodulator driver
      4    Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
      5
      6    Copyright (C) 2009-2012 TurboSight.com
      7
      8 */
      9
     10#include <linux/slab.h>
     11#include <linux/kernel.h>
     12#include <linux/module.h>
     13#include <linux/moduleparam.h>
     14#include <linux/init.h>
     15#include <linux/firmware.h>
     16
     17#include <media/dvb_frontend.h>
     18#include "ts2020.h"
     19#include "ds3000.h"
     20
     21static int debug;
     22
     23#define dprintk(args...) \
     24	do { \
     25		if (debug) \
     26			printk(args); \
     27	} while (0)
     28
     29/* as of March 2009 current DS3000 firmware version is 1.78 */
     30/* DS3000 FW v1.78 MD5: a32d17910c4f370073f9346e71d34b80 */
     31#define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
     32
     33#define DS3000_SAMPLE_RATE 96000 /* in kHz */
     34
     35/* Register values to initialise the demod in DVB-S mode */
     36static u8 ds3000_dvbs_init_tab[] = {
     37	0x23, 0x05,
     38	0x08, 0x03,
     39	0x0c, 0x00,
     40	0x21, 0x54,
     41	0x25, 0x82,
     42	0x27, 0x31,
     43	0x30, 0x08,
     44	0x31, 0x40,
     45	0x32, 0x32,
     46	0x33, 0x35,
     47	0x35, 0xff,
     48	0x3a, 0x00,
     49	0x37, 0x10,
     50	0x38, 0x10,
     51	0x39, 0x02,
     52	0x42, 0x60,
     53	0x4a, 0x40,
     54	0x4b, 0x04,
     55	0x4d, 0x91,
     56	0x5d, 0xc8,
     57	0x50, 0x77,
     58	0x51, 0x77,
     59	0x52, 0x36,
     60	0x53, 0x36,
     61	0x56, 0x01,
     62	0x63, 0x43,
     63	0x64, 0x30,
     64	0x65, 0x40,
     65	0x68, 0x26,
     66	0x69, 0x4c,
     67	0x70, 0x20,
     68	0x71, 0x70,
     69	0x72, 0x04,
     70	0x73, 0x00,
     71	0x70, 0x40,
     72	0x71, 0x70,
     73	0x72, 0x04,
     74	0x73, 0x00,
     75	0x70, 0x60,
     76	0x71, 0x70,
     77	0x72, 0x04,
     78	0x73, 0x00,
     79	0x70, 0x80,
     80	0x71, 0x70,
     81	0x72, 0x04,
     82	0x73, 0x00,
     83	0x70, 0xa0,
     84	0x71, 0x70,
     85	0x72, 0x04,
     86	0x73, 0x00,
     87	0x70, 0x1f,
     88	0x76, 0x00,
     89	0x77, 0xd1,
     90	0x78, 0x0c,
     91	0x79, 0x80,
     92	0x7f, 0x04,
     93	0x7c, 0x00,
     94	0x80, 0x86,
     95	0x81, 0xa6,
     96	0x85, 0x04,
     97	0xcd, 0xf4,
     98	0x90, 0x33,
     99	0xa0, 0x44,
    100	0xc0, 0x18,
    101	0xc3, 0x10,
    102	0xc4, 0x08,
    103	0xc5, 0x80,
    104	0xc6, 0x80,
    105	0xc7, 0x0a,
    106	0xc8, 0x1a,
    107	0xc9, 0x80,
    108	0xfe, 0x92,
    109	0xe0, 0xf8,
    110	0xe6, 0x8b,
    111	0xd0, 0x40,
    112	0xf8, 0x20,
    113	0xfa, 0x0f,
    114	0xfd, 0x20,
    115	0xad, 0x20,
    116	0xae, 0x07,
    117	0xb8, 0x00,
    118};
    119
    120/* Register values to initialise the demod in DVB-S2 mode */
    121static u8 ds3000_dvbs2_init_tab[] = {
    122	0x23, 0x0f,
    123	0x08, 0x07,
    124	0x0c, 0x00,
    125	0x21, 0x54,
    126	0x25, 0x82,
    127	0x27, 0x31,
    128	0x30, 0x08,
    129	0x31, 0x32,
    130	0x32, 0x32,
    131	0x33, 0x35,
    132	0x35, 0xff,
    133	0x3a, 0x00,
    134	0x37, 0x10,
    135	0x38, 0x10,
    136	0x39, 0x02,
    137	0x42, 0x60,
    138	0x4a, 0x80,
    139	0x4b, 0x04,
    140	0x4d, 0x81,
    141	0x5d, 0x88,
    142	0x50, 0x36,
    143	0x51, 0x36,
    144	0x52, 0x36,
    145	0x53, 0x36,
    146	0x63, 0x60,
    147	0x64, 0x10,
    148	0x65, 0x10,
    149	0x68, 0x04,
    150	0x69, 0x29,
    151	0x70, 0x20,
    152	0x71, 0x70,
    153	0x72, 0x04,
    154	0x73, 0x00,
    155	0x70, 0x40,
    156	0x71, 0x70,
    157	0x72, 0x04,
    158	0x73, 0x00,
    159	0x70, 0x60,
    160	0x71, 0x70,
    161	0x72, 0x04,
    162	0x73, 0x00,
    163	0x70, 0x80,
    164	0x71, 0x70,
    165	0x72, 0x04,
    166	0x73, 0x00,
    167	0x70, 0xa0,
    168	0x71, 0x70,
    169	0x72, 0x04,
    170	0x73, 0x00,
    171	0x70, 0x1f,
    172	0xa0, 0x44,
    173	0xc0, 0x08,
    174	0xc1, 0x10,
    175	0xc2, 0x08,
    176	0xc3, 0x10,
    177	0xc4, 0x08,
    178	0xc5, 0xf0,
    179	0xc6, 0xf0,
    180	0xc7, 0x0a,
    181	0xc8, 0x1a,
    182	0xc9, 0x80,
    183	0xca, 0x23,
    184	0xcb, 0x24,
    185	0xce, 0x74,
    186	0x90, 0x03,
    187	0x76, 0x80,
    188	0x77, 0x42,
    189	0x78, 0x0a,
    190	0x79, 0x80,
    191	0xad, 0x40,
    192	0xae, 0x07,
    193	0x7f, 0xd4,
    194	0x7c, 0x00,
    195	0x80, 0xa8,
    196	0x81, 0xda,
    197	0x7c, 0x01,
    198	0x80, 0xda,
    199	0x81, 0xec,
    200	0x7c, 0x02,
    201	0x80, 0xca,
    202	0x81, 0xeb,
    203	0x7c, 0x03,
    204	0x80, 0xba,
    205	0x81, 0xdb,
    206	0x85, 0x08,
    207	0x86, 0x00,
    208	0x87, 0x02,
    209	0x89, 0x80,
    210	0x8b, 0x44,
    211	0x8c, 0xaa,
    212	0x8a, 0x10,
    213	0xba, 0x00,
    214	0xf5, 0x04,
    215	0xfe, 0x44,
    216	0xd2, 0x32,
    217	0xb8, 0x00,
    218};
    219
    220struct ds3000_state {
    221	struct i2c_adapter *i2c;
    222	const struct ds3000_config *config;
    223	struct dvb_frontend frontend;
    224	/* previous uncorrected block counter for DVB-S2 */
    225	u16 prevUCBS2;
    226};
    227
    228static int ds3000_writereg(struct ds3000_state *state, int reg, int data)
    229{
    230	u8 buf[] = { reg, data };
    231	struct i2c_msg msg = { .addr = state->config->demod_address,
    232		.flags = 0, .buf = buf, .len = 2 };
    233	int err;
    234
    235	dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
    236
    237	err = i2c_transfer(state->i2c, &msg, 1);
    238	if (err != 1) {
    239		printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x, value == 0x%02x)\n",
    240		       __func__, err, reg, data);
    241		return -EREMOTEIO;
    242	}
    243
    244	return 0;
    245}
    246
    247static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
    248{
    249	struct ds3000_state *state = fe->demodulator_priv;
    250
    251	if (enable)
    252		ds3000_writereg(state, 0x03, 0x12);
    253	else
    254		ds3000_writereg(state, 0x03, 0x02);
    255
    256	return 0;
    257}
    258
    259/* I2C write for 8k firmware load */
    260static int ds3000_writeFW(struct ds3000_state *state, int reg,
    261				const u8 *data, u16 len)
    262{
    263	int i, ret = 0;
    264	struct i2c_msg msg;
    265	u8 *buf;
    266
    267	buf = kmalloc(33, GFP_KERNEL);
    268	if (!buf)
    269		return -ENOMEM;
    270
    271	*(buf) = reg;
    272
    273	msg.addr = state->config->demod_address;
    274	msg.flags = 0;
    275	msg.buf = buf;
    276	msg.len = 33;
    277
    278	for (i = 0; i < len; i += 32) {
    279		memcpy(buf + 1, data + i, 32);
    280
    281		dprintk("%s: write reg 0x%02x, len = %d\n", __func__, reg, len);
    282
    283		ret = i2c_transfer(state->i2c, &msg, 1);
    284		if (ret != 1) {
    285			printk(KERN_ERR "%s: write error(err == %i, reg == 0x%02x\n",
    286			       __func__, ret, reg);
    287			ret = -EREMOTEIO;
    288			goto error;
    289		}
    290	}
    291	ret = 0;
    292
    293error:
    294	kfree(buf);
    295
    296	return ret;
    297}
    298
    299static int ds3000_readreg(struct ds3000_state *state, u8 reg)
    300{
    301	int ret;
    302	u8 b0[] = { reg };
    303	u8 b1[] = { 0 };
    304	struct i2c_msg msg[] = {
    305		{
    306			.addr = state->config->demod_address,
    307			.flags = 0,
    308			.buf = b0,
    309			.len = 1
    310		}, {
    311			.addr = state->config->demod_address,
    312			.flags = I2C_M_RD,
    313			.buf = b1,
    314			.len = 1
    315		}
    316	};
    317
    318	ret = i2c_transfer(state->i2c, msg, 2);
    319
    320	if (ret != 2) {
    321		printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
    322		return ret;
    323	}
    324
    325	dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
    326
    327	return b1[0];
    328}
    329
    330static int ds3000_load_firmware(struct dvb_frontend *fe,
    331					const struct firmware *fw);
    332
    333static int ds3000_firmware_ondemand(struct dvb_frontend *fe)
    334{
    335	struct ds3000_state *state = fe->demodulator_priv;
    336	const struct firmware *fw;
    337	int ret = 0;
    338
    339	dprintk("%s()\n", __func__);
    340
    341	ret = ds3000_readreg(state, 0xb2);
    342	if (ret < 0)
    343		return ret;
    344
    345	/* Load firmware */
    346	/* request the firmware, this will block until someone uploads it */
    347	printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__,
    348				DS3000_DEFAULT_FIRMWARE);
    349	ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
    350				state->i2c->dev.parent);
    351	printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__);
    352	if (ret) {
    353		printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n",
    354		       __func__);
    355		return ret;
    356	}
    357
    358	ret = ds3000_load_firmware(fe, fw);
    359	if (ret)
    360		printk("%s: Writing firmware to device failed\n", __func__);
    361
    362	release_firmware(fw);
    363
    364	dprintk("%s: Firmware upload %s\n", __func__,
    365			ret == 0 ? "complete" : "failed");
    366
    367	return ret;
    368}
    369
    370static int ds3000_load_firmware(struct dvb_frontend *fe,
    371					const struct firmware *fw)
    372{
    373	struct ds3000_state *state = fe->demodulator_priv;
    374	int ret = 0;
    375
    376	dprintk("%s\n", __func__);
    377	dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
    378			fw->size,
    379			fw->data[0],
    380			fw->data[1],
    381			fw->data[fw->size - 2],
    382			fw->data[fw->size - 1]);
    383
    384	/* Begin the firmware load process */
    385	ds3000_writereg(state, 0xb2, 0x01);
    386	/* write the entire firmware */
    387	ret = ds3000_writeFW(state, 0xb0, fw->data, fw->size);
    388	ds3000_writereg(state, 0xb2, 0x00);
    389
    390	return ret;
    391}
    392
    393static int ds3000_set_voltage(struct dvb_frontend *fe,
    394			      enum fe_sec_voltage voltage)
    395{
    396	struct ds3000_state *state = fe->demodulator_priv;
    397	u8 data;
    398
    399	dprintk("%s(%d)\n", __func__, voltage);
    400
    401	data = ds3000_readreg(state, 0xa2);
    402	data |= 0x03; /* bit0 V/H, bit1 off/on */
    403
    404	switch (voltage) {
    405	case SEC_VOLTAGE_18:
    406		data &= ~0x03;
    407		break;
    408	case SEC_VOLTAGE_13:
    409		data &= ~0x03;
    410		data |= 0x01;
    411		break;
    412	case SEC_VOLTAGE_OFF:
    413		break;
    414	}
    415
    416	ds3000_writereg(state, 0xa2, data);
    417
    418	return 0;
    419}
    420
    421static int ds3000_read_status(struct dvb_frontend *fe, enum fe_status *status)
    422{
    423	struct ds3000_state *state = fe->demodulator_priv;
    424	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    425	int lock;
    426
    427	*status = 0;
    428
    429	switch (c->delivery_system) {
    430	case SYS_DVBS:
    431		lock = ds3000_readreg(state, 0xd1);
    432		if ((lock & 0x07) == 0x07)
    433			*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
    434				FE_HAS_VITERBI | FE_HAS_SYNC |
    435				FE_HAS_LOCK;
    436
    437		break;
    438	case SYS_DVBS2:
    439		lock = ds3000_readreg(state, 0x0d);
    440		if ((lock & 0x8f) == 0x8f)
    441			*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
    442				FE_HAS_VITERBI | FE_HAS_SYNC |
    443				FE_HAS_LOCK;
    444
    445		break;
    446	default:
    447		return -EINVAL;
    448	}
    449
    450	if (state->config->set_lock_led)
    451		state->config->set_lock_led(fe, *status == 0 ? 0 : 1);
    452
    453	dprintk("%s: status = 0x%02x\n", __func__, lock);
    454
    455	return 0;
    456}
    457
    458/* read DS3000 BER value */
    459static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber)
    460{
    461	struct ds3000_state *state = fe->demodulator_priv;
    462	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    463	u8 data;
    464	u32 ber_reading, lpdc_frames;
    465
    466	dprintk("%s()\n", __func__);
    467
    468	switch (c->delivery_system) {
    469	case SYS_DVBS:
    470		/* set the number of bytes checked during
    471		BER estimation */
    472		ds3000_writereg(state, 0xf9, 0x04);
    473		/* read BER estimation status */
    474		data = ds3000_readreg(state, 0xf8);
    475		/* check if BER estimation is ready */
    476		if ((data & 0x10) == 0) {
    477			/* this is the number of error bits,
    478			to calculate the bit error rate
    479			divide to 8388608 */
    480			*ber = (ds3000_readreg(state, 0xf7) << 8) |
    481				ds3000_readreg(state, 0xf6);
    482			/* start counting error bits */
    483			/* need to be set twice
    484			otherwise it fails sometimes */
    485			data |= 0x10;
    486			ds3000_writereg(state, 0xf8, data);
    487			ds3000_writereg(state, 0xf8, data);
    488		} else
    489			/* used to indicate that BER estimation
    490			is not ready, i.e. BER is unknown */
    491			*ber = 0xffffffff;
    492		break;
    493	case SYS_DVBS2:
    494		/* read the number of LPDC decoded frames */
    495		lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) |
    496				(ds3000_readreg(state, 0xd6) << 8) |
    497				ds3000_readreg(state, 0xd5);
    498		/* read the number of packets with bad CRC */
    499		ber_reading = (ds3000_readreg(state, 0xf8) << 8) |
    500				ds3000_readreg(state, 0xf7);
    501		if (lpdc_frames > 750) {
    502			/* clear LPDC frame counters */
    503			ds3000_writereg(state, 0xd1, 0x01);
    504			/* clear bad packets counter */
    505			ds3000_writereg(state, 0xf9, 0x01);
    506			/* enable bad packets counter */
    507			ds3000_writereg(state, 0xf9, 0x00);
    508			/* enable LPDC frame counters */
    509			ds3000_writereg(state, 0xd1, 0x00);
    510			*ber = ber_reading;
    511		} else
    512			/* used to indicate that BER estimation is not ready,
    513			i.e. BER is unknown */
    514			*ber = 0xffffffff;
    515		break;
    516	default:
    517		return -EINVAL;
    518	}
    519
    520	return 0;
    521}
    522
    523static int ds3000_read_signal_strength(struct dvb_frontend *fe,
    524						u16 *signal_strength)
    525{
    526	if (fe->ops.tuner_ops.get_rf_strength)
    527		fe->ops.tuner_ops.get_rf_strength(fe, signal_strength);
    528
    529	return 0;
    530}
    531
    532/* calculate DS3000 snr value in dB */
    533static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr)
    534{
    535	struct ds3000_state *state = fe->demodulator_priv;
    536	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    537	u8 snr_reading, snr_value;
    538	u32 dvbs2_signal_reading, dvbs2_noise_reading, tmp;
    539	static const u16 dvbs_snr_tab[] = { /* 20 x Table (rounded up) */
    540		0x0000, 0x1b13, 0x2aea, 0x3627, 0x3ede, 0x45fe, 0x4c03,
    541		0x513a, 0x55d4, 0x59f2, 0x5dab, 0x6111, 0x6431, 0x6717,
    542		0x69c9, 0x6c4e, 0x6eac, 0x70e8, 0x7304, 0x7505
    543	};
    544	static const u16 dvbs2_snr_tab[] = { /* 80 x Table (rounded up) */
    545		0x0000, 0x0bc2, 0x12a3, 0x1785, 0x1b4e, 0x1e65, 0x2103,
    546		0x2347, 0x2546, 0x2710, 0x28ae, 0x2a28, 0x2b83, 0x2cc5,
    547		0x2df1, 0x2f09, 0x3010, 0x3109, 0x31f4, 0x32d2, 0x33a6,
    548		0x3470, 0x3531, 0x35ea, 0x369b, 0x3746, 0x37ea, 0x3888,
    549		0x3920, 0x39b3, 0x3a42, 0x3acc, 0x3b51, 0x3bd3, 0x3c51,
    550		0x3ccb, 0x3d42, 0x3db6, 0x3e27, 0x3e95, 0x3f00, 0x3f68,
    551		0x3fcf, 0x4033, 0x4094, 0x40f4, 0x4151, 0x41ac, 0x4206,
    552		0x425e, 0x42b4, 0x4308, 0x435b, 0x43ac, 0x43fc, 0x444a,
    553		0x4497, 0x44e2, 0x452d, 0x4576, 0x45bd, 0x4604, 0x4649,
    554		0x468e, 0x46d1, 0x4713, 0x4755, 0x4795, 0x47d4, 0x4813,
    555		0x4851, 0x488d, 0x48c9, 0x4904, 0x493f, 0x4978, 0x49b1,
    556		0x49e9, 0x4a20, 0x4a57
    557	};
    558
    559	dprintk("%s()\n", __func__);
    560
    561	switch (c->delivery_system) {
    562	case SYS_DVBS:
    563		snr_reading = ds3000_readreg(state, 0xff);
    564		snr_reading /= 8;
    565		if (snr_reading == 0)
    566			*snr = 0x0000;
    567		else {
    568			if (snr_reading > 20)
    569				snr_reading = 20;
    570			snr_value = dvbs_snr_tab[snr_reading - 1] * 10 / 23026;
    571			/* cook the value to be suitable for szap-s2
    572			human readable output */
    573			*snr = snr_value * 8 * 655;
    574		}
    575		dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
    576				snr_reading, *snr);
    577		break;
    578	case SYS_DVBS2:
    579		dvbs2_noise_reading = (ds3000_readreg(state, 0x8c) & 0x3f) +
    580				(ds3000_readreg(state, 0x8d) << 4);
    581		dvbs2_signal_reading = ds3000_readreg(state, 0x8e);
    582		tmp = dvbs2_signal_reading * dvbs2_signal_reading >> 1;
    583		if (tmp == 0) {
    584			*snr = 0x0000;
    585			return 0;
    586		}
    587		if (dvbs2_noise_reading == 0) {
    588			snr_value = 0x0013;
    589			/* cook the value to be suitable for szap-s2
    590			human readable output */
    591			*snr = 0xffff;
    592			return 0;
    593		}
    594		if (tmp > dvbs2_noise_reading) {
    595			snr_reading = tmp / dvbs2_noise_reading;
    596			if (snr_reading > 80)
    597				snr_reading = 80;
    598			snr_value = dvbs2_snr_tab[snr_reading - 1] / 1000;
    599			/* cook the value to be suitable for szap-s2
    600			human readable output */
    601			*snr = snr_value * 5 * 655;
    602		} else {
    603			snr_reading = dvbs2_noise_reading / tmp;
    604			if (snr_reading > 80)
    605				snr_reading = 80;
    606			*snr = -(dvbs2_snr_tab[snr_reading - 1] / 1000);
    607		}
    608		dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
    609				snr_reading, *snr);
    610		break;
    611	default:
    612		return -EINVAL;
    613	}
    614
    615	return 0;
    616}
    617
    618/* read DS3000 uncorrected blocks */
    619static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
    620{
    621	struct ds3000_state *state = fe->demodulator_priv;
    622	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    623	u8 data;
    624	u16 _ucblocks;
    625
    626	dprintk("%s()\n", __func__);
    627
    628	switch (c->delivery_system) {
    629	case SYS_DVBS:
    630		*ucblocks = (ds3000_readreg(state, 0xf5) << 8) |
    631				ds3000_readreg(state, 0xf4);
    632		data = ds3000_readreg(state, 0xf8);
    633		/* clear packet counters */
    634		data &= ~0x20;
    635		ds3000_writereg(state, 0xf8, data);
    636		/* enable packet counters */
    637		data |= 0x20;
    638		ds3000_writereg(state, 0xf8, data);
    639		break;
    640	case SYS_DVBS2:
    641		_ucblocks = (ds3000_readreg(state, 0xe2) << 8) |
    642				ds3000_readreg(state, 0xe1);
    643		if (_ucblocks > state->prevUCBS2)
    644			*ucblocks = _ucblocks - state->prevUCBS2;
    645		else
    646			*ucblocks = state->prevUCBS2 - _ucblocks;
    647		state->prevUCBS2 = _ucblocks;
    648		break;
    649	default:
    650		return -EINVAL;
    651	}
    652
    653	return 0;
    654}
    655
    656static int ds3000_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
    657{
    658	struct ds3000_state *state = fe->demodulator_priv;
    659	u8 data;
    660
    661	dprintk("%s(%d)\n", __func__, tone);
    662	if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
    663		printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
    664		return -EINVAL;
    665	}
    666
    667	data = ds3000_readreg(state, 0xa2);
    668	data &= ~0xc0;
    669	ds3000_writereg(state, 0xa2, data);
    670
    671	switch (tone) {
    672	case SEC_TONE_ON:
    673		dprintk("%s: setting tone on\n", __func__);
    674		data = ds3000_readreg(state, 0xa1);
    675		data &= ~0x43;
    676		data |= 0x04;
    677		ds3000_writereg(state, 0xa1, data);
    678		break;
    679	case SEC_TONE_OFF:
    680		dprintk("%s: setting tone off\n", __func__);
    681		data = ds3000_readreg(state, 0xa2);
    682		data |= 0x80;
    683		ds3000_writereg(state, 0xa2, data);
    684		break;
    685	}
    686
    687	return 0;
    688}
    689
    690static int ds3000_send_diseqc_msg(struct dvb_frontend *fe,
    691				struct dvb_diseqc_master_cmd *d)
    692{
    693	struct ds3000_state *state = fe->demodulator_priv;
    694	int i;
    695	u8 data;
    696
    697	/* Dump DiSEqC message */
    698	dprintk("%s(", __func__);
    699	for (i = 0 ; i < d->msg_len;) {
    700		dprintk("0x%02x", d->msg[i]);
    701		if (++i < d->msg_len)
    702			dprintk(", ");
    703	}
    704
    705	/* enable DiSEqC message send pin */
    706	data = ds3000_readreg(state, 0xa2);
    707	data &= ~0xc0;
    708	ds3000_writereg(state, 0xa2, data);
    709
    710	/* DiSEqC message */
    711	for (i = 0; i < d->msg_len; i++)
    712		ds3000_writereg(state, 0xa3 + i, d->msg[i]);
    713
    714	data = ds3000_readreg(state, 0xa1);
    715	/* clear DiSEqC message length and status,
    716	enable DiSEqC message send */
    717	data &= ~0xf8;
    718	/* set DiSEqC mode, modulation active during 33 pulses,
    719	set DiSEqC message length */
    720	data |= ((d->msg_len - 1) << 3) | 0x07;
    721	ds3000_writereg(state, 0xa1, data);
    722
    723	/* wait up to 150ms for DiSEqC transmission to complete */
    724	for (i = 0; i < 15; i++) {
    725		data = ds3000_readreg(state, 0xa1);
    726		if ((data & 0x40) == 0)
    727			break;
    728		msleep(10);
    729	}
    730
    731	/* DiSEqC timeout after 150ms */
    732	if (i == 15) {
    733		data = ds3000_readreg(state, 0xa1);
    734		data &= ~0x80;
    735		data |= 0x40;
    736		ds3000_writereg(state, 0xa1, data);
    737
    738		data = ds3000_readreg(state, 0xa2);
    739		data &= ~0xc0;
    740		data |= 0x80;
    741		ds3000_writereg(state, 0xa2, data);
    742
    743		return -ETIMEDOUT;
    744	}
    745
    746	data = ds3000_readreg(state, 0xa2);
    747	data &= ~0xc0;
    748	data |= 0x80;
    749	ds3000_writereg(state, 0xa2, data);
    750
    751	return 0;
    752}
    753
    754/* Send DiSEqC burst */
    755static int ds3000_diseqc_send_burst(struct dvb_frontend *fe,
    756				    enum fe_sec_mini_cmd burst)
    757{
    758	struct ds3000_state *state = fe->demodulator_priv;
    759	int i;
    760	u8 data;
    761
    762	dprintk("%s()\n", __func__);
    763
    764	data = ds3000_readreg(state, 0xa2);
    765	data &= ~0xc0;
    766	ds3000_writereg(state, 0xa2, data);
    767
    768	/* DiSEqC burst */
    769	if (burst == SEC_MINI_A)
    770		/* Unmodulated tone burst */
    771		ds3000_writereg(state, 0xa1, 0x02);
    772	else if (burst == SEC_MINI_B)
    773		/* Modulated tone burst */
    774		ds3000_writereg(state, 0xa1, 0x01);
    775	else
    776		return -EINVAL;
    777
    778	msleep(13);
    779	for (i = 0; i < 5; i++) {
    780		data = ds3000_readreg(state, 0xa1);
    781		if ((data & 0x40) == 0)
    782			break;
    783		msleep(1);
    784	}
    785
    786	if (i == 5) {
    787		data = ds3000_readreg(state, 0xa1);
    788		data &= ~0x80;
    789		data |= 0x40;
    790		ds3000_writereg(state, 0xa1, data);
    791
    792		data = ds3000_readreg(state, 0xa2);
    793		data &= ~0xc0;
    794		data |= 0x80;
    795		ds3000_writereg(state, 0xa2, data);
    796
    797		return -ETIMEDOUT;
    798	}
    799
    800	data = ds3000_readreg(state, 0xa2);
    801	data &= ~0xc0;
    802	data |= 0x80;
    803	ds3000_writereg(state, 0xa2, data);
    804
    805	return 0;
    806}
    807
    808static void ds3000_release(struct dvb_frontend *fe)
    809{
    810	struct ds3000_state *state = fe->demodulator_priv;
    811
    812	if (state->config->set_lock_led)
    813		state->config->set_lock_led(fe, 0);
    814
    815	dprintk("%s\n", __func__);
    816	kfree(state);
    817}
    818
    819static const struct dvb_frontend_ops ds3000_ops;
    820
    821struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
    822				    struct i2c_adapter *i2c)
    823{
    824	struct ds3000_state *state;
    825	int ret;
    826
    827	dprintk("%s\n", __func__);
    828
    829	/* allocate memory for the internal state */
    830	state = kzalloc(sizeof(*state), GFP_KERNEL);
    831	if (!state)
    832		return NULL;
    833
    834	state->config = config;
    835	state->i2c = i2c;
    836	state->prevUCBS2 = 0;
    837
    838	/* check if the demod is present */
    839	ret = ds3000_readreg(state, 0x00) & 0xfe;
    840	if (ret != 0xe0) {
    841		kfree(state);
    842		printk(KERN_ERR "Invalid probe, probably not a DS3000\n");
    843		return NULL;
    844	}
    845
    846	printk(KERN_INFO "DS3000 chip version: %d.%d attached.\n",
    847			ds3000_readreg(state, 0x02),
    848			ds3000_readreg(state, 0x01));
    849
    850	memcpy(&state->frontend.ops, &ds3000_ops,
    851			sizeof(struct dvb_frontend_ops));
    852	state->frontend.demodulator_priv = state;
    853
    854	/*
    855	 * Some devices like T480 starts with voltage on. Be sure
    856	 * to turn voltage off during init, as this can otherwise
    857	 * interfere with Unicable SCR systems.
    858	 */
    859	ds3000_set_voltage(&state->frontend, SEC_VOLTAGE_OFF);
    860	return &state->frontend;
    861}
    862EXPORT_SYMBOL(ds3000_attach);
    863
    864static int ds3000_set_carrier_offset(struct dvb_frontend *fe,
    865					s32 carrier_offset_khz)
    866{
    867	struct ds3000_state *state = fe->demodulator_priv;
    868	s32 tmp;
    869
    870	tmp = carrier_offset_khz;
    871	tmp *= 65536;
    872	tmp = (2 * tmp + DS3000_SAMPLE_RATE) / (2 * DS3000_SAMPLE_RATE);
    873
    874	if (tmp < 0)
    875		tmp += 65536;
    876
    877	ds3000_writereg(state, 0x5f, tmp >> 8);
    878	ds3000_writereg(state, 0x5e, tmp & 0xff);
    879
    880	return 0;
    881}
    882
    883static int ds3000_set_frontend(struct dvb_frontend *fe)
    884{
    885	struct ds3000_state *state = fe->demodulator_priv;
    886	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    887
    888	int i;
    889	enum fe_status status;
    890	s32 offset_khz;
    891	u32 frequency;
    892	u16 value;
    893
    894	dprintk("%s() ", __func__);
    895
    896	if (state->config->set_ts_params)
    897		state->config->set_ts_params(fe, 0);
    898	/* Tune */
    899	if (fe->ops.tuner_ops.set_params)
    900		fe->ops.tuner_ops.set_params(fe);
    901
    902	/* ds3000 global reset */
    903	ds3000_writereg(state, 0x07, 0x80);
    904	ds3000_writereg(state, 0x07, 0x00);
    905	/* ds3000 built-in uC reset */
    906	ds3000_writereg(state, 0xb2, 0x01);
    907	/* ds3000 software reset */
    908	ds3000_writereg(state, 0x00, 0x01);
    909
    910	switch (c->delivery_system) {
    911	case SYS_DVBS:
    912		/* initialise the demod in DVB-S mode */
    913		for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
    914			ds3000_writereg(state,
    915				ds3000_dvbs_init_tab[i],
    916				ds3000_dvbs_init_tab[i + 1]);
    917		value = ds3000_readreg(state, 0xfe);
    918		value &= 0xc0;
    919		value |= 0x1b;
    920		ds3000_writereg(state, 0xfe, value);
    921		break;
    922	case SYS_DVBS2:
    923		/* initialise the demod in DVB-S2 mode */
    924		for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
    925			ds3000_writereg(state,
    926				ds3000_dvbs2_init_tab[i],
    927				ds3000_dvbs2_init_tab[i + 1]);
    928		if (c->symbol_rate >= 30000000)
    929			ds3000_writereg(state, 0xfe, 0x54);
    930		else
    931			ds3000_writereg(state, 0xfe, 0x98);
    932		break;
    933	default:
    934		return -EINVAL;
    935	}
    936
    937	/* enable 27MHz clock output */
    938	ds3000_writereg(state, 0x29, 0x80);
    939	/* enable ac coupling */
    940	ds3000_writereg(state, 0x25, 0x8a);
    941
    942	if ((c->symbol_rate < ds3000_ops.info.symbol_rate_min) ||
    943			(c->symbol_rate > ds3000_ops.info.symbol_rate_max)) {
    944		dprintk("%s() symbol_rate %u out of range (%u ... %u)\n",
    945				__func__, c->symbol_rate,
    946				ds3000_ops.info.symbol_rate_min,
    947				ds3000_ops.info.symbol_rate_max);
    948		return -EINVAL;
    949	}
    950
    951	/* enhance symbol rate performance */
    952	if ((c->symbol_rate / 1000) <= 5000) {
    953		value = 29777 / (c->symbol_rate / 1000) + 1;
    954		if (value % 2 != 0)
    955			value++;
    956		ds3000_writereg(state, 0xc3, 0x0d);
    957		ds3000_writereg(state, 0xc8, value);
    958		ds3000_writereg(state, 0xc4, 0x10);
    959		ds3000_writereg(state, 0xc7, 0x0e);
    960	} else if ((c->symbol_rate / 1000) <= 10000) {
    961		value = 92166 / (c->symbol_rate / 1000) + 1;
    962		if (value % 2 != 0)
    963			value++;
    964		ds3000_writereg(state, 0xc3, 0x07);
    965		ds3000_writereg(state, 0xc8, value);
    966		ds3000_writereg(state, 0xc4, 0x09);
    967		ds3000_writereg(state, 0xc7, 0x12);
    968	} else if ((c->symbol_rate / 1000) <= 20000) {
    969		value = 64516 / (c->symbol_rate / 1000) + 1;
    970		ds3000_writereg(state, 0xc3, value);
    971		ds3000_writereg(state, 0xc8, 0x0e);
    972		ds3000_writereg(state, 0xc4, 0x07);
    973		ds3000_writereg(state, 0xc7, 0x18);
    974	} else {
    975		value = 129032 / (c->symbol_rate / 1000) + 1;
    976		ds3000_writereg(state, 0xc3, value);
    977		ds3000_writereg(state, 0xc8, 0x0a);
    978		ds3000_writereg(state, 0xc4, 0x05);
    979		ds3000_writereg(state, 0xc7, 0x24);
    980	}
    981
    982	/* normalized symbol rate rounded to the closest integer */
    983	value = (((c->symbol_rate / 1000) << 16) +
    984			(DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
    985	ds3000_writereg(state, 0x61, value & 0x00ff);
    986	ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
    987
    988	/* co-channel interference cancellation disabled */
    989	ds3000_writereg(state, 0x56, 0x00);
    990
    991	/* equalizer disabled */
    992	ds3000_writereg(state, 0x76, 0x00);
    993
    994	/*ds3000_writereg(state, 0x08, 0x03);
    995	ds3000_writereg(state, 0xfd, 0x22);
    996	ds3000_writereg(state, 0x08, 0x07);
    997	ds3000_writereg(state, 0xfd, 0x42);
    998	ds3000_writereg(state, 0x08, 0x07);*/
    999
   1000	if (state->config->ci_mode) {
   1001		switch (c->delivery_system) {
   1002		case SYS_DVBS:
   1003		default:
   1004			ds3000_writereg(state, 0xfd, 0x80);
   1005		break;
   1006		case SYS_DVBS2:
   1007			ds3000_writereg(state, 0xfd, 0x01);
   1008			break;
   1009		}
   1010	}
   1011
   1012	/* ds3000 out of software reset */
   1013	ds3000_writereg(state, 0x00, 0x00);
   1014	/* start ds3000 built-in uC */
   1015	ds3000_writereg(state, 0xb2, 0x00);
   1016
   1017	if (fe->ops.tuner_ops.get_frequency) {
   1018		fe->ops.tuner_ops.get_frequency(fe, &frequency);
   1019		offset_khz = frequency - c->frequency;
   1020		ds3000_set_carrier_offset(fe, offset_khz);
   1021	}
   1022
   1023	for (i = 0; i < 30 ; i++) {
   1024		ds3000_read_status(fe, &status);
   1025		if (status & FE_HAS_LOCK)
   1026			break;
   1027
   1028		msleep(10);
   1029	}
   1030
   1031	return 0;
   1032}
   1033
   1034static int ds3000_tune(struct dvb_frontend *fe,
   1035			bool re_tune,
   1036			unsigned int mode_flags,
   1037			unsigned int *delay,
   1038			enum fe_status *status)
   1039{
   1040	if (re_tune) {
   1041		int ret = ds3000_set_frontend(fe);
   1042		if (ret)
   1043			return ret;
   1044	}
   1045
   1046	*delay = HZ / 5;
   1047
   1048	return ds3000_read_status(fe, status);
   1049}
   1050
   1051static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
   1052{
   1053	struct ds3000_state *state = fe->demodulator_priv;
   1054
   1055	if (state->config->set_lock_led)
   1056		state->config->set_lock_led(fe, 0);
   1057
   1058	dprintk("%s()\n", __func__);
   1059	return DVBFE_ALGO_HW;
   1060}
   1061
   1062/*
   1063 * Initialise or wake up device
   1064 *
   1065 * Power config will reset and load initial firmware if required
   1066 */
   1067static int ds3000_initfe(struct dvb_frontend *fe)
   1068{
   1069	struct ds3000_state *state = fe->demodulator_priv;
   1070	int ret;
   1071
   1072	dprintk("%s()\n", __func__);
   1073	/* hard reset */
   1074	ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08));
   1075	msleep(1);
   1076
   1077	/* Load the firmware if required */
   1078	ret = ds3000_firmware_ondemand(fe);
   1079	if (ret != 0) {
   1080		printk(KERN_ERR "%s: Unable initialize firmware\n", __func__);
   1081		return ret;
   1082	}
   1083
   1084	return 0;
   1085}
   1086
   1087static const struct dvb_frontend_ops ds3000_ops = {
   1088	.delsys = { SYS_DVBS, SYS_DVBS2 },
   1089	.info = {
   1090		.name = "Montage Technology DS3000",
   1091		.frequency_min_hz =  950 * MHz,
   1092		.frequency_max_hz = 2150 * MHz,
   1093		.frequency_stepsize_hz = 1011 * kHz,
   1094		.frequency_tolerance_hz = 5 * MHz,
   1095		.symbol_rate_min = 1000000,
   1096		.symbol_rate_max = 45000000,
   1097		.caps = FE_CAN_INVERSION_AUTO |
   1098			FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
   1099			FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
   1100			FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
   1101			FE_CAN_2G_MODULATION |
   1102			FE_CAN_QPSK | FE_CAN_RECOVER
   1103	},
   1104
   1105	.release = ds3000_release,
   1106
   1107	.init = ds3000_initfe,
   1108	.i2c_gate_ctrl = ds3000_i2c_gate_ctrl,
   1109	.read_status = ds3000_read_status,
   1110	.read_ber = ds3000_read_ber,
   1111	.read_signal_strength = ds3000_read_signal_strength,
   1112	.read_snr = ds3000_read_snr,
   1113	.read_ucblocks = ds3000_read_ucblocks,
   1114	.set_voltage = ds3000_set_voltage,
   1115	.set_tone = ds3000_set_tone,
   1116	.diseqc_send_master_cmd = ds3000_send_diseqc_msg,
   1117	.diseqc_send_burst = ds3000_diseqc_send_burst,
   1118	.get_frontend_algo = ds3000_get_algo,
   1119
   1120	.set_frontend = ds3000_set_frontend,
   1121	.tune = ds3000_tune,
   1122};
   1123
   1124module_param(debug, int, 0644);
   1125MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
   1126
   1127MODULE_DESCRIPTION("DVB Frontend module for Montage Technology DS3000 hardware");
   1128MODULE_AUTHOR("Konstantin Dimitrov <kosio.dimitrov@gmail.com>");
   1129MODULE_LICENSE("GPL");
   1130MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE);