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

dvb-bt8xx.c (27187B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Bt8xx based DVB adapter driver
      4 *
      5 * Copyright (C) 2002,2003 Florian Schirmer <jolt@tuxbox.org>
      6 */
      7
      8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      9
     10#include <linux/bitops.h>
     11#include <linux/module.h>
     12#include <linux/init.h>
     13#include <linux/kernel.h>
     14#include <linux/device.h>
     15#include <linux/delay.h>
     16#include <linux/slab.h>
     17#include <linux/i2c.h>
     18
     19#include <media/dmxdev.h>
     20#include <media/dvbdev.h>
     21#include <media/dvb_demux.h>
     22#include <media/dvb_frontend.h>
     23#include "dvb-bt8xx.h"
     24#include "bt878.h"
     25
     26static int debug;
     27
     28module_param(debug, int, 0644);
     29MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
     30
     31DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
     32
     33#define dprintk(fmt, arg...) do {				\
     34	if (debug)						\
     35		printk(KERN_DEBUG pr_fmt("%s: " fmt),		\
     36		       __func__, ##arg);			\
     37} while (0)
     38
     39
     40#define IF_FREQUENCYx6 217    /* 6 * 36.16666666667MHz */
     41
     42static void dvb_bt8xx_task(struct tasklet_struct *t)
     43{
     44	struct bt878 *bt = from_tasklet(bt, t, tasklet);
     45	struct dvb_bt8xx_card *card = dev_get_drvdata(&bt->adapter->dev);
     46
     47	dprintk("%d\n", card->bt->finished_block);
     48
     49	while (card->bt->last_block != card->bt->finished_block) {
     50		(card->bt->TS_Size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)
     51			(&card->demux,
     52			 &card->bt->buf_cpu[card->bt->last_block *
     53					    card->bt->block_bytes],
     54			 card->bt->block_bytes);
     55		card->bt->last_block = (card->bt->last_block + 1) %
     56					card->bt->block_count;
     57	}
     58}
     59
     60static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
     61{
     62	struct dvb_demux*dvbdmx = dvbdmxfeed->demux;
     63	struct dvb_bt8xx_card *card = dvbdmx->priv;
     64	int rc;
     65
     66	dprintk("dvb_bt8xx: start_feed\n");
     67
     68	if (!dvbdmx->dmx.frontend)
     69		return -EINVAL;
     70
     71	mutex_lock(&card->lock);
     72	card->nfeeds++;
     73	rc = card->nfeeds;
     74	if (card->nfeeds == 1)
     75		bt878_start(card->bt, card->gpio_mode,
     76			    card->op_sync_orin, card->irq_err_ignore);
     77	mutex_unlock(&card->lock);
     78	return rc;
     79}
     80
     81static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
     82{
     83	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
     84	struct dvb_bt8xx_card *card = dvbdmx->priv;
     85
     86	dprintk("dvb_bt8xx: stop_feed\n");
     87
     88	if (!dvbdmx->dmx.frontend)
     89		return -EINVAL;
     90
     91	mutex_lock(&card->lock);
     92	card->nfeeds--;
     93	if (card->nfeeds == 0)
     94		bt878_stop(card->bt);
     95	mutex_unlock(&card->lock);
     96
     97	return 0;
     98}
     99
    100static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev)
    101{
    102	if ((adev->subsystem_vendor == bdev->subsystem_vendor) &&
    103		(adev->subsystem_device == bdev->subsystem_device) &&
    104		(adev->bus->number == bdev->bus->number) &&
    105		(PCI_SLOT(adev->devfn) == PCI_SLOT(bdev->devfn)))
    106		return 1;
    107	return 0;
    108}
    109
    110static struct bt878 *dvb_bt8xx_878_match(unsigned int bttv_nr,
    111					 struct pci_dev* bttv_pci_dev)
    112{
    113	unsigned int card_nr;
    114
    115	/* Hmm, n squared. Hope n is small */
    116	for (card_nr = 0; card_nr < bt878_num; card_nr++)
    117		if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev))
    118			return &bt878[card_nr];
    119	return NULL;
    120}
    121
    122static int thomson_dtt7579_demod_init(struct dvb_frontend* fe)
    123{
    124	static u8 mt352_clock_config [] = { 0x89, 0x38, 0x38 };
    125	static u8 mt352_reset [] = { 0x50, 0x80 };
    126	static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
    127	static u8 mt352_agc_cfg [] = { 0x67, 0x28, 0x20 };
    128	static u8 mt352_gpp_ctl_cfg [] = { 0x8C, 0x33 };
    129	static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
    130
    131	mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
    132	udelay(2000);
    133	mt352_write(fe, mt352_reset, sizeof(mt352_reset));
    134	mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
    135
    136	mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
    137	mt352_write(fe, mt352_gpp_ctl_cfg, sizeof(mt352_gpp_ctl_cfg));
    138	mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
    139
    140	return 0;
    141}
    142
    143static int thomson_dtt7579_tuner_calc_regs(struct dvb_frontend *fe, u8* pllbuf, int buf_len)
    144{
    145	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    146	u32 div;
    147	unsigned char bs = 0;
    148	unsigned char cp = 0;
    149
    150	if (buf_len < 5)
    151		return -EINVAL;
    152
    153	div = (((c->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
    154
    155	if (c->frequency < 542000000)
    156		cp = 0xb4;
    157	else if (c->frequency < 771000000)
    158		cp = 0xbc;
    159	else
    160		cp = 0xf4;
    161
    162	if (c->frequency == 0)
    163		bs = 0x03;
    164	else if (c->frequency < 443250000)
    165		bs = 0x02;
    166	else
    167		bs = 0x08;
    168
    169	pllbuf[0] = 0x60;
    170	pllbuf[1] = div >> 8;
    171	pllbuf[2] = div & 0xff;
    172	pllbuf[3] = cp;
    173	pllbuf[4] = bs;
    174
    175	return 5;
    176}
    177
    178static struct mt352_config thomson_dtt7579_config = {
    179	.demod_address = 0x0f,
    180	.demod_init = thomson_dtt7579_demod_init,
    181};
    182
    183static struct zl10353_config thomson_dtt7579_zl10353_config = {
    184	.demod_address = 0x0f,
    185};
    186
    187static int cx24108_tuner_set_params(struct dvb_frontend *fe)
    188{
    189	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    190	u32 freq = c->frequency;
    191	int i, a, n, pump;
    192	u32 band, pll;
    193	u32 osci[]={950000,1019000,1075000,1178000,1296000,1432000,
    194		1576000,1718000,1856000,2036000,2150000};
    195	u32 bandsel[]={0,0x00020000,0x00040000,0x00100800,0x00101000,
    196		0x00102000,0x00104000,0x00108000,0x00110000,
    197		0x00120000,0x00140000};
    198
    199	#define XTAL 1011100 /* Hz, really 1.0111 MHz and a /10 prescaler */
    200	dprintk("cx24108 debug: entering SetTunerFreq, freq=%d\n", freq);
    201
    202	/* This is really the bit driving the tuner chip cx24108 */
    203
    204	if (freq<950000)
    205		freq = 950000; /* kHz */
    206	else if (freq>2150000)
    207		freq = 2150000; /* satellite IF is 950..2150MHz */
    208
    209	/* decide which VCO to use for the input frequency */
    210	for(i = 1; (i < ARRAY_SIZE(osci) - 1) && (osci[i] < freq); i++);
    211	dprintk("cx24108 debug: select vco #%d (f=%d)\n", i, freq);
    212	band=bandsel[i];
    213	/* the gain values must be set by SetSymbolrate */
    214	/* compute the pll divider needed, from Conexant data sheet,
    215	   resolved for (n*32+a), remember f(vco) is f(receive) *2 or *4,
    216	   depending on the divider bit. It is set to /4 on the 2 lowest
    217	   bands  */
    218	n=((i<=2?2:1)*freq*10L)/(XTAL/100);
    219	a=n%32; n/=32; if(a==0) n--;
    220	pump=(freq<(osci[i-1]+osci[i])/2);
    221	pll=0xf8000000|
    222	    ((pump?1:2)<<(14+11))|
    223	    ((n&0x1ff)<<(5+11))|
    224	    ((a&0x1f)<<11);
    225	/* everything is shifted left 11 bits to left-align the bits in the
    226	   32bit word. Output to the tuner goes MSB-aligned, after all */
    227	dprintk("cx24108 debug: pump=%d, n=%d, a=%d\n", pump, n, a);
    228	cx24110_pll_write(fe,band);
    229	/* set vga and vca to their widest-band settings, as a precaution.
    230	   SetSymbolrate might not be called to set this up */
    231	cx24110_pll_write(fe,0x500c0000);
    232	cx24110_pll_write(fe,0x83f1f800);
    233	cx24110_pll_write(fe,pll);
    234	//writereg(client,0x56,0x7f);
    235
    236	return 0;
    237}
    238
    239static int pinnsat_tuner_init(struct dvb_frontend* fe)
    240{
    241	struct dvb_bt8xx_card *card = fe->dvb->priv;
    242
    243	bttv_gpio_enable(card->bttv_nr, 1, 1);  /* output */
    244	bttv_write_gpio(card->bttv_nr, 1, 1);   /* relay on */
    245
    246	return 0;
    247}
    248
    249static int pinnsat_tuner_sleep(struct dvb_frontend* fe)
    250{
    251	struct dvb_bt8xx_card *card = fe->dvb->priv;
    252
    253	bttv_write_gpio(card->bttv_nr, 1, 0);   /* relay off */
    254
    255	return 0;
    256}
    257
    258static struct cx24110_config pctvsat_config = {
    259	.demod_address = 0x55,
    260};
    261
    262static int microtune_mt7202dtf_tuner_set_params(struct dvb_frontend *fe)
    263{
    264	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    265	struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
    266	u8 cfg, cpump, band_select;
    267	u8 data[4];
    268	u32 div;
    269	struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = data, .len = sizeof(data) };
    270
    271	div = (36000000 + c->frequency + 83333) / 166666;
    272	cfg = 0x88;
    273
    274	if (c->frequency < 175000000)
    275		cpump = 2;
    276	else if (c->frequency < 390000000)
    277		cpump = 1;
    278	else if (c->frequency < 470000000)
    279		cpump = 2;
    280	else if (c->frequency < 750000000)
    281		cpump = 2;
    282	else
    283		cpump = 3;
    284
    285	if (c->frequency < 175000000)
    286		band_select = 0x0e;
    287	else if (c->frequency < 470000000)
    288		band_select = 0x05;
    289	else
    290		band_select = 0x03;
    291
    292	data[0] = (div >> 8) & 0x7f;
    293	data[1] = div & 0xff;
    294	data[2] = ((div >> 10) & 0x60) | cfg;
    295	data[3] = (cpump << 6) | band_select;
    296
    297	if (fe->ops.i2c_gate_ctrl)
    298		fe->ops.i2c_gate_ctrl(fe, 1);
    299	i2c_transfer(card->i2c_adapter, &msg, 1);
    300	return (div * 166666 - 36000000);
    301}
    302
    303static int microtune_mt7202dtf_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
    304{
    305	struct dvb_bt8xx_card* bt = (struct dvb_bt8xx_card*) fe->dvb->priv;
    306
    307	return request_firmware(fw, name, &bt->bt->dev->dev);
    308}
    309
    310static const struct sp887x_config microtune_mt7202dtf_config = {
    311	.demod_address = 0x70,
    312	.request_firmware = microtune_mt7202dtf_request_firmware,
    313};
    314
    315static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
    316{
    317	static u8 mt352_clock_config [] = { 0x89, 0x38, 0x2d };
    318	static u8 mt352_reset [] = { 0x50, 0x80 };
    319	static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
    320	static u8 mt352_agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
    321				       0x00, 0xFF, 0x00, 0x40, 0x40 };
    322	static u8 mt352_av771_extra[] = { 0xB5, 0x7A };
    323	static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
    324
    325	mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
    326	udelay(2000);
    327	mt352_write(fe, mt352_reset, sizeof(mt352_reset));
    328	mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
    329
    330	mt352_write(fe, mt352_agc_cfg,sizeof(mt352_agc_cfg));
    331	udelay(2000);
    332	mt352_write(fe, mt352_av771_extra,sizeof(mt352_av771_extra));
    333	mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
    334
    335	return 0;
    336}
    337
    338static int advbt771_samsung_tdtc9251dh0_tuner_calc_regs(struct dvb_frontend *fe, u8 *pllbuf, int buf_len)
    339{
    340	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    341	u32 div;
    342	unsigned char bs = 0;
    343	unsigned char cp = 0;
    344
    345	if (buf_len < 5) return -EINVAL;
    346
    347	div = (((c->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
    348
    349	if (c->frequency < 150000000)
    350		cp = 0xB4;
    351	else if (c->frequency < 173000000)
    352		cp = 0xBC;
    353	else if (c->frequency < 250000000)
    354		cp = 0xB4;
    355	else if (c->frequency < 400000000)
    356		cp = 0xBC;
    357	else if (c->frequency < 420000000)
    358		cp = 0xF4;
    359	else if (c->frequency < 470000000)
    360		cp = 0xFC;
    361	else if (c->frequency < 600000000)
    362		cp = 0xBC;
    363	else if (c->frequency < 730000000)
    364		cp = 0xF4;
    365	else
    366		cp = 0xFC;
    367
    368	if (c->frequency < 150000000)
    369		bs = 0x01;
    370	else if (c->frequency < 173000000)
    371		bs = 0x01;
    372	else if (c->frequency < 250000000)
    373		bs = 0x02;
    374	else if (c->frequency < 400000000)
    375		bs = 0x02;
    376	else if (c->frequency < 420000000)
    377		bs = 0x02;
    378	else if (c->frequency < 470000000)
    379		bs = 0x02;
    380	else
    381		bs = 0x08;
    382
    383	pllbuf[0] = 0x61;
    384	pllbuf[1] = div >> 8;
    385	pllbuf[2] = div & 0xff;
    386	pllbuf[3] = cp;
    387	pllbuf[4] = bs;
    388
    389	return 5;
    390}
    391
    392static struct mt352_config advbt771_samsung_tdtc9251dh0_config = {
    393	.demod_address = 0x0f,
    394	.demod_init = advbt771_samsung_tdtc9251dh0_demod_init,
    395};
    396
    397static const struct dst_config dst_config = {
    398	.demod_address = 0x55,
    399};
    400
    401static int or51211_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
    402{
    403	struct dvb_bt8xx_card* bt = (struct dvb_bt8xx_card*) fe->dvb->priv;
    404
    405	return request_firmware(fw, name, &bt->bt->dev->dev);
    406}
    407
    408static void or51211_setmode(struct dvb_frontend * fe, int mode)
    409{
    410	struct dvb_bt8xx_card *bt = fe->dvb->priv;
    411	bttv_write_gpio(bt->bttv_nr, 0x0002, mode);   /* Reset */
    412	msleep(20);
    413}
    414
    415static void or51211_reset(struct dvb_frontend * fe)
    416{
    417	struct dvb_bt8xx_card *bt = fe->dvb->priv;
    418
    419	/* RESET DEVICE
    420	 * reset is controlled by GPIO-0
    421	 * when set to 0 causes reset and when to 1 for normal op
    422	 * must remain reset for 128 clock cycles on a 50Mhz clock
    423	 * also PRM1 PRM2 & PRM4 are controlled by GPIO-1,GPIO-2 & GPIO-4
    424	 * We assume that the reset has be held low long enough or we
    425	 * have been reset by a power on.  When the driver is unloaded
    426	 * reset set to 0 so if reloaded we have been reset.
    427	 */
    428	/* reset & PRM1,2&4 are outputs */
    429	int ret = bttv_gpio_enable(bt->bttv_nr, 0x001F, 0x001F);
    430	if (ret != 0)
    431		pr_warn("or51211: Init Error - Can't Reset DVR (%i)\n", ret);
    432	bttv_write_gpio(bt->bttv_nr, 0x001F, 0x0000);   /* Reset */
    433	msleep(20);
    434	/* Now set for normal operation */
    435	bttv_write_gpio(bt->bttv_nr, 0x0001F, 0x0001);
    436	/* wait for operation to begin */
    437	msleep(500);
    438}
    439
    440static void or51211_sleep(struct dvb_frontend * fe)
    441{
    442	struct dvb_bt8xx_card *bt = fe->dvb->priv;
    443	bttv_write_gpio(bt->bttv_nr, 0x0001, 0x0000);
    444}
    445
    446static const struct or51211_config or51211_config = {
    447	.demod_address = 0x15,
    448	.request_firmware = or51211_request_firmware,
    449	.setmode = or51211_setmode,
    450	.reset = or51211_reset,
    451	.sleep = or51211_sleep,
    452};
    453
    454static int vp3021_alps_tded4_tuner_set_params(struct dvb_frontend *fe)
    455{
    456	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    457	struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
    458	u8 buf[4];
    459	u32 div;
    460	struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = buf, .len = sizeof(buf) };
    461
    462	div = (c->frequency + 36166667) / 166667;
    463
    464	buf[0] = (div >> 8) & 0x7F;
    465	buf[1] = div & 0xFF;
    466	buf[2] = 0x85;
    467	if ((c->frequency >= 47000000) && (c->frequency < 153000000))
    468		buf[3] = 0x01;
    469	else if ((c->frequency >= 153000000) && (c->frequency < 430000000))
    470		buf[3] = 0x02;
    471	else if ((c->frequency >= 430000000) && (c->frequency < 824000000))
    472		buf[3] = 0x0C;
    473	else if ((c->frequency >= 824000000) && (c->frequency < 863000000))
    474		buf[3] = 0x8C;
    475	else
    476		return -EINVAL;
    477
    478	if (fe->ops.i2c_gate_ctrl)
    479		fe->ops.i2c_gate_ctrl(fe, 1);
    480	i2c_transfer(card->i2c_adapter, &msg, 1);
    481	return 0;
    482}
    483
    484static struct nxt6000_config vp3021_alps_tded4_config = {
    485	.demod_address = 0x0a,
    486	.clock_inversion = 1,
    487};
    488
    489static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe)
    490{
    491	static u8 mt352_clock_config [] = { 0x89, 0x38, 0x2d };
    492	static u8 mt352_reset [] = { 0x50, 0x80 };
    493	static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
    494	static u8 mt352_agc_cfg [] = { 0x67, 0x20, 0xa0 };
    495	static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
    496
    497	mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
    498	udelay(2000);
    499	mt352_write(fe, mt352_reset, sizeof(mt352_reset));
    500	mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
    501	mt352_write(fe, mt352_agc_cfg,sizeof(mt352_agc_cfg));
    502	mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
    503
    504	return 0;
    505}
    506
    507static int digitv_alps_tded4_tuner_calc_regs(struct dvb_frontend *fe,  u8 *pllbuf, int buf_len)
    508{
    509	u32 div;
    510	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
    511
    512	if (buf_len < 5)
    513		return -EINVAL;
    514
    515	div = (((c->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
    516
    517	pllbuf[0] = 0x61;
    518	pllbuf[1] = (div >> 8) & 0x7F;
    519	pllbuf[2] = div & 0xFF;
    520	pllbuf[3] = 0x85;
    521
    522	dprintk("frequency %u, div %u\n", c->frequency, div);
    523
    524	if (c->frequency < 470000000)
    525		pllbuf[4] = 0x02;
    526	else if (c->frequency > 823000000)
    527		pllbuf[4] = 0x88;
    528	else
    529		pllbuf[4] = 0x08;
    530
    531	if (c->bandwidth_hz == 8000000)
    532		pllbuf[4] |= 0x04;
    533
    534	return 5;
    535}
    536
    537static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt)
    538{
    539	/*
    540	 * Reset the frontend, must be called before trying
    541	 * to initialise the MT352 or mt352_attach
    542	 * will fail. Same goes for the nxt6000 frontend.
    543	 *
    544	 */
    545
    546	int ret = bttv_gpio_enable(bt->bttv_nr, 0x08, 0x08);
    547	if (ret != 0)
    548		pr_warn("digitv_alps_tded4: Init Error - Can't Reset DVR (%i)\n",
    549			ret);
    550
    551	/* Pulse the reset line */
    552	bttv_write_gpio(bt->bttv_nr, 0x08, 0x08); /* High */
    553	bttv_write_gpio(bt->bttv_nr, 0x08, 0x00); /* Low  */
    554	msleep(100);
    555
    556	bttv_write_gpio(bt->bttv_nr, 0x08, 0x08); /* High */
    557}
    558
    559static struct mt352_config digitv_alps_tded4_config = {
    560	.demod_address = 0x0a,
    561	.demod_init = digitv_alps_tded4_demod_init,
    562};
    563
    564static struct lgdt330x_config tdvs_tua6034_config = {
    565	.demod_chip       = LGDT3303,
    566	.serial_mpeg      = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
    567};
    568
    569static void lgdt330x_reset(struct dvb_bt8xx_card *bt)
    570{
    571	/* Set pin 27 of the lgdt3303 chip high to reset the frontend */
    572
    573	/* Pulse the reset line */
    574	bttv_write_gpio(bt->bttv_nr, 0x00e00007, 0x00000001); /* High */
    575	bttv_write_gpio(bt->bttv_nr, 0x00e00007, 0x00000000); /* Low  */
    576	msleep(100);
    577
    578	bttv_write_gpio(bt->bttv_nr, 0x00e00007, 0x00000001); /* High */
    579	msleep(100);
    580}
    581
    582static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
    583{
    584	struct dst_state* state = NULL;
    585
    586	switch(type) {
    587	case BTTV_BOARD_DVICO_DVBT_LITE:
    588		card->fe = dvb_attach(mt352_attach, &thomson_dtt7579_config, card->i2c_adapter);
    589
    590		if (card->fe == NULL)
    591			card->fe = dvb_attach(zl10353_attach, &thomson_dtt7579_zl10353_config,
    592						  card->i2c_adapter);
    593
    594		if (card->fe != NULL) {
    595			card->fe->ops.tuner_ops.calc_regs = thomson_dtt7579_tuner_calc_regs;
    596			card->fe->ops.info.frequency_min_hz = 174 * MHz;
    597			card->fe->ops.info.frequency_max_hz = 862 * MHz;
    598		}
    599		break;
    600
    601	case BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE:
    602		lgdt330x_reset(card);
    603		card->fe = dvb_attach(lgdt330x_attach, &tdvs_tua6034_config,
    604				      0x0e, card->i2c_adapter);
    605		if (card->fe != NULL) {
    606			dvb_attach(simple_tuner_attach, card->fe,
    607				   card->i2c_adapter, 0x61,
    608				   TUNER_LG_TDVS_H06XF);
    609			dprintk("dvb_bt8xx: lgdt330x detected\n");
    610		}
    611		break;
    612
    613	case BTTV_BOARD_NEBULA_DIGITV:
    614		/*
    615		 * It is possible to determine the correct frontend using the I2C bus (see the Nebula SDK);
    616		 * this would be a cleaner solution than trying each frontend in turn.
    617		 */
    618
    619		/* Old Nebula (marked (c)2003 on high profile pci card) has nxt6000 demod */
    620		digitv_alps_tded4_reset(card);
    621		card->fe = dvb_attach(nxt6000_attach, &vp3021_alps_tded4_config, card->i2c_adapter);
    622		if (card->fe != NULL) {
    623			card->fe->ops.tuner_ops.set_params = vp3021_alps_tded4_tuner_set_params;
    624			dprintk("dvb_bt8xx: an nxt6000 was detected on your digitv card\n");
    625			break;
    626		}
    627
    628		/* New Nebula (marked (c)2005 on low profile pci card) has mt352 demod */
    629		digitv_alps_tded4_reset(card);
    630		card->fe = dvb_attach(mt352_attach, &digitv_alps_tded4_config, card->i2c_adapter);
    631
    632		if (card->fe != NULL) {
    633			card->fe->ops.tuner_ops.calc_regs = digitv_alps_tded4_tuner_calc_regs;
    634			dprintk("dvb_bt8xx: an mt352 was detected on your digitv card\n");
    635		}
    636		break;
    637
    638	case BTTV_BOARD_AVDVBT_761:
    639		card->fe = dvb_attach(sp887x_attach, &microtune_mt7202dtf_config, card->i2c_adapter);
    640		if (card->fe) {
    641			card->fe->ops.tuner_ops.set_params = microtune_mt7202dtf_tuner_set_params;
    642		}
    643		break;
    644
    645	case BTTV_BOARD_AVDVBT_771:
    646		card->fe = dvb_attach(mt352_attach, &advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter);
    647		if (card->fe != NULL) {
    648			card->fe->ops.tuner_ops.calc_regs = advbt771_samsung_tdtc9251dh0_tuner_calc_regs;
    649			card->fe->ops.info.frequency_min_hz = 174 * MHz;
    650			card->fe->ops.info.frequency_max_hz = 862 * MHz;
    651		}
    652		break;
    653
    654	case BTTV_BOARD_TWINHAN_DST:
    655		/*	DST is not a frontend driver !!!		*/
    656		state = kmalloc(sizeof (struct dst_state), GFP_KERNEL);
    657		if (!state) {
    658			pr_err("No memory\n");
    659			break;
    660		}
    661		/*	Setup the Card					*/
    662		state->config = &dst_config;
    663		state->i2c = card->i2c_adapter;
    664		state->bt = card->bt;
    665		state->dst_ca = NULL;
    666		/*	DST is not a frontend, attaching the ASIC	*/
    667		if (dvb_attach(dst_attach, state, &card->dvb_adapter) == NULL) {
    668			pr_err("%s: Could not find a Twinhan DST\n", __func__);
    669			kfree(state);
    670			break;
    671		}
    672		/*	Attach other DST peripherals if any		*/
    673		/*	Conditional Access device			*/
    674		card->fe = &state->frontend;
    675		if (state->dst_hw_cap & DST_TYPE_HAS_CA)
    676			dvb_attach(dst_ca_attach, state, &card->dvb_adapter);
    677		break;
    678
    679	case BTTV_BOARD_PINNACLESAT:
    680		card->fe = dvb_attach(cx24110_attach, &pctvsat_config, card->i2c_adapter);
    681		if (card->fe) {
    682			card->fe->ops.tuner_ops.init = pinnsat_tuner_init;
    683			card->fe->ops.tuner_ops.sleep = pinnsat_tuner_sleep;
    684			card->fe->ops.tuner_ops.set_params = cx24108_tuner_set_params;
    685		}
    686		break;
    687
    688	case BTTV_BOARD_PC_HDTV:
    689		card->fe = dvb_attach(or51211_attach, &or51211_config, card->i2c_adapter);
    690		if (card->fe != NULL)
    691			dvb_attach(simple_tuner_attach, card->fe,
    692				   card->i2c_adapter, 0x61,
    693				   TUNER_PHILIPS_FCV1236D);
    694		break;
    695	}
    696
    697	if (card->fe == NULL)
    698		pr_err("A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
    699		       card->bt->dev->vendor,
    700		       card->bt->dev->device,
    701		       card->bt->dev->subsystem_vendor,
    702		       card->bt->dev->subsystem_device);
    703	else
    704		if (dvb_register_frontend(&card->dvb_adapter, card->fe)) {
    705			pr_err("Frontend registration failed!\n");
    706			dvb_frontend_detach(card->fe);
    707			card->fe = NULL;
    708		}
    709}
    710
    711static int dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
    712{
    713	int result;
    714
    715	result = dvb_register_adapter(&card->dvb_adapter, card->card_name,
    716				      THIS_MODULE, &card->bt->dev->dev,
    717				      adapter_nr);
    718	if (result < 0) {
    719		pr_err("dvb_register_adapter failed (errno = %d)\n", result);
    720		return result;
    721	}
    722	card->dvb_adapter.priv = card;
    723
    724	card->bt->adapter = card->i2c_adapter;
    725
    726	memset(&card->demux, 0, sizeof(struct dvb_demux));
    727
    728	card->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING;
    729
    730	card->demux.priv = card;
    731	card->demux.filternum = 256;
    732	card->demux.feednum = 256;
    733	card->demux.start_feed = dvb_bt8xx_start_feed;
    734	card->demux.stop_feed = dvb_bt8xx_stop_feed;
    735	card->demux.write_to_decoder = NULL;
    736
    737	result = dvb_dmx_init(&card->demux);
    738	if (result < 0) {
    739		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
    740		goto err_unregister_adaptor;
    741	}
    742
    743	card->dmxdev.filternum = 256;
    744	card->dmxdev.demux = &card->demux.dmx;
    745	card->dmxdev.capabilities = 0;
    746
    747	result = dvb_dmxdev_init(&card->dmxdev, &card->dvb_adapter);
    748	if (result < 0) {
    749		pr_err("dvb_dmxdev_init failed (errno = %d)\n", result);
    750		goto err_dmx_release;
    751	}
    752
    753	card->fe_hw.source = DMX_FRONTEND_0;
    754
    755	result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_hw);
    756	if (result < 0) {
    757		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
    758		goto err_dmxdev_release;
    759	}
    760
    761	card->fe_mem.source = DMX_MEMORY_FE;
    762
    763	result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_mem);
    764	if (result < 0) {
    765		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
    766		goto err_remove_hw_frontend;
    767	}
    768
    769	result = card->demux.dmx.connect_frontend(&card->demux.dmx, &card->fe_hw);
    770	if (result < 0) {
    771		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
    772		goto err_remove_mem_frontend;
    773	}
    774
    775	result = dvb_net_init(&card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
    776	if (result < 0) {
    777		pr_err("dvb_net_init failed (errno = %d)\n", result);
    778		goto err_disconnect_frontend;
    779	}
    780
    781	tasklet_setup(&card->bt->tasklet, dvb_bt8xx_task);
    782
    783	frontend_init(card, type);
    784
    785	return 0;
    786
    787err_disconnect_frontend:
    788	card->demux.dmx.disconnect_frontend(&card->demux.dmx);
    789err_remove_mem_frontend:
    790	card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
    791err_remove_hw_frontend:
    792	card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
    793err_dmxdev_release:
    794	dvb_dmxdev_release(&card->dmxdev);
    795err_dmx_release:
    796	dvb_dmx_release(&card->demux);
    797err_unregister_adaptor:
    798	dvb_unregister_adapter(&card->dvb_adapter);
    799	return result;
    800}
    801
    802static int dvb_bt8xx_probe(struct bttv_sub_device *sub)
    803{
    804	struct dvb_bt8xx_card *card;
    805	struct pci_dev* bttv_pci_dev;
    806	int ret;
    807
    808	if (!(card = kzalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL)))
    809		return -ENOMEM;
    810
    811	mutex_init(&card->lock);
    812	card->bttv_nr = sub->core->nr;
    813	strscpy(card->card_name, sub->core->v4l2_dev.name,
    814		sizeof(card->card_name));
    815	card->i2c_adapter = &sub->core->i2c_adap;
    816
    817	switch(sub->core->type) {
    818	case BTTV_BOARD_PINNACLESAT:
    819		card->gpio_mode = 0x0400c060;
    820		/* should be: BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR,
    821			      BT878_DA_IOM=1,BT878_DA_APP to enable serial highspeed mode. */
    822		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    823		card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
    824		break;
    825
    826	case BTTV_BOARD_DVICO_DVBT_LITE:
    827		card->gpio_mode = 0x0400C060;
    828		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    829		card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
    830		/* 26, 15, 14, 6, 5
    831		 * A_PWRDN  DA_DPM DA_SBR DA_IOM_DA
    832		 * DA_APP(parallel) */
    833		break;
    834
    835	case BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE:
    836		card->gpio_mode = 0x0400c060;
    837		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    838		card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
    839		break;
    840
    841	case BTTV_BOARD_NEBULA_DIGITV:
    842	case BTTV_BOARD_AVDVBT_761:
    843		card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5);
    844		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    845		card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
    846		/* A_PWRDN DA_SBR DA_APP (high speed serial) */
    847		break;
    848
    849	case BTTV_BOARD_AVDVBT_771: //case 0x07711461:
    850		card->gpio_mode = 0x0400402B;
    851		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    852		card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
    853		/* A_PWRDN DA_SBR  DA_APP[0] PKTP=10 RISC_ENABLE FIFO_ENABLE*/
    854		break;
    855
    856	case BTTV_BOARD_TWINHAN_DST:
    857		card->gpio_mode = 0x2204f2c;
    858		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    859		card->irq_err_ignore = BT878_APABORT | BT878_ARIPERR |
    860				       BT878_APPERR | BT878_AFBUS;
    861		/* 25,21,14,11,10,9,8,3,2 then
    862		 * 0x33 = 5,4,1,0
    863		 * A_SEL=SML, DA_MLB, DA_SBR,
    864		 * DA_SDR=f, fifo trigger = 32 DWORDS
    865		 * IOM = 0 == audio A/D
    866		 * DPM = 0 == digital audio mode
    867		 * == async data parallel port
    868		 * then 0x33 (13 is set by start_capture)
    869		 * DA_APP = async data parallel port,
    870		 * ACAP_EN = 1,
    871		 * RISC+FIFO ENABLE */
    872		break;
    873
    874	case BTTV_BOARD_PC_HDTV:
    875		card->gpio_mode = 0x0100EC7B;
    876		card->op_sync_orin = BT878_RISC_SYNC_MASK;
    877		card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
    878		break;
    879
    880	default:
    881		pr_err("Unknown bttv card type: %d\n", sub->core->type);
    882		kfree(card);
    883		return -ENODEV;
    884	}
    885
    886	dprintk("dvb_bt8xx: identified card%d as %s\n", card->bttv_nr, card->card_name);
    887
    888	if (!(bttv_pci_dev = bttv_get_pcidev(card->bttv_nr))) {
    889		pr_err("no pci device for card %d\n", card->bttv_nr);
    890		kfree(card);
    891		return -ENODEV;
    892	}
    893
    894	if (!(card->bt = dvb_bt8xx_878_match(card->bttv_nr, bttv_pci_dev))) {
    895		pr_err("unable to determine DMA core of card %d,\n", card->bttv_nr);
    896		pr_err("if you have the ALSA bt87x audio driver installed, try removing it.\n");
    897
    898		kfree(card);
    899		return -ENODEV;
    900	}
    901
    902	mutex_init(&card->bt->gpio_lock);
    903	card->bt->bttv_nr = sub->core->nr;
    904
    905	if ( (ret = dvb_bt8xx_load_card(card, sub->core->type)) ) {
    906		kfree(card);
    907		return ret;
    908	}
    909
    910	dev_set_drvdata(&sub->dev, card);
    911	return 0;
    912}
    913
    914static void dvb_bt8xx_remove(struct bttv_sub_device *sub)
    915{
    916	struct dvb_bt8xx_card *card = dev_get_drvdata(&sub->dev);
    917
    918	dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr);
    919
    920	bt878_stop(card->bt);
    921	tasklet_kill(&card->bt->tasklet);
    922	dvb_net_release(&card->dvbnet);
    923	card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
    924	card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
    925	dvb_dmxdev_release(&card->dmxdev);
    926	dvb_dmx_release(&card->demux);
    927	if (card->fe) {
    928		dvb_unregister_frontend(card->fe);
    929		dvb_frontend_detach(card->fe);
    930	}
    931	dvb_unregister_adapter(&card->dvb_adapter);
    932
    933	kfree(card);
    934}
    935
    936static struct bttv_sub_driver driver = {
    937	.drv = {
    938		.name		= "dvb-bt8xx",
    939	},
    940	.probe		= dvb_bt8xx_probe,
    941	.remove		= dvb_bt8xx_remove,
    942	/* FIXME:
    943	 * .shutdown	= dvb_bt8xx_shutdown,
    944	 * .suspend	= dvb_bt8xx_suspend,
    945	 * .resume	= dvb_bt8xx_resume,
    946	 */
    947};
    948
    949static int __init dvb_bt8xx_init(void)
    950{
    951	return bttv_sub_register(&driver, "dvb");
    952}
    953
    954static void __exit dvb_bt8xx_exit(void)
    955{
    956	bttv_sub_unregister(&driver);
    957}
    958
    959module_init(dvb_bt8xx_init);
    960module_exit(dvb_bt8xx_exit);
    961
    962MODULE_DESCRIPTION("Bt8xx based DVB adapter driver");
    963MODULE_AUTHOR("Florian Schirmer <jolt@tuxbox.org>");
    964MODULE_LICENSE("GPL");