aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/media/dvb
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/Kconfig8
-rw-r--r--drivers/media/dvb/Makefile15
-rw-r--r--drivers/media/dvb/bt8xx/bt878.c21
-rw-r--r--drivers/media/dvb/bt8xx/dst.c12
-rw-r--r--drivers/media/dvb/bt8xx/dst_ca.c1
-rw-r--r--drivers/media/dvb/bt8xx/dvb-bt8xx.c2
-rw-r--r--drivers/media/dvb/dm1105/Kconfig1
-rw-r--r--drivers/media/dvb/dm1105/dm1105.c524
-rw-r--r--drivers/media/dvb/dvb-core/dmxdev.c2
-rw-r--r--drivers/media/dvb/dvb-core/dmxdev.h1
-rw-r--r--drivers/media/dvb/dvb-core/dvb_demux.c57
-rw-r--r--drivers/media/dvb/dvb-core/dvb_demux.h5
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.c191
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.h11
-rw-r--r--drivers/media/dvb/dvb-core/dvb_net.c17
-rw-r--r--drivers/media/dvb/dvb-core/dvb_ringbuffer.c1
-rw-r--r--drivers/media/dvb/dvb-core/dvbdev.h28
-rw-r--r--drivers/media/dvb/dvb-usb/Kconfig28
-rw-r--r--drivers/media/dvb/dvb-usb/Makefile6
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.c363
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.h216
-rw-r--r--drivers/media/dvb/dvb-usb/anysee.c2
-rw-r--r--drivers/media/dvb/dvb-usb/az6027.c1151
-rw-r--r--drivers/media/dvb/dvb-usb/az6027.h14
-rw-r--r--drivers/media/dvb/dvb-usb/cxusb.c121
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700.h27
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700_core.c298
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700_devices.c955
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-common.c15
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-mb.c2
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-dvb.c1
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-ids.h23
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-init.c2
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-remote.c7
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb.h3
-rw-r--r--drivers/media/dvb/dvb-usb/dw2102.c545
-rw-r--r--drivers/media/dvb/dvb-usb/ec168.c440
-rw-r--r--drivers/media/dvb/dvb-usb/ec168.h73
-rw-r--r--drivers/media/dvb/dvb-usb/friio-fe.c71
-rw-r--r--drivers/media/dvb/dvb-usb/gp8psk-fe.c4
-rw-r--r--drivers/media/dvb/dvb-usb/m920x.c141
-rw-r--r--drivers/media/dvb/dvb-usb/m920x.h2
-rw-r--r--drivers/media/dvb/dvb-usb/opera1.c2
-rw-r--r--drivers/media/dvb/dvb-usb/usb-urb.c4
-rw-r--r--drivers/media/dvb/firewire/Kconfig7
-rw-r--r--drivers/media/dvb/firewire/Makefile1
-rw-r--r--drivers/media/dvb/firewire/firedtv-1394.c53
-rw-r--r--drivers/media/dvb/firewire/firedtv-avc.c566
-rw-r--r--drivers/media/dvb/firewire/firedtv-dvb.c16
-rw-r--r--drivers/media/dvb/firewire/firedtv-fw.c339
-rw-r--r--drivers/media/dvb/firewire/firedtv-rc.c3
-rw-r--r--drivers/media/dvb/firewire/firedtv.h23
-rw-r--r--drivers/media/dvb/frontends/Kconfig49
-rw-r--r--drivers/media/dvb/frontends/Makefile6
-rw-r--r--drivers/media/dvb/frontends/af9013.h1
-rw-r--r--drivers/media/dvb/frontends/atbm8830.c511
-rw-r--r--drivers/media/dvb/frontends/atbm8830.h76
-rw-r--r--drivers/media/dvb/frontends/atbm8830_priv.h75
-rw-r--r--drivers/media/dvb/frontends/au8522_decoder.c28
-rw-r--r--drivers/media/dvb/frontends/au8522_dig.c1
-rw-r--r--drivers/media/dvb/frontends/au8522_priv.h2
-rw-r--r--drivers/media/dvb/frontends/cx24110.c4
-rw-r--r--drivers/media/dvb/frontends/cx24113.c2
-rw-r--r--drivers/media/dvb/frontends/dib0070.c675
-rw-r--r--drivers/media/dvb/frontends/dib0070.h4
-rw-r--r--drivers/media/dvb/frontends/dib0090.c1523
-rw-r--r--drivers/media/dvb/frontends/dib0090.h108
-rw-r--r--drivers/media/dvb/frontends/dib3000mb.c2
-rw-r--r--drivers/media/dvb/frontends/dib3000mc.c1
-rw-r--r--drivers/media/dvb/frontends/dib7000m.c1
-rw-r--r--drivers/media/dvb/frontends/dib7000p.c34
-rw-r--r--drivers/media/dvb/frontends/dib7000p.h13
-rw-r--r--drivers/media/dvb/frontends/dib8000.c163
-rw-r--r--drivers/media/dvb/frontends/dib8000.h42
-rw-r--r--drivers/media/dvb/frontends/dibx000_common.c15
-rw-r--r--drivers/media/dvb/frontends/dibx000_common.h71
-rw-r--r--drivers/media/dvb/frontends/drx397xD.c3
-rw-r--r--drivers/media/dvb/frontends/ds3000.c1367
-rw-r--r--drivers/media/dvb/frontends/ds3000.h45
-rw-r--r--drivers/media/dvb/frontends/dvb-pll.c1
-rw-r--r--drivers/media/dvb/frontends/ec100.c335
-rw-r--r--drivers/media/dvb/frontends/ec100.h46
-rw-r--r--drivers/media/dvb/frontends/ec100_priv.h39
-rw-r--r--drivers/media/dvb/frontends/itd1000.c1
-rw-r--r--drivers/media/dvb/frontends/l64781.c4
-rw-r--r--drivers/media/dvb/frontends/lgdt3304.c1
-rw-r--r--drivers/media/dvb/frontends/lgdt3305.c1
-rw-r--r--drivers/media/dvb/frontends/lgdt3305.h6
-rw-r--r--drivers/media/dvb/frontends/lgdt330x.c4
-rw-r--r--drivers/media/dvb/frontends/lgs8gxx.c4
-rw-r--r--drivers/media/dvb/frontends/lnbp21.c29
-rw-r--r--drivers/media/dvb/frontends/mb86a16.c1879
-rw-r--r--drivers/media/dvb/frontends/mb86a16.h52
-rw-r--r--drivers/media/dvb/frontends/mb86a16_priv.h151
-rw-r--r--drivers/media/dvb/frontends/s5h1409.c149
-rw-r--r--drivers/media/dvb/frontends/s5h1409.h7
-rw-r--r--drivers/media/dvb/frontends/s921_module.c1
-rw-r--r--drivers/media/dvb/frontends/si21xx.c38
-rw-r--r--drivers/media/dvb/frontends/stb0899_drv.c3
-rw-r--r--drivers/media/dvb/frontends/stb6000.c1
-rw-r--r--drivers/media/dvb/frontends/stb6100.c1
-rw-r--r--drivers/media/dvb/frontends/stb6100_proc.h138
-rw-r--r--drivers/media/dvb/frontends/stv0900.h5
-rw-r--r--drivers/media/dvb/frontends/stv0900_core.c1662
-rw-r--r--drivers/media/dvb/frontends/stv0900_init.h257
-rw-r--r--drivers/media/dvb/frontends/stv0900_priv.h92
-rw-r--r--drivers/media/dvb/frontends/stv0900_reg.h5006
-rw-r--r--drivers/media/dvb/frontends/stv0900_sw.c3201
-rw-r--r--drivers/media/dvb/frontends/stv090x.c734
-rw-r--r--drivers/media/dvb/frontends/stv090x.h15
-rw-r--r--drivers/media/dvb/frontends/stv090x_priv.h20
-rw-r--r--drivers/media/dvb/frontends/stv090x_reg.h70
-rw-r--r--drivers/media/dvb/frontends/stv6110.c14
-rw-r--r--drivers/media/dvb/frontends/stv6110.h1
-rw-r--r--drivers/media/dvb/frontends/stv6110x.c195
-rw-r--r--drivers/media/dvb/frontends/stv6110x.h1
-rw-r--r--drivers/media/dvb/frontends/stv6110x_priv.h1
-rw-r--r--drivers/media/dvb/frontends/tda10021.c4
-rw-r--r--drivers/media/dvb/frontends/tda665x.c258
-rw-r--r--drivers/media/dvb/frontends/tda665x.h52
-rw-r--r--drivers/media/dvb/frontends/tda8261.c3
-rw-r--r--drivers/media/dvb/frontends/tda826x.c1
-rw-r--r--drivers/media/dvb/frontends/tua6100.c1
-rw-r--r--drivers/media/dvb/frontends/zl10036.c3
-rw-r--r--drivers/media/dvb/frontends/zl10039.c1
-rw-r--r--drivers/media/dvb/mantis/Kconfig32
-rw-r--r--drivers/media/dvb/mantis/Makefile28
-rw-r--r--drivers/media/dvb/mantis/hopper_cards.c276
-rw-r--r--drivers/media/dvb/mantis/hopper_vp3028.c88
-rw-r--r--drivers/media/dvb/mantis/hopper_vp3028.h30
-rw-r--r--drivers/media/dvb/mantis/mantis_ca.c208
-rw-r--r--drivers/media/dvb/mantis/mantis_ca.h27
-rw-r--r--drivers/media/dvb/mantis/mantis_cards.c306
-rw-r--r--drivers/media/dvb/mantis/mantis_common.h179
-rw-r--r--drivers/media/dvb/mantis/mantis_core.c238
-rw-r--r--drivers/media/dvb/mantis/mantis_core.h57
-rw-r--r--drivers/media/dvb/mantis/mantis_dma.c256
-rw-r--r--drivers/media/dvb/mantis/mantis_dma.h30
-rw-r--r--drivers/media/dvb/mantis/mantis_dvb.c296
-rw-r--r--drivers/media/dvb/mantis/mantis_dvb.h35
-rw-r--r--drivers/media/dvb/mantis/mantis_evm.c117
-rw-r--r--drivers/media/dvb/mantis/mantis_hif.c238
-rw-r--r--drivers/media/dvb/mantis/mantis_hif.h29
-rw-r--r--drivers/media/dvb/mantis/mantis_i2c.c267
-rw-r--r--drivers/media/dvb/mantis/mantis_i2c.h30
-rw-r--r--drivers/media/dvb/mantis/mantis_input.c148
-rw-r--r--drivers/media/dvb/mantis/mantis_ioc.c130
-rw-r--r--drivers/media/dvb/mantis/mantis_ioc.h51
-rw-r--r--drivers/media/dvb/mantis/mantis_link.h83
-rw-r--r--drivers/media/dvb/mantis/mantis_pci.c172
-rw-r--r--drivers/media/dvb/mantis/mantis_pci.h27
-rw-r--r--drivers/media/dvb/mantis/mantis_pcmcia.c120
-rw-r--r--drivers/media/dvb/mantis/mantis_reg.h197
-rw-r--r--drivers/media/dvb/mantis/mantis_uart.c186
-rw-r--r--drivers/media/dvb/mantis/mantis_uart.h58
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1033.c212
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1033.h30
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1034.c119
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1034.h33
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1041.c358
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1041.h33
-rw-r--r--drivers/media/dvb/mantis/mantis_vp2033.c187
-rw-r--r--drivers/media/dvb/mantis/mantis_vp2033.h30
-rw-r--r--drivers/media/dvb/mantis/mantis_vp2040.c186
-rw-r--r--drivers/media/dvb/mantis/mantis_vp2040.h32
-rw-r--r--drivers/media/dvb/mantis/mantis_vp3028.c38
-rw-r--r--drivers/media/dvb/mantis/mantis_vp3028.h33
-rw-r--r--drivers/media/dvb/mantis/mantis_vp3030.c105
-rw-r--r--drivers/media/dvb/mantis/mantis_vp3030.h30
-rw-r--r--drivers/media/dvb/ngene/Kconfig9
-rw-r--r--drivers/media/dvb/ngene/Makefile11
-rw-r--r--drivers/media/dvb/ngene/ngene-core.c2023
-rw-r--r--drivers/media/dvb/ngene/ngene.h859
-rw-r--r--drivers/media/dvb/pluto2/pluto2.c1
-rw-r--r--drivers/media/dvb/pt1/pt1.c2
-rw-r--r--drivers/media/dvb/pt1/va1j5jf8007s.c57
-rw-r--r--drivers/media/dvb/pt1/va1j5jf8007t.c49
-rw-r--r--drivers/media/dvb/siano/sms-cards.c5
-rw-r--r--drivers/media/dvb/siano/sms-cards.h2
-rw-r--r--drivers/media/dvb/siano/smscoreapi.c10
-rw-r--r--drivers/media/dvb/siano/smscoreapi.h77
-rw-r--r--drivers/media/dvb/siano/smsdvb.c323
-rw-r--r--drivers/media/dvb/siano/smsir.c6
-rw-r--r--drivers/media/dvb/siano/smssdio.c11
-rw-r--r--drivers/media/dvb/siano/smsusb.c19
-rw-r--r--drivers/media/dvb/ttpci/av7110.c5
-rw-r--r--drivers/media/dvb/ttpci/av7110_ca.c1
-rw-r--r--drivers/media/dvb/ttpci/av7110_ir.c14
-rw-r--r--drivers/media/dvb/ttpci/budget-av.c2
-rw-r--r--drivers/media/dvb/ttpci/budget-ci.c48
-rw-r--r--drivers/media/dvb/ttpci/budget-patch.c2
-rw-r--r--drivers/media/dvb/ttpci/budget.c7
-rw-r--r--drivers/media/dvb/ttusb-dec/ttusb_dec.c2
193 files changed, 26851 insertions, 7790 deletions
diff --git a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig
index 35d0817126e9..161ccfd471cb 100644
--- a/drivers/media/dvb/Kconfig
+++ b/drivers/media/dvb/Kconfig
@@ -72,6 +72,14 @@ comment "Supported Earthsoft PT1 Adapters"
72 depends on DVB_CORE && PCI && I2C 72 depends on DVB_CORE && PCI && I2C
73source "drivers/media/dvb/pt1/Kconfig" 73source "drivers/media/dvb/pt1/Kconfig"
74 74
75comment "Supported Mantis Adapters"
76 depends on DVB_CORE && PCI && I2C
77 source "drivers/media/dvb/mantis/Kconfig"
78
79comment "Supported nGene Adapters"
80 depends on DVB_CORE && PCI && I2C
81 source "drivers/media/dvb/ngene/Kconfig"
82
75comment "Supported DVB Frontends" 83comment "Supported DVB Frontends"
76 depends on DVB_CORE 84 depends on DVB_CORE
77source "drivers/media/dvb/frontends/Kconfig" 85source "drivers/media/dvb/frontends/Kconfig"
diff --git a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile
index 16d262ddb45d..a1a08758a6f2 100644
--- a/drivers/media/dvb/Makefile
+++ b/drivers/media/dvb/Makefile
@@ -2,6 +2,19 @@
2# Makefile for the kernel multimedia device drivers. 2# Makefile for the kernel multimedia device drivers.
3# 3#
4 4
5obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/ pt1/ 5obj-y := dvb-core/ \
6 frontends/ \
7 ttpci/ \
8 ttusb-dec/ \
9 ttusb-budget/ \
10 b2c2/ \
11 bt8xx/ \
12 dvb-usb/ \
13 pluto2/ \
14 siano/ \
15 dm1105/ \
16 pt1/ \
17 mantis/ \
18 ngene/
6 19
7obj-$(CONFIG_DVB_FIREDTV) += firewire/ 20obj-$(CONFIG_DVB_FIREDTV) += firewire/
diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c
index a24c125331f0..99d62094f908 100644
--- a/drivers/media/dvb/bt8xx/bt878.c
+++ b/drivers/media/dvb/bt8xx/bt878.c
@@ -576,43 +576,30 @@ static struct pci_driver bt878_pci_driver = {
576 .remove = __devexit_p(bt878_remove), 576 .remove = __devexit_p(bt878_remove),
577}; 577};
578 578
579static int bt878_pci_driver_registered;
580
581/*******************************/ 579/*******************************/
582/* Module management functions */ 580/* Module management functions */
583/*******************************/ 581/*******************************/
584 582
585static int bt878_init_module(void) 583static int __init bt878_init_module(void)
586{ 584{
587 bt878_num = 0; 585 bt878_num = 0;
588 bt878_pci_driver_registered = 0;
589 586
590 printk(KERN_INFO "bt878: AUDIO driver version %d.%d.%d loaded\n", 587 printk(KERN_INFO "bt878: AUDIO driver version %d.%d.%d loaded\n",
591 (BT878_VERSION_CODE >> 16) & 0xff, 588 (BT878_VERSION_CODE >> 16) & 0xff,
592 (BT878_VERSION_CODE >> 8) & 0xff, 589 (BT878_VERSION_CODE >> 8) & 0xff,
593 BT878_VERSION_CODE & 0xff); 590 BT878_VERSION_CODE & 0xff);
594/* 591
595 bt878_check_chipset();
596*/
597 /* later we register inside of bt878_find_audio_dma()
598 * because we may want to ignore certain cards */
599 bt878_pci_driver_registered = 1;
600 return pci_register_driver(&bt878_pci_driver); 592 return pci_register_driver(&bt878_pci_driver);
601} 593}
602 594
603static void bt878_cleanup_module(void) 595static void __exit bt878_cleanup_module(void)
604{ 596{
605 if (bt878_pci_driver_registered) { 597 pci_unregister_driver(&bt878_pci_driver);
606 bt878_pci_driver_registered = 0;
607 pci_unregister_driver(&bt878_pci_driver);
608 }
609 return;
610} 598}
611 599
612module_init(bt878_init_module); 600module_init(bt878_init_module);
613module_exit(bt878_cleanup_module); 601module_exit(bt878_cleanup_module);
614 602
615//MODULE_AUTHOR("XXX");
616MODULE_LICENSE("GPL"); 603MODULE_LICENSE("GPL");
617 604
618/* 605/*
diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c
index 91353a6faf1d..8b0cde38984d 100644
--- a/drivers/media/dvb/bt8xx/dst.c
+++ b/drivers/media/dvb/bt8xx/dst.c
@@ -1352,8 +1352,7 @@ static int dst_get_tuna(struct dst_state *state)
1352 return retval; 1352 return retval;
1353 } 1353 }
1354 if ((state->type_flags & DST_TYPE_HAS_VLF) && 1354 if ((state->type_flags & DST_TYPE_HAS_VLF) &&
1355 !(state->dst_type == DST_TYPE_IS_CABLE) && 1355 !(state->dst_type == DST_TYPE_IS_ATSC)) {
1356 !(state->dst_type == DST_TYPE_IS_ATSC)) {
1357 1356
1358 if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[0], 9)) { 1357 if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[0], 9)) {
1359 dprintk(verbose, DST_INFO, 1, "checksum failure ? "); 1358 dprintk(verbose, DST_INFO, 1, "checksum failure ? ");
@@ -1820,8 +1819,13 @@ static struct dvb_frontend_ops dst_dvbc_ops = {
1820 .frequency_max = 858000000, 1819 .frequency_max = 858000000,
1821 .symbol_rate_min = 1000000, 1820 .symbol_rate_min = 1000000,
1822 .symbol_rate_max = 45000000, 1821 .symbol_rate_max = 45000000,
1823 /* . symbol_rate_tolerance = ???,*/ 1822 .caps = FE_CAN_FEC_AUTO |
1824 .caps = FE_CAN_FEC_AUTO | FE_CAN_QAM_AUTO 1823 FE_CAN_QAM_AUTO |
1824 FE_CAN_QAM_16 |
1825 FE_CAN_QAM_32 |
1826 FE_CAN_QAM_64 |
1827 FE_CAN_QAM_128 |
1828 FE_CAN_QAM_256
1825 }, 1829 },
1826 1830
1827 .release = dst_release, 1831 .release = dst_release,
diff --git a/drivers/media/dvb/bt8xx/dst_ca.c b/drivers/media/dvb/bt8xx/dst_ca.c
index 0e246eaad05a..770243c720d2 100644
--- a/drivers/media/dvb/bt8xx/dst_ca.c
+++ b/drivers/media/dvb/bt8xx/dst_ca.c
@@ -20,6 +20,7 @@
20 20
21#include <linux/kernel.h> 21#include <linux/kernel.h>
22#include <linux/module.h> 22#include <linux/module.h>
23#include <linux/slab.h>
23#include <linux/init.h> 24#include <linux/init.h>
24#include <linux/smp_lock.h> 25#include <linux/smp_lock.h>
25#include <linux/string.h> 26#include <linux/string.h>
diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
index b1857c19bbd2..78fc469f0f69 100644
--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
@@ -215,7 +215,7 @@ static int cx24108_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend
215 freq = 2150000; /* satellite IF is 950..2150MHz */ 215 freq = 2150000; /* satellite IF is 950..2150MHz */
216 216
217 /* decide which VCO to use for the input frequency */ 217 /* decide which VCO to use for the input frequency */
218 for(i = 1; (i < ARRAY_SIZE(osci)) && (osci[i] < freq); i++); 218 for(i = 1; (i < ARRAY_SIZE(osci) - 1) && (osci[i] < freq); i++);
219 printk("cx24108 debug: select vco #%d (f=%d)\n",i,freq); 219 printk("cx24108 debug: select vco #%d (f=%d)\n",i,freq);
220 band=bandsel[i]; 220 band=bandsel[i];
221 /* the gain values must be set by SetSymbolrate */ 221 /* the gain values must be set by SetSymbolrate */
diff --git a/drivers/media/dvb/dm1105/Kconfig b/drivers/media/dvb/dm1105/Kconfig
index de3eeb0a8d6e..695239227cb7 100644
--- a/drivers/media/dvb/dm1105/Kconfig
+++ b/drivers/media/dvb/dm1105/Kconfig
@@ -8,6 +8,7 @@ config DVB_DM1105
8 select DVB_STB6000 if !DVB_FE_CUSTOMISE 8 select DVB_STB6000 if !DVB_FE_CUSTOMISE
9 select DVB_CX24116 if !DVB_FE_CUSTOMISE 9 select DVB_CX24116 if !DVB_FE_CUSTOMISE
10 select DVB_SI21XX if !DVB_FE_CUSTOMISE 10 select DVB_SI21XX if !DVB_FE_CUSTOMISE
11 select DVB_DS3000 if !DVB_FE_CUSTOMISE
11 select VIDEO_IR 12 select VIDEO_IR
12 help 13 help
13 Support for cards based on the SDMC DM1105 PCI chip like 14 Support for cards based on the SDMC DM1105 PCI chip like
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c
index 2d099e271751..b6d46961a99e 100644
--- a/drivers/media/dvb/dm1105/dm1105.c
+++ b/drivers/media/dvb/dm1105/dm1105.c
@@ -27,6 +27,7 @@
27#include <linux/pci.h> 27#include <linux/pci.h>
28#include <linux/dma-mapping.h> 28#include <linux/dma-mapping.h>
29#include <linux/input.h> 29#include <linux/input.h>
30#include <linux/slab.h>
30#include <media/ir-common.h> 31#include <media/ir-common.h>
31 32
32#include "demux.h" 33#include "demux.h"
@@ -43,6 +44,7 @@
43#include "si21xx.h" 44#include "si21xx.h"
44#include "cx24116.h" 45#include "cx24116.h"
45#include "z0194a.h" 46#include "z0194a.h"
47#include "ds3000.h"
46 48
47#define UNSET (-1U) 49#define UNSET (-1U)
48 50
@@ -269,7 +271,7 @@ struct infrared {
269 u32 ir_command; 271 u32 ir_command;
270}; 272};
271 273
272struct dm1105dvb { 274struct dm1105_dev {
273 /* pci */ 275 /* pci */
274 struct pci_dev *pdev; 276 struct pci_dev *pdev;
275 u8 __iomem *io_mem; 277 u8 __iomem *io_mem;
@@ -308,31 +310,47 @@ struct dm1105dvb {
308 spinlock_t lock; 310 spinlock_t lock;
309}; 311};
310 312
311#define dm_io_mem(reg) ((unsigned long)(&dm1105dvb->io_mem[reg])) 313#define dm_io_mem(reg) ((unsigned long)(&dev->io_mem[reg]))
314
315#define dm_readb(reg) inb(dm_io_mem(reg))
316#define dm_writeb(reg, value) outb((value), (dm_io_mem(reg)))
317
318#define dm_readw(reg) inw(dm_io_mem(reg))
319#define dm_writew(reg, value) outw((value), (dm_io_mem(reg)))
320
321#define dm_readl(reg) inl(dm_io_mem(reg))
322#define dm_writel(reg, value) outl((value), (dm_io_mem(reg)))
323
324#define dm_andorl(reg, mask, value) \
325 outl((inl(dm_io_mem(reg)) & ~(mask)) |\
326 ((value) & (mask)), (dm_io_mem(reg)))
327
328#define dm_setl(reg, bit) dm_andorl((reg), (bit), (bit))
329#define dm_clearl(reg, bit) dm_andorl((reg), (bit), 0)
312 330
313static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap, 331static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap,
314 struct i2c_msg *msgs, int num) 332 struct i2c_msg *msgs, int num)
315{ 333{
316 struct dm1105dvb *dm1105dvb ; 334 struct dm1105_dev *dev ;
317 335
318 int addr, rc, i, j, k, len, byte, data; 336 int addr, rc, i, j, k, len, byte, data;
319 u8 status; 337 u8 status;
320 338
321 dm1105dvb = i2c_adap->algo_data; 339 dev = i2c_adap->algo_data;
322 for (i = 0; i < num; i++) { 340 for (i = 0; i < num; i++) {
323 outb(0x00, dm_io_mem(DM1105_I2CCTR)); 341 dm_writeb(DM1105_I2CCTR, 0x00);
324 if (msgs[i].flags & I2C_M_RD) { 342 if (msgs[i].flags & I2C_M_RD) {
325 /* read bytes */ 343 /* read bytes */
326 addr = msgs[i].addr << 1; 344 addr = msgs[i].addr << 1;
327 addr |= 1; 345 addr |= 1;
328 outb(addr, dm_io_mem(DM1105_I2CDAT)); 346 dm_writeb(DM1105_I2CDAT, addr);
329 for (byte = 0; byte < msgs[i].len; byte++) 347 for (byte = 0; byte < msgs[i].len; byte++)
330 outb(0, dm_io_mem(DM1105_I2CDAT + byte + 1)); 348 dm_writeb(DM1105_I2CDAT + byte + 1, 0);
331 349
332 outb(0x81 + msgs[i].len, dm_io_mem(DM1105_I2CCTR)); 350 dm_writeb(DM1105_I2CCTR, 0x81 + msgs[i].len);
333 for (j = 0; j < 55; j++) { 351 for (j = 0; j < 55; j++) {
334 mdelay(10); 352 mdelay(10);
335 status = inb(dm_io_mem(DM1105_I2CSTS)); 353 status = dm_readb(DM1105_I2CSTS);
336 if ((status & 0xc0) == 0x40) 354 if ((status & 0xc0) == 0x40)
337 break; 355 break;
338 } 356 }
@@ -340,56 +358,54 @@ static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap,
340 return -1; 358 return -1;
341 359
342 for (byte = 0; byte < msgs[i].len; byte++) { 360 for (byte = 0; byte < msgs[i].len; byte++) {
343 rc = inb(dm_io_mem(DM1105_I2CDAT + byte + 1)); 361 rc = dm_readb(DM1105_I2CDAT + byte + 1);
344 if (rc < 0) 362 if (rc < 0)
345 goto err; 363 goto err;
346 msgs[i].buf[byte] = rc; 364 msgs[i].buf[byte] = rc;
347 } 365 }
348 } else { 366 } else if ((msgs[i].buf[0] == 0xf7) && (msgs[i].addr == 0x55)) {
349 if ((msgs[i].buf[0] == 0xf7) && (msgs[i].addr == 0x55)) { 367 /* prepaired for cx24116 firmware */
350 /* prepaired for cx24116 firmware */ 368 /* Write in small blocks */
351 /* Write in small blocks */ 369 len = msgs[i].len - 1;
352 len = msgs[i].len - 1; 370 k = 1;
353 k = 1; 371 do {
354 do { 372 dm_writeb(DM1105_I2CDAT, msgs[i].addr << 1);
355 outb(msgs[i].addr << 1, dm_io_mem(DM1105_I2CDAT)); 373 dm_writeb(DM1105_I2CDAT + 1, 0xf7);
356 outb(0xf7, dm_io_mem(DM1105_I2CDAT + 1)); 374 for (byte = 0; byte < (len > 48 ? 48 : len); byte++) {
357 for (byte = 0; byte < (len > 48 ? 48 : len); byte++) { 375 data = msgs[i].buf[k + byte];
358 data = msgs[i].buf[k+byte]; 376 dm_writeb(DM1105_I2CDAT + byte + 2, data);
359 outb(data, dm_io_mem(DM1105_I2CDAT + byte + 2));
360 }
361 outb(0x82 + (len > 48 ? 48 : len), dm_io_mem(DM1105_I2CCTR));
362 for (j = 0; j < 25; j++) {
363 mdelay(10);
364 status = inb(dm_io_mem(DM1105_I2CSTS));
365 if ((status & 0xc0) == 0x40)
366 break;
367 }
368
369 if (j >= 25)
370 return -1;
371
372 k += 48;
373 len -= 48;
374 } while (len > 0);
375 } else {
376 /* write bytes */
377 outb(msgs[i].addr<<1, dm_io_mem(DM1105_I2CDAT));
378 for (byte = 0; byte < msgs[i].len; byte++) {
379 data = msgs[i].buf[byte];
380 outb(data, dm_io_mem(DM1105_I2CDAT + byte + 1));
381 } 377 }
382 outb(0x81 + msgs[i].len, dm_io_mem(DM1105_I2CCTR)); 378 dm_writeb(DM1105_I2CCTR, 0x82 + (len > 48 ? 48 : len));
383 for (j = 0; j < 25; j++) { 379 for (j = 0; j < 25; j++) {
384 mdelay(10); 380 mdelay(10);
385 status = inb(dm_io_mem(DM1105_I2CSTS)); 381 status = dm_readb(DM1105_I2CSTS);
386 if ((status & 0xc0) == 0x40) 382 if ((status & 0xc0) == 0x40)
387 break; 383 break;
388 } 384 }
389 385
390 if (j >= 25) 386 if (j >= 25)
391 return -1; 387 return -1;
388
389 k += 48;
390 len -= 48;
391 } while (len > 0);
392 } else {
393 /* write bytes */
394 dm_writeb(DM1105_I2CDAT, msgs[i].addr << 1);
395 for (byte = 0; byte < msgs[i].len; byte++) {
396 data = msgs[i].buf[byte];
397 dm_writeb(DM1105_I2CDAT + byte + 1, data);
392 } 398 }
399 dm_writeb(DM1105_I2CCTR, 0x81 + msgs[i].len);
400 for (j = 0; j < 25; j++) {
401 mdelay(10);
402 status = dm_readb(DM1105_I2CSTS);
403 if ((status & 0xc0) == 0x40)
404 break;
405 }
406
407 if (j >= 25)
408 return -1;
393 } 409 }
394 } 410 }
395 return num; 411 return num;
@@ -407,22 +423,22 @@ static struct i2c_algorithm dm1105_algo = {
407 .functionality = functionality, 423 .functionality = functionality,
408}; 424};
409 425
410static inline struct dm1105dvb *feed_to_dm1105dvb(struct dvb_demux_feed *feed) 426static inline struct dm1105_dev *feed_to_dm1105_dev(struct dvb_demux_feed *feed)
411{ 427{
412 return container_of(feed->demux, struct dm1105dvb, demux); 428 return container_of(feed->demux, struct dm1105_dev, demux);
413} 429}
414 430
415static inline struct dm1105dvb *frontend_to_dm1105dvb(struct dvb_frontend *fe) 431static inline struct dm1105_dev *frontend_to_dm1105_dev(struct dvb_frontend *fe)
416{ 432{
417 return container_of(fe->dvb, struct dm1105dvb, dvb_adapter); 433 return container_of(fe->dvb, struct dm1105_dev, dvb_adapter);
418} 434}
419 435
420static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 436static int dm1105_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
421{ 437{
422 struct dm1105dvb *dm1105dvb = frontend_to_dm1105dvb(fe); 438 struct dm1105_dev *dev = frontend_to_dm1105_dev(fe);
423 u32 lnb_mask, lnb_13v, lnb_18v, lnb_off; 439 u32 lnb_mask, lnb_13v, lnb_18v, lnb_off;
424 440
425 switch (dm1105dvb->boardnr) { 441 switch (dev->boardnr) {
426 case DM1105_BOARD_AXESS_DM05: 442 case DM1105_BOARD_AXESS_DM05:
427 lnb_mask = DM05_LNB_MASK; 443 lnb_mask = DM05_LNB_MASK;
428 lnb_off = DM05_LNB_OFF; 444 lnb_off = DM05_LNB_OFF;
@@ -438,62 +454,67 @@ static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t volta
438 lnb_18v = DM1105_LNB_18V; 454 lnb_18v = DM1105_LNB_18V;
439 } 455 }
440 456
441 outl(lnb_mask, dm_io_mem(DM1105_GPIOCTR)); 457 dm_writel(DM1105_GPIOCTR, lnb_mask);
442 if (voltage == SEC_VOLTAGE_18) 458 if (voltage == SEC_VOLTAGE_18)
443 outl(lnb_18v , dm_io_mem(DM1105_GPIOVAL)); 459 dm_writel(DM1105_GPIOVAL, lnb_18v);
444 else if (voltage == SEC_VOLTAGE_13) 460 else if (voltage == SEC_VOLTAGE_13)
445 outl(lnb_13v, dm_io_mem(DM1105_GPIOVAL)); 461 dm_writel(DM1105_GPIOVAL, lnb_13v);
446 else 462 else
447 outl(lnb_off, dm_io_mem(DM1105_GPIOVAL)); 463 dm_writel(DM1105_GPIOVAL, lnb_off);
448 464
449 return 0; 465 return 0;
450} 466}
451 467
452static void dm1105dvb_set_dma_addr(struct dm1105dvb *dm1105dvb) 468static void dm1105_set_dma_addr(struct dm1105_dev *dev)
453{ 469{
454 outl(cpu_to_le32(dm1105dvb->dma_addr), dm_io_mem(DM1105_STADR)); 470 dm_writel(DM1105_STADR, cpu_to_le32(dev->dma_addr));
455} 471}
456 472
457static int __devinit dm1105dvb_dma_map(struct dm1105dvb *dm1105dvb) 473static int __devinit dm1105_dma_map(struct dm1105_dev *dev)
458{ 474{
459 dm1105dvb->ts_buf = pci_alloc_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, &dm1105dvb->dma_addr); 475 dev->ts_buf = pci_alloc_consistent(dev->pdev,
476 6 * DM1105_DMA_BYTES,
477 &dev->dma_addr);
460 478
461 return !dm1105dvb->ts_buf; 479 return !dev->ts_buf;
462} 480}
463 481
464static void dm1105dvb_dma_unmap(struct dm1105dvb *dm1105dvb) 482static void dm1105_dma_unmap(struct dm1105_dev *dev)
465{ 483{
466 pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr); 484 pci_free_consistent(dev->pdev,
485 6 * DM1105_DMA_BYTES,
486 dev->ts_buf,
487 dev->dma_addr);
467} 488}
468 489
469static void dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb) 490static void dm1105_enable_irqs(struct dm1105_dev *dev)
470{ 491{
471 outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK)); 492 dm_writeb(DM1105_INTMAK, INTMAK_ALLMASK);
472 outb(1, dm_io_mem(DM1105_CR)); 493 dm_writeb(DM1105_CR, 1);
473} 494}
474 495
475static void dm1105dvb_disable_irqs(struct dm1105dvb *dm1105dvb) 496static void dm1105_disable_irqs(struct dm1105_dev *dev)
476{ 497{
477 outb(INTMAK_IRM, dm_io_mem(DM1105_INTMAK)); 498 dm_writeb(DM1105_INTMAK, INTMAK_IRM);
478 outb(0, dm_io_mem(DM1105_CR)); 499 dm_writeb(DM1105_CR, 0);
479} 500}
480 501
481static int dm1105dvb_start_feed(struct dvb_demux_feed *f) 502static int dm1105_start_feed(struct dvb_demux_feed *f)
482{ 503{
483 struct dm1105dvb *dm1105dvb = feed_to_dm1105dvb(f); 504 struct dm1105_dev *dev = feed_to_dm1105_dev(f);
484 505
485 if (dm1105dvb->full_ts_users++ == 0) 506 if (dev->full_ts_users++ == 0)
486 dm1105dvb_enable_irqs(dm1105dvb); 507 dm1105_enable_irqs(dev);
487 508
488 return 0; 509 return 0;
489} 510}
490 511
491static int dm1105dvb_stop_feed(struct dvb_demux_feed *f) 512static int dm1105_stop_feed(struct dvb_demux_feed *f)
492{ 513{
493 struct dm1105dvb *dm1105dvb = feed_to_dm1105dvb(f); 514 struct dm1105_dev *dev = feed_to_dm1105_dev(f);
494 515
495 if (--dm1105dvb->full_ts_users == 0) 516 if (--dev->full_ts_users == 0)
496 dm1105dvb_disable_irqs(dm1105dvb); 517 dm1105_disable_irqs(dev);
497 518
498 return 0; 519 return 0;
499} 520}
@@ -510,75 +531,71 @@ static void dm1105_emit_key(struct work_struct *work)
510 531
511 data = (ircom >> 8) & 0x7f; 532 data = (ircom >> 8) & 0x7f;
512 533
513 ir_input_keydown(ir->input_dev, &ir->ir, data, data); 534 ir_input_keydown(ir->input_dev, &ir->ir, data);
514 ir_input_nokey(ir->input_dev, &ir->ir); 535 ir_input_nokey(ir->input_dev, &ir->ir);
515} 536}
516 537
517/* work handler */ 538/* work handler */
518static void dm1105_dmx_buffer(struct work_struct *work) 539static void dm1105_dmx_buffer(struct work_struct *work)
519{ 540{
520 struct dm1105dvb *dm1105dvb = 541 struct dm1105_dev *dev = container_of(work, struct dm1105_dev, work);
521 container_of(work, struct dm1105dvb, work);
522 unsigned int nbpackets; 542 unsigned int nbpackets;
523 u32 oldwrp = dm1105dvb->wrp; 543 u32 oldwrp = dev->wrp;
524 u32 nextwrp = dm1105dvb->nextwrp; 544 u32 nextwrp = dev->nextwrp;
525 545
526 if (!((dm1105dvb->ts_buf[oldwrp] == 0x47) && 546 if (!((dev->ts_buf[oldwrp] == 0x47) &&
527 (dm1105dvb->ts_buf[oldwrp + 188] == 0x47) && 547 (dev->ts_buf[oldwrp + 188] == 0x47) &&
528 (dm1105dvb->ts_buf[oldwrp + 188 * 2] == 0x47))) { 548 (dev->ts_buf[oldwrp + 188 * 2] == 0x47))) {
529 dm1105dvb->PacketErrorCount++; 549 dev->PacketErrorCount++;
530 /* bad packet found */ 550 /* bad packet found */
531 if ((dm1105dvb->PacketErrorCount >= 2) && 551 if ((dev->PacketErrorCount >= 2) &&
532 (dm1105dvb->dmarst == 0)) { 552 (dev->dmarst == 0)) {
533 outb(1, dm_io_mem(DM1105_RST)); 553 dm_writeb(DM1105_RST, 1);
534 dm1105dvb->wrp = 0; 554 dev->wrp = 0;
535 dm1105dvb->PacketErrorCount = 0; 555 dev->PacketErrorCount = 0;
536 dm1105dvb->dmarst = 0; 556 dev->dmarst = 0;
537 return; 557 return;
538 } 558 }
539 } 559 }
540 560
541 if (nextwrp < oldwrp) { 561 if (nextwrp < oldwrp) {
542 memcpy(dm1105dvb->ts_buf + dm1105dvb->buffer_size, 562 memcpy(dev->ts_buf + dev->buffer_size, dev->ts_buf, nextwrp);
543 dm1105dvb->ts_buf, nextwrp); 563 nbpackets = ((dev->buffer_size - oldwrp) + nextwrp) / 188;
544 nbpackets = ((dm1105dvb->buffer_size - oldwrp) + nextwrp) / 188;
545 } else 564 } else
546 nbpackets = (nextwrp - oldwrp) / 188; 565 nbpackets = (nextwrp - oldwrp) / 188;
547 566
548 dm1105dvb->wrp = nextwrp; 567 dev->wrp = nextwrp;
549 dvb_dmx_swfilter_packets(&dm1105dvb->demux, 568 dvb_dmx_swfilter_packets(&dev->demux, &dev->ts_buf[oldwrp], nbpackets);
550 &dm1105dvb->ts_buf[oldwrp], nbpackets);
551} 569}
552 570
553static irqreturn_t dm1105dvb_irq(int irq, void *dev_id) 571static irqreturn_t dm1105_irq(int irq, void *dev_id)
554{ 572{
555 struct dm1105dvb *dm1105dvb = dev_id; 573 struct dm1105_dev *dev = dev_id;
556 574
557 /* Read-Write INSTS Ack's Interrupt for DM1105 chip 16.03.2008 */ 575 /* Read-Write INSTS Ack's Interrupt for DM1105 chip 16.03.2008 */
558 unsigned int intsts = inb(dm_io_mem(DM1105_INTSTS)); 576 unsigned int intsts = dm_readb(DM1105_INTSTS);
559 outb(intsts, dm_io_mem(DM1105_INTSTS)); 577 dm_writeb(DM1105_INTSTS, intsts);
560 578
561 switch (intsts) { 579 switch (intsts) {
562 case INTSTS_TSIRQ: 580 case INTSTS_TSIRQ:
563 case (INTSTS_TSIRQ | INTSTS_IR): 581 case (INTSTS_TSIRQ | INTSTS_IR):
564 dm1105dvb->nextwrp = inl(dm_io_mem(DM1105_WRP)) - 582 dev->nextwrp = dm_readl(DM1105_WRP) - dm_readl(DM1105_STADR);
565 inl(dm_io_mem(DM1105_STADR)); 583 queue_work(dev->wq, &dev->work);
566 queue_work(dm1105dvb->wq, &dm1105dvb->work);
567 break; 584 break;
568 case INTSTS_IR: 585 case INTSTS_IR:
569 dm1105dvb->ir.ir_command = inl(dm_io_mem(DM1105_IRCODE)); 586 dev->ir.ir_command = dm_readl(DM1105_IRCODE);
570 schedule_work(&dm1105dvb->ir.work); 587 schedule_work(&dev->ir.work);
571 break; 588 break;
572 } 589 }
573 590
574 return IRQ_HANDLED; 591 return IRQ_HANDLED;
575} 592}
576 593
577int __devinit dm1105_ir_init(struct dm1105dvb *dm1105) 594int __devinit dm1105_ir_init(struct dm1105_dev *dm1105)
578{ 595{
579 struct input_dev *input_dev; 596 struct input_dev *input_dev;
580 struct ir_scancode_table *ir_codes = &ir_codes_dm1105_nec_table; 597 struct ir_scancode_table *ir_codes = &ir_codes_dm1105_nec_table;
581 int ir_type = IR_TYPE_OTHER; 598 u64 ir_type = IR_TYPE_OTHER;
582 int err = -ENOMEM; 599 int err = -ENOMEM;
583 600
584 input_dev = input_allocate_device(); 601 input_dev = input_allocate_device();
@@ -589,7 +606,12 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105)
589 snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), 606 snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys),
590 "pci-%s/ir0", pci_name(dm1105->pdev)); 607 "pci-%s/ir0", pci_name(dm1105->pdev));
591 608
592 ir_input_init(input_dev, &dm1105->ir.ir, ir_type, ir_codes); 609 err = ir_input_init(input_dev, &dm1105->ir.ir, ir_type);
610 if (err < 0) {
611 input_free_device(input_dev);
612 return err;
613 }
614
593 input_dev->name = "DVB on-card IR receiver"; 615 input_dev->name = "DVB on-card IR receiver";
594 input_dev->phys = dm1105->ir.input_phys; 616 input_dev->phys = dm1105->ir.input_phys;
595 input_dev->id.bustype = BUS_PCI; 617 input_dev->id.bustype = BUS_PCI;
@@ -606,56 +628,51 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105)
606 628
607 INIT_WORK(&dm1105->ir.work, dm1105_emit_key); 629 INIT_WORK(&dm1105->ir.work, dm1105_emit_key);
608 630
609 err = input_register_device(input_dev); 631 err = ir_input_register(input_dev, ir_codes, NULL);
610 if (err) {
611 input_free_device(input_dev);
612 return err;
613 }
614 632
615 return 0; 633 return err;
616} 634}
617 635
618void __devexit dm1105_ir_exit(struct dm1105dvb *dm1105) 636void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105)
619{ 637{
620 input_unregister_device(dm1105->ir.input_dev); 638 ir_input_unregister(dm1105->ir.input_dev);
621
622} 639}
623 640
624static int __devinit dm1105dvb_hw_init(struct dm1105dvb *dm1105dvb) 641static int __devinit dm1105_hw_init(struct dm1105_dev *dev)
625{ 642{
626 dm1105dvb_disable_irqs(dm1105dvb); 643 dm1105_disable_irqs(dev);
627 644
628 outb(0, dm_io_mem(DM1105_HOST_CTR)); 645 dm_writeb(DM1105_HOST_CTR, 0);
629 646
630 /*DATALEN 188,*/ 647 /*DATALEN 188,*/
631 outb(188, dm_io_mem(DM1105_DTALENTH)); 648 dm_writeb(DM1105_DTALENTH, 188);
632 /*TS_STRT TS_VALP MSBFIRST TS_MODE ALPAS TSPES*/ 649 /*TS_STRT TS_VALP MSBFIRST TS_MODE ALPAS TSPES*/
633 outw(0xc10a, dm_io_mem(DM1105_TSCTR)); 650 dm_writew(DM1105_TSCTR, 0xc10a);
634 651
635 /* map DMA and set address */ 652 /* map DMA and set address */
636 dm1105dvb_dma_map(dm1105dvb); 653 dm1105_dma_map(dev);
637 dm1105dvb_set_dma_addr(dm1105dvb); 654 dm1105_set_dma_addr(dev);
638 /* big buffer */ 655 /* big buffer */
639 outl(5*DM1105_DMA_BYTES, dm_io_mem(DM1105_RLEN)); 656 dm_writel(DM1105_RLEN, 5 * DM1105_DMA_BYTES);
640 outb(47, dm_io_mem(DM1105_INTCNT)); 657 dm_writeb(DM1105_INTCNT, 47);
641 658
642 /* IR NEC mode enable */ 659 /* IR NEC mode enable */
643 outb((DM1105_IR_EN | DM1105_SYS_CHK), dm_io_mem(DM1105_IRCTR)); 660 dm_writeb(DM1105_IRCTR, (DM1105_IR_EN | DM1105_SYS_CHK));
644 outb(0, dm_io_mem(DM1105_IRMODE)); 661 dm_writeb(DM1105_IRMODE, 0);
645 outw(0, dm_io_mem(DM1105_SYSTEMCODE)); 662 dm_writew(DM1105_SYSTEMCODE, 0);
646 663
647 return 0; 664 return 0;
648} 665}
649 666
650static void dm1105dvb_hw_exit(struct dm1105dvb *dm1105dvb) 667static void dm1105_hw_exit(struct dm1105_dev *dev)
651{ 668{
652 dm1105dvb_disable_irqs(dm1105dvb); 669 dm1105_disable_irqs(dev);
653 670
654 /* IR disable */ 671 /* IR disable */
655 outb(0, dm_io_mem(DM1105_IRCTR)); 672 dm_writeb(DM1105_IRCTR, 0);
656 outb(INTMAK_NONEMASK, dm_io_mem(DM1105_INTMAK)); 673 dm_writeb(DM1105_INTMAK, INTMAK_NONEMASK);
657 674
658 dm1105dvb_dma_unmap(dm1105dvb); 675 dm1105_dma_unmap(dev);
659} 676}
660 677
661static struct stv0299_config sharp_z0194a_config = { 678static struct stv0299_config sharp_z0194a_config = {
@@ -685,70 +702,79 @@ static struct cx24116_config serit_sp2633_config = {
685 .demod_address = 0x55, 702 .demod_address = 0x55,
686}; 703};
687 704
688static int __devinit frontend_init(struct dm1105dvb *dm1105dvb) 705static struct ds3000_config dvbworld_ds3000_config = {
706 .demod_address = 0x68,
707};
708
709static int __devinit frontend_init(struct dm1105_dev *dev)
689{ 710{
690 int ret; 711 int ret;
691 712
692 switch (dm1105dvb->boardnr) { 713 switch (dev->boardnr) {
693 case DM1105_BOARD_DVBWORLD_2004: 714 case DM1105_BOARD_DVBWORLD_2004:
694 dm1105dvb->fe = dvb_attach( 715 dev->fe = dvb_attach(
695 cx24116_attach, &serit_sp2633_config, 716 cx24116_attach, &serit_sp2633_config,
696 &dm1105dvb->i2c_adap); 717 &dev->i2c_adap);
697 if (dm1105dvb->fe) 718 if (dev->fe) {
698 dm1105dvb->fe->ops.set_voltage = dm1105dvb_set_voltage; 719 dev->fe->ops.set_voltage = dm1105_set_voltage;
720 break;
721 }
722
723 dev->fe = dvb_attach(
724 ds3000_attach, &dvbworld_ds3000_config,
725 &dev->i2c_adap);
726 if (dev->fe)
727 dev->fe->ops.set_voltage = dm1105_set_voltage;
699 728
700 break; 729 break;
701 case DM1105_BOARD_DVBWORLD_2002: 730 case DM1105_BOARD_DVBWORLD_2002:
702 case DM1105_BOARD_AXESS_DM05: 731 case DM1105_BOARD_AXESS_DM05:
703 default: 732 default:
704 dm1105dvb->fe = dvb_attach( 733 dev->fe = dvb_attach(
705 stv0299_attach, &sharp_z0194a_config, 734 stv0299_attach, &sharp_z0194a_config,
706 &dm1105dvb->i2c_adap); 735 &dev->i2c_adap);
707 if (dm1105dvb->fe) { 736 if (dev->fe) {
708 dm1105dvb->fe->ops.set_voltage = 737 dev->fe->ops.set_voltage = dm1105_set_voltage;
709 dm1105dvb_set_voltage; 738 dvb_attach(dvb_pll_attach, dev->fe, 0x60,
710 dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60, 739 &dev->i2c_adap, DVB_PLL_OPERA1);
711 &dm1105dvb->i2c_adap, DVB_PLL_OPERA1);
712 break; 740 break;
713 } 741 }
714 742
715 dm1105dvb->fe = dvb_attach( 743 dev->fe = dvb_attach(
716 stv0288_attach, &earda_config, 744 stv0288_attach, &earda_config,
717 &dm1105dvb->i2c_adap); 745 &dev->i2c_adap);
718 if (dm1105dvb->fe) { 746 if (dev->fe) {
719 dm1105dvb->fe->ops.set_voltage = 747 dev->fe->ops.set_voltage = dm1105_set_voltage;
720 dm1105dvb_set_voltage; 748 dvb_attach(stb6000_attach, dev->fe, 0x61,
721 dvb_attach(stb6000_attach, dm1105dvb->fe, 0x61, 749 &dev->i2c_adap);
722 &dm1105dvb->i2c_adap);
723 break; 750 break;
724 } 751 }
725 752
726 dm1105dvb->fe = dvb_attach( 753 dev->fe = dvb_attach(
727 si21xx_attach, &serit_config, 754 si21xx_attach, &serit_config,
728 &dm1105dvb->i2c_adap); 755 &dev->i2c_adap);
729 if (dm1105dvb->fe) 756 if (dev->fe)
730 dm1105dvb->fe->ops.set_voltage = 757 dev->fe->ops.set_voltage = dm1105_set_voltage;
731 dm1105dvb_set_voltage;
732 758
733 } 759 }
734 760
735 if (!dm1105dvb->fe) { 761 if (!dev->fe) {
736 dev_err(&dm1105dvb->pdev->dev, "could not attach frontend\n"); 762 dev_err(&dev->pdev->dev, "could not attach frontend\n");
737 return -ENODEV; 763 return -ENODEV;
738 } 764 }
739 765
740 ret = dvb_register_frontend(&dm1105dvb->dvb_adapter, dm1105dvb->fe); 766 ret = dvb_register_frontend(&dev->dvb_adapter, dev->fe);
741 if (ret < 0) { 767 if (ret < 0) {
742 if (dm1105dvb->fe->ops.release) 768 if (dev->fe->ops.release)
743 dm1105dvb->fe->ops.release(dm1105dvb->fe); 769 dev->fe->ops.release(dev->fe);
744 dm1105dvb->fe = NULL; 770 dev->fe = NULL;
745 return ret; 771 return ret;
746 } 772 }
747 773
748 return 0; 774 return 0;
749} 775}
750 776
751static void __devinit dm1105dvb_read_mac(struct dm1105dvb *dm1105dvb, u8 *mac) 777static void __devinit dm1105_read_mac(struct dm1105_dev *dev, u8 *mac)
752{ 778{
753 static u8 command[1] = { 0x28 }; 779 static u8 command[1] = { 0x28 };
754 780
@@ -766,47 +792,47 @@ static void __devinit dm1105dvb_read_mac(struct dm1105dvb *dm1105dvb, u8 *mac)
766 }, 792 },
767 }; 793 };
768 794
769 dm1105_i2c_xfer(&dm1105dvb->i2c_adap, msg , 2); 795 dm1105_i2c_xfer(&dev->i2c_adap, msg , 2);
770 dev_info(&dm1105dvb->pdev->dev, "MAC %pM\n", mac); 796 dev_info(&dev->pdev->dev, "MAC %pM\n", mac);
771} 797}
772 798
773static int __devinit dm1105_probe(struct pci_dev *pdev, 799static int __devinit dm1105_probe(struct pci_dev *pdev,
774 const struct pci_device_id *ent) 800 const struct pci_device_id *ent)
775{ 801{
776 struct dm1105dvb *dm1105dvb; 802 struct dm1105_dev *dev;
777 struct dvb_adapter *dvb_adapter; 803 struct dvb_adapter *dvb_adapter;
778 struct dvb_demux *dvbdemux; 804 struct dvb_demux *dvbdemux;
779 struct dmx_demux *dmx; 805 struct dmx_demux *dmx;
780 int ret = -ENOMEM; 806 int ret = -ENOMEM;
781 int i; 807 int i;
782 808
783 dm1105dvb = kzalloc(sizeof(struct dm1105dvb), GFP_KERNEL); 809 dev = kzalloc(sizeof(struct dm1105_dev), GFP_KERNEL);
784 if (!dm1105dvb) 810 if (!dev)
785 return -ENOMEM; 811 return -ENOMEM;
786 812
787 /* board config */ 813 /* board config */
788 dm1105dvb->nr = dm1105_devcount; 814 dev->nr = dm1105_devcount;
789 dm1105dvb->boardnr = UNSET; 815 dev->boardnr = UNSET;
790 if (card[dm1105dvb->nr] < ARRAY_SIZE(dm1105_boards)) 816 if (card[dev->nr] < ARRAY_SIZE(dm1105_boards))
791 dm1105dvb->boardnr = card[dm1105dvb->nr]; 817 dev->boardnr = card[dev->nr];
792 for (i = 0; UNSET == dm1105dvb->boardnr && 818 for (i = 0; UNSET == dev->boardnr &&
793 i < ARRAY_SIZE(dm1105_subids); i++) 819 i < ARRAY_SIZE(dm1105_subids); i++)
794 if (pdev->subsystem_vendor == 820 if (pdev->subsystem_vendor ==
795 dm1105_subids[i].subvendor && 821 dm1105_subids[i].subvendor &&
796 pdev->subsystem_device == 822 pdev->subsystem_device ==
797 dm1105_subids[i].subdevice) 823 dm1105_subids[i].subdevice)
798 dm1105dvb->boardnr = dm1105_subids[i].card; 824 dev->boardnr = dm1105_subids[i].card;
799 825
800 if (UNSET == dm1105dvb->boardnr) { 826 if (UNSET == dev->boardnr) {
801 dm1105dvb->boardnr = DM1105_BOARD_UNKNOWN; 827 dev->boardnr = DM1105_BOARD_UNKNOWN;
802 dm1105_card_list(pdev); 828 dm1105_card_list(pdev);
803 } 829 }
804 830
805 dm1105_devcount++; 831 dm1105_devcount++;
806 dm1105dvb->pdev = pdev; 832 dev->pdev = pdev;
807 dm1105dvb->buffer_size = 5 * DM1105_DMA_BYTES; 833 dev->buffer_size = 5 * DM1105_DMA_BYTES;
808 dm1105dvb->PacketErrorCount = 0; 834 dev->PacketErrorCount = 0;
809 dm1105dvb->dmarst = 0; 835 dev->dmarst = 0;
810 836
811 ret = pci_enable_device(pdev); 837 ret = pci_enable_device(pdev);
812 if (ret < 0) 838 if (ret < 0)
@@ -822,47 +848,47 @@ static int __devinit dm1105_probe(struct pci_dev *pdev,
822 if (ret < 0) 848 if (ret < 0)
823 goto err_pci_disable_device; 849 goto err_pci_disable_device;
824 850
825 dm1105dvb->io_mem = pci_iomap(pdev, 0, pci_resource_len(pdev, 0)); 851 dev->io_mem = pci_iomap(pdev, 0, pci_resource_len(pdev, 0));
826 if (!dm1105dvb->io_mem) { 852 if (!dev->io_mem) {
827 ret = -EIO; 853 ret = -EIO;
828 goto err_pci_release_regions; 854 goto err_pci_release_regions;
829 } 855 }
830 856
831 spin_lock_init(&dm1105dvb->lock); 857 spin_lock_init(&dev->lock);
832 pci_set_drvdata(pdev, dm1105dvb); 858 pci_set_drvdata(pdev, dev);
833 859
834 ret = dm1105dvb_hw_init(dm1105dvb); 860 ret = dm1105_hw_init(dev);
835 if (ret < 0) 861 if (ret < 0)
836 goto err_pci_iounmap; 862 goto err_pci_iounmap;
837 863
838 /* i2c */ 864 /* i2c */
839 i2c_set_adapdata(&dm1105dvb->i2c_adap, dm1105dvb); 865 i2c_set_adapdata(&dev->i2c_adap, dev);
840 strcpy(dm1105dvb->i2c_adap.name, DRIVER_NAME); 866 strcpy(dev->i2c_adap.name, DRIVER_NAME);
841 dm1105dvb->i2c_adap.owner = THIS_MODULE; 867 dev->i2c_adap.owner = THIS_MODULE;
842 dm1105dvb->i2c_adap.class = I2C_CLASS_TV_DIGITAL; 868 dev->i2c_adap.class = I2C_CLASS_TV_DIGITAL;
843 dm1105dvb->i2c_adap.dev.parent = &pdev->dev; 869 dev->i2c_adap.dev.parent = &pdev->dev;
844 dm1105dvb->i2c_adap.algo = &dm1105_algo; 870 dev->i2c_adap.algo = &dm1105_algo;
845 dm1105dvb->i2c_adap.algo_data = dm1105dvb; 871 dev->i2c_adap.algo_data = dev;
846 ret = i2c_add_adapter(&dm1105dvb->i2c_adap); 872 ret = i2c_add_adapter(&dev->i2c_adap);
847 873
848 if (ret < 0) 874 if (ret < 0)
849 goto err_dm1105dvb_hw_exit; 875 goto err_dm1105_hw_exit;
850 876
851 /* dvb */ 877 /* dvb */
852 ret = dvb_register_adapter(&dm1105dvb->dvb_adapter, DRIVER_NAME, 878 ret = dvb_register_adapter(&dev->dvb_adapter, DRIVER_NAME,
853 THIS_MODULE, &pdev->dev, adapter_nr); 879 THIS_MODULE, &pdev->dev, adapter_nr);
854 if (ret < 0) 880 if (ret < 0)
855 goto err_i2c_del_adapter; 881 goto err_i2c_del_adapter;
856 882
857 dvb_adapter = &dm1105dvb->dvb_adapter; 883 dvb_adapter = &dev->dvb_adapter;
858 884
859 dm1105dvb_read_mac(dm1105dvb, dvb_adapter->proposed_mac); 885 dm1105_read_mac(dev, dvb_adapter->proposed_mac);
860 886
861 dvbdemux = &dm1105dvb->demux; 887 dvbdemux = &dev->demux;
862 dvbdemux->filternum = 256; 888 dvbdemux->filternum = 256;
863 dvbdemux->feednum = 256; 889 dvbdemux->feednum = 256;
864 dvbdemux->start_feed = dm1105dvb_start_feed; 890 dvbdemux->start_feed = dm1105_start_feed;
865 dvbdemux->stop_feed = dm1105dvb_stop_feed; 891 dvbdemux->stop_feed = dm1105_stop_feed;
866 dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | 892 dvbdemux->dmx.capabilities = (DMX_TS_FILTERING |
867 DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING); 893 DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING);
868 ret = dvb_dmx_init(dvbdemux); 894 ret = dvb_dmx_init(dvbdemux);
@@ -870,113 +896,113 @@ static int __devinit dm1105_probe(struct pci_dev *pdev,
870 goto err_dvb_unregister_adapter; 896 goto err_dvb_unregister_adapter;
871 897
872 dmx = &dvbdemux->dmx; 898 dmx = &dvbdemux->dmx;
873 dm1105dvb->dmxdev.filternum = 256; 899 dev->dmxdev.filternum = 256;
874 dm1105dvb->dmxdev.demux = dmx; 900 dev->dmxdev.demux = dmx;
875 dm1105dvb->dmxdev.capabilities = 0; 901 dev->dmxdev.capabilities = 0;
876 902
877 ret = dvb_dmxdev_init(&dm1105dvb->dmxdev, dvb_adapter); 903 ret = dvb_dmxdev_init(&dev->dmxdev, dvb_adapter);
878 if (ret < 0) 904 if (ret < 0)
879 goto err_dvb_dmx_release; 905 goto err_dvb_dmx_release;
880 906
881 dm1105dvb->hw_frontend.source = DMX_FRONTEND_0; 907 dev->hw_frontend.source = DMX_FRONTEND_0;
882 908
883 ret = dmx->add_frontend(dmx, &dm1105dvb->hw_frontend); 909 ret = dmx->add_frontend(dmx, &dev->hw_frontend);
884 if (ret < 0) 910 if (ret < 0)
885 goto err_dvb_dmxdev_release; 911 goto err_dvb_dmxdev_release;
886 912
887 dm1105dvb->mem_frontend.source = DMX_MEMORY_FE; 913 dev->mem_frontend.source = DMX_MEMORY_FE;
888 914
889 ret = dmx->add_frontend(dmx, &dm1105dvb->mem_frontend); 915 ret = dmx->add_frontend(dmx, &dev->mem_frontend);
890 if (ret < 0) 916 if (ret < 0)
891 goto err_remove_hw_frontend; 917 goto err_remove_hw_frontend;
892 918
893 ret = dmx->connect_frontend(dmx, &dm1105dvb->hw_frontend); 919 ret = dmx->connect_frontend(dmx, &dev->hw_frontend);
894 if (ret < 0) 920 if (ret < 0)
895 goto err_remove_mem_frontend; 921 goto err_remove_mem_frontend;
896 922
897 ret = frontend_init(dm1105dvb); 923 ret = frontend_init(dev);
898 if (ret < 0) 924 if (ret < 0)
899 goto err_disconnect_frontend; 925 goto err_disconnect_frontend;
900 926
901 dvb_net_init(dvb_adapter, &dm1105dvb->dvbnet, dmx); 927 dvb_net_init(dvb_adapter, &dev->dvbnet, dmx);
902 dm1105_ir_init(dm1105dvb); 928 dm1105_ir_init(dev);
903 929
904 INIT_WORK(&dm1105dvb->work, dm1105_dmx_buffer); 930 INIT_WORK(&dev->work, dm1105_dmx_buffer);
905 sprintf(dm1105dvb->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); 931 sprintf(dev->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num);
906 dm1105dvb->wq = create_singlethread_workqueue(dm1105dvb->wqn); 932 dev->wq = create_singlethread_workqueue(dev->wqn);
907 if (!dm1105dvb->wq) 933 if (!dev->wq)
908 goto err_dvb_net; 934 goto err_dvb_net;
909 935
910 ret = request_irq(pdev->irq, dm1105dvb_irq, IRQF_SHARED, 936 ret = request_irq(pdev->irq, dm1105_irq, IRQF_SHARED,
911 DRIVER_NAME, dm1105dvb); 937 DRIVER_NAME, dev);
912 if (ret < 0) 938 if (ret < 0)
913 goto err_workqueue; 939 goto err_workqueue;
914 940
915 return 0; 941 return 0;
916 942
917err_workqueue: 943err_workqueue:
918 destroy_workqueue(dm1105dvb->wq); 944 destroy_workqueue(dev->wq);
919err_dvb_net: 945err_dvb_net:
920 dvb_net_release(&dm1105dvb->dvbnet); 946 dvb_net_release(&dev->dvbnet);
921err_disconnect_frontend: 947err_disconnect_frontend:
922 dmx->disconnect_frontend(dmx); 948 dmx->disconnect_frontend(dmx);
923err_remove_mem_frontend: 949err_remove_mem_frontend:
924 dmx->remove_frontend(dmx, &dm1105dvb->mem_frontend); 950 dmx->remove_frontend(dmx, &dev->mem_frontend);
925err_remove_hw_frontend: 951err_remove_hw_frontend:
926 dmx->remove_frontend(dmx, &dm1105dvb->hw_frontend); 952 dmx->remove_frontend(dmx, &dev->hw_frontend);
927err_dvb_dmxdev_release: 953err_dvb_dmxdev_release:
928 dvb_dmxdev_release(&dm1105dvb->dmxdev); 954 dvb_dmxdev_release(&dev->dmxdev);
929err_dvb_dmx_release: 955err_dvb_dmx_release:
930 dvb_dmx_release(dvbdemux); 956 dvb_dmx_release(dvbdemux);
931err_dvb_unregister_adapter: 957err_dvb_unregister_adapter:
932 dvb_unregister_adapter(dvb_adapter); 958 dvb_unregister_adapter(dvb_adapter);
933err_i2c_del_adapter: 959err_i2c_del_adapter:
934 i2c_del_adapter(&dm1105dvb->i2c_adap); 960 i2c_del_adapter(&dev->i2c_adap);
935err_dm1105dvb_hw_exit: 961err_dm1105_hw_exit:
936 dm1105dvb_hw_exit(dm1105dvb); 962 dm1105_hw_exit(dev);
937err_pci_iounmap: 963err_pci_iounmap:
938 pci_iounmap(pdev, dm1105dvb->io_mem); 964 pci_iounmap(pdev, dev->io_mem);
939err_pci_release_regions: 965err_pci_release_regions:
940 pci_release_regions(pdev); 966 pci_release_regions(pdev);
941err_pci_disable_device: 967err_pci_disable_device:
942 pci_disable_device(pdev); 968 pci_disable_device(pdev);
943err_kfree: 969err_kfree:
944 pci_set_drvdata(pdev, NULL); 970 pci_set_drvdata(pdev, NULL);
945 kfree(dm1105dvb); 971 kfree(dev);
946 return ret; 972 return ret;
947} 973}
948 974
949static void __devexit dm1105_remove(struct pci_dev *pdev) 975static void __devexit dm1105_remove(struct pci_dev *pdev)
950{ 976{
951 struct dm1105dvb *dm1105dvb = pci_get_drvdata(pdev); 977 struct dm1105_dev *dev = pci_get_drvdata(pdev);
952 struct dvb_adapter *dvb_adapter = &dm1105dvb->dvb_adapter; 978 struct dvb_adapter *dvb_adapter = &dev->dvb_adapter;
953 struct dvb_demux *dvbdemux = &dm1105dvb->demux; 979 struct dvb_demux *dvbdemux = &dev->demux;
954 struct dmx_demux *dmx = &dvbdemux->dmx; 980 struct dmx_demux *dmx = &dvbdemux->dmx;
955 981
956 dm1105_ir_exit(dm1105dvb); 982 dm1105_ir_exit(dev);
957 dmx->close(dmx); 983 dmx->close(dmx);
958 dvb_net_release(&dm1105dvb->dvbnet); 984 dvb_net_release(&dev->dvbnet);
959 if (dm1105dvb->fe) 985 if (dev->fe)
960 dvb_unregister_frontend(dm1105dvb->fe); 986 dvb_unregister_frontend(dev->fe);
961 987
962 dmx->disconnect_frontend(dmx); 988 dmx->disconnect_frontend(dmx);
963 dmx->remove_frontend(dmx, &dm1105dvb->mem_frontend); 989 dmx->remove_frontend(dmx, &dev->mem_frontend);
964 dmx->remove_frontend(dmx, &dm1105dvb->hw_frontend); 990 dmx->remove_frontend(dmx, &dev->hw_frontend);
965 dvb_dmxdev_release(&dm1105dvb->dmxdev); 991 dvb_dmxdev_release(&dev->dmxdev);
966 dvb_dmx_release(dvbdemux); 992 dvb_dmx_release(dvbdemux);
967 dvb_unregister_adapter(dvb_adapter); 993 dvb_unregister_adapter(dvb_adapter);
968 if (&dm1105dvb->i2c_adap) 994 if (&dev->i2c_adap)
969 i2c_del_adapter(&dm1105dvb->i2c_adap); 995 i2c_del_adapter(&dev->i2c_adap);
970 996
971 dm1105dvb_hw_exit(dm1105dvb); 997 dm1105_hw_exit(dev);
972 synchronize_irq(pdev->irq); 998 synchronize_irq(pdev->irq);
973 free_irq(pdev->irq, dm1105dvb); 999 free_irq(pdev->irq, dev);
974 pci_iounmap(pdev, dm1105dvb->io_mem); 1000 pci_iounmap(pdev, dev->io_mem);
975 pci_release_regions(pdev); 1001 pci_release_regions(pdev);
976 pci_disable_device(pdev); 1002 pci_disable_device(pdev);
977 pci_set_drvdata(pdev, NULL); 1003 pci_set_drvdata(pdev, NULL);
978 dm1105_devcount--; 1004 dm1105_devcount--;
979 kfree(dm1105dvb); 1005 kfree(dev);
980} 1006}
981 1007
982static struct pci_device_id dm1105_id_table[] __devinitdata = { 1008static struct pci_device_id dm1105_id_table[] __devinitdata = {
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
index c37790ad92d0..9ddc57909d49 100644
--- a/drivers/media/dvb/dvb-core/dmxdev.c
+++ b/drivers/media/dvb/dvb-core/dmxdev.c
@@ -761,7 +761,6 @@ static int dvb_demux_open(struct inode *inode, struct file *file)
761 dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192); 761 dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192);
762 dmxdevfilter->type = DMXDEV_TYPE_NONE; 762 dmxdevfilter->type = DMXDEV_TYPE_NONE;
763 dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED); 763 dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
764 INIT_LIST_HEAD(&dmxdevfilter->feed.ts);
765 init_timer(&dmxdevfilter->timer); 764 init_timer(&dmxdevfilter->timer);
766 765
767 dvbdev->users++; 766 dvbdev->users++;
@@ -887,6 +886,7 @@ static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev,
887 dmxdevfilter->type = DMXDEV_TYPE_PES; 886 dmxdevfilter->type = DMXDEV_TYPE_PES;
888 memcpy(&dmxdevfilter->params, params, 887 memcpy(&dmxdevfilter->params, params,
889 sizeof(struct dmx_pes_filter_params)); 888 sizeof(struct dmx_pes_filter_params));
889 INIT_LIST_HEAD(&dmxdevfilter->feed.ts);
890 890
891 dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET); 891 dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
892 892
diff --git a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h
index c1379b56dfb4..02ebe28f830d 100644
--- a/drivers/media/dvb/dvb-core/dmxdev.h
+++ b/drivers/media/dvb/dvb-core/dmxdev.h
@@ -31,6 +31,7 @@
31#include <linux/fs.h> 31#include <linux/fs.h>
32#include <linux/string.h> 32#include <linux/string.h>
33#include <linux/mutex.h> 33#include <linux/mutex.h>
34#include <linux/slab.h>
34 35
35#include <linux/dvb/dmx.h> 36#include <linux/dvb/dmx.h>
36 37
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c
index 91c537bca8ad..67f189b7aa1f 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.c
+++ b/drivers/media/dvb/dvb-core/dvb_demux.c
@@ -30,6 +30,7 @@
30#include <linux/string.h> 30#include <linux/string.h>
31#include <linux/crc32.h> 31#include <linux/crc32.h>
32#include <asm/uaccess.h> 32#include <asm/uaccess.h>
33#include <asm/div64.h>
33 34
34#include "dvb_demux.h" 35#include "dvb_demux.h"
35 36
@@ -44,6 +45,11 @@ module_param(dvb_demux_tscheck, int, 0644);
44MODULE_PARM_DESC(dvb_demux_tscheck, 45MODULE_PARM_DESC(dvb_demux_tscheck,
45 "enable transport stream continuity and TEI check"); 46 "enable transport stream continuity and TEI check");
46 47
48static int dvb_demux_speedcheck;
49module_param(dvb_demux_speedcheck, int, 0644);
50MODULE_PARM_DESC(dvb_demux_speedcheck,
51 "enable transport stream speed check");
52
47#define dprintk_tscheck(x...) do { \ 53#define dprintk_tscheck(x...) do { \
48 if (dvb_demux_tscheck && printk_ratelimit()) \ 54 if (dvb_demux_tscheck && printk_ratelimit()) \
49 printk(x); \ 55 printk(x); \
@@ -387,16 +393,40 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
387 u16 pid = ts_pid(buf); 393 u16 pid = ts_pid(buf);
388 int dvr_done = 0; 394 int dvr_done = 0;
389 395
390 if (dvb_demux_tscheck) { 396 if (dvb_demux_speedcheck) {
391 if (!demux->cnt_storage) 397 struct timespec cur_time, delta_time;
392 demux->cnt_storage = vmalloc(MAX_PID + 1); 398 u64 speed_bytes, speed_timedelta;
393 399
394 if (!demux->cnt_storage) { 400 demux->speed_pkts_cnt++;
395 printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n"); 401
396 dvb_demux_tscheck = 0; 402 /* show speed every SPEED_PKTS_INTERVAL packets */
397 goto no_dvb_demux_tscheck; 403 if (!(demux->speed_pkts_cnt % SPEED_PKTS_INTERVAL)) {
398 } 404 cur_time = current_kernel_time();
405
406 if (demux->speed_last_time.tv_sec != 0 &&
407 demux->speed_last_time.tv_nsec != 0) {
408 delta_time = timespec_sub(cur_time,
409 demux->speed_last_time);
410 speed_bytes = (u64)demux->speed_pkts_cnt
411 * 188 * 8;
412 /* convert to 1024 basis */
413 speed_bytes = 1000 * div64_u64(speed_bytes,
414 1024);
415 speed_timedelta =
416 (u64)timespec_to_ns(&delta_time);
417 speed_timedelta = div64_u64(speed_timedelta,
418 1000000); /* nsec -> usec */
419 printk(KERN_INFO "TS speed %llu Kbits/sec \n",
420 div64_u64(speed_bytes,
421 speed_timedelta));
422 };
423
424 demux->speed_last_time = cur_time;
425 demux->speed_pkts_cnt = 0;
426 };
427 };
399 428
429 if (demux->cnt_storage) {
400 /* check pkt counter */ 430 /* check pkt counter */
401 if (pid < MAX_PID) { 431 if (pid < MAX_PID) {
402 if (buf[1] & 0x80) 432 if (buf[1] & 0x80)
@@ -415,7 +445,6 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
415 }; 445 };
416 /* end check */ 446 /* end check */
417 }; 447 };
418no_dvb_demux_tscheck:
419 448
420 list_for_each_entry(feed, &demux->feed_list, list_head) { 449 list_for_each_entry(feed, &demux->feed_list, list_head) {
421 if ((feed->pid != pid) && (feed->pid != 0x2000)) 450 if ((feed->pid != pid) && (feed->pid != 0x2000))
@@ -1207,6 +1236,7 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
1207 dvbdemux->feed = vmalloc(dvbdemux->feednum * sizeof(struct dvb_demux_feed)); 1236 dvbdemux->feed = vmalloc(dvbdemux->feednum * sizeof(struct dvb_demux_feed));
1208 if (!dvbdemux->feed) { 1237 if (!dvbdemux->feed) {
1209 vfree(dvbdemux->filter); 1238 vfree(dvbdemux->filter);
1239 dvbdemux->filter = NULL;
1210 return -ENOMEM; 1240 return -ENOMEM;
1211 } 1241 }
1212 for (i = 0; i < dvbdemux->filternum; i++) { 1242 for (i = 0; i < dvbdemux->filternum; i++) {
@@ -1218,6 +1248,13 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
1218 dvbdemux->feed[i].index = i; 1248 dvbdemux->feed[i].index = i;
1219 } 1249 }
1220 1250
1251 if (dvb_demux_tscheck) {
1252 dvbdemux->cnt_storage = vmalloc(MAX_PID + 1);
1253
1254 if (!dvbdemux->cnt_storage)
1255 printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n");
1256 }
1257
1221 INIT_LIST_HEAD(&dvbdemux->frontend_list); 1258 INIT_LIST_HEAD(&dvbdemux->frontend_list);
1222 1259
1223 for (i = 0; i < DMX_TS_PES_OTHER; i++) { 1260 for (i = 0; i < DMX_TS_PES_OTHER; i++) {
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h
index 2fe05d03240d..a7d876fd02dd 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.h
+++ b/drivers/media/dvb/dvb-core/dvb_demux.h
@@ -44,6 +44,8 @@
44 44
45#define MAX_PID 0x1fff 45#define MAX_PID 0x1fff
46 46
47#define SPEED_PKTS_INTERVAL 50000
48
47struct dvb_demux_filter { 49struct dvb_demux_filter {
48 struct dmx_section_filter filter; 50 struct dmx_section_filter filter;
49 u8 maskandmode[DMX_MAX_FILTER_SIZE]; 51 u8 maskandmode[DMX_MAX_FILTER_SIZE];
@@ -131,6 +133,9 @@ struct dvb_demux {
131 spinlock_t lock; 133 spinlock_t lock;
132 134
133 uint8_t *cnt_storage; /* for TS continuity check */ 135 uint8_t *cnt_storage; /* for TS continuity check */
136
137 struct timespec speed_last_time; /* for TS speed check */
138 uint32_t speed_pkts_cnt; /* for TS speed check */
134}; 139};
135 140
136int dvb_dmx_init(struct dvb_demux *dvbdemux); 141int dvb_dmx_init(struct dvb_demux *dvbdemux);
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
index 98082416aa52..55ea260572bf 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -895,104 +895,27 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
895} 895}
896 896
897static struct dtv_cmds_h dtv_cmds[] = { 897static struct dtv_cmds_h dtv_cmds[] = {
898 [DTV_TUNE] = { 898 _DTV_CMD(DTV_TUNE, 1, 0),
899 .name = "DTV_TUNE", 899 _DTV_CMD(DTV_CLEAR, 1, 0),
900 .cmd = DTV_TUNE,
901 .set = 1,
902 },
903 [DTV_CLEAR] = {
904 .name = "DTV_CLEAR",
905 .cmd = DTV_CLEAR,
906 .set = 1,
907 },
908 900
909 /* Set */ 901 /* Set */
910 [DTV_FREQUENCY] = { 902 _DTV_CMD(DTV_FREQUENCY, 1, 0),
911 .name = "DTV_FREQUENCY", 903 _DTV_CMD(DTV_BANDWIDTH_HZ, 1, 0),
912 .cmd = DTV_FREQUENCY, 904 _DTV_CMD(DTV_MODULATION, 1, 0),
913 .set = 1, 905 _DTV_CMD(DTV_INVERSION, 1, 0),
914 }, 906 _DTV_CMD(DTV_DISEQC_MASTER, 1, 1),
915 [DTV_BANDWIDTH_HZ] = { 907 _DTV_CMD(DTV_SYMBOL_RATE, 1, 0),
916 .name = "DTV_BANDWIDTH_HZ", 908 _DTV_CMD(DTV_INNER_FEC, 1, 0),
917 .cmd = DTV_BANDWIDTH_HZ, 909 _DTV_CMD(DTV_VOLTAGE, 1, 0),
918 .set = 1, 910 _DTV_CMD(DTV_TONE, 1, 0),
919 }, 911 _DTV_CMD(DTV_PILOT, 1, 0),
920 [DTV_MODULATION] = { 912 _DTV_CMD(DTV_ROLLOFF, 1, 0),
921 .name = "DTV_MODULATION", 913 _DTV_CMD(DTV_DELIVERY_SYSTEM, 1, 0),
922 .cmd = DTV_MODULATION, 914 _DTV_CMD(DTV_HIERARCHY, 1, 0),
923 .set = 1, 915 _DTV_CMD(DTV_CODE_RATE_HP, 1, 0),
924 }, 916 _DTV_CMD(DTV_CODE_RATE_LP, 1, 0),
925 [DTV_INVERSION] = { 917 _DTV_CMD(DTV_GUARD_INTERVAL, 1, 0),
926 .name = "DTV_INVERSION", 918 _DTV_CMD(DTV_TRANSMISSION_MODE, 1, 0),
927 .cmd = DTV_INVERSION,
928 .set = 1,
929 },
930 [DTV_DISEQC_MASTER] = {
931 .name = "DTV_DISEQC_MASTER",
932 .cmd = DTV_DISEQC_MASTER,
933 .set = 1,
934 .buffer = 1,
935 },
936 [DTV_SYMBOL_RATE] = {
937 .name = "DTV_SYMBOL_RATE",
938 .cmd = DTV_SYMBOL_RATE,
939 .set = 1,
940 },
941 [DTV_INNER_FEC] = {
942 .name = "DTV_INNER_FEC",
943 .cmd = DTV_INNER_FEC,
944 .set = 1,
945 },
946 [DTV_VOLTAGE] = {
947 .name = "DTV_VOLTAGE",
948 .cmd = DTV_VOLTAGE,
949 .set = 1,
950 },
951 [DTV_TONE] = {
952 .name = "DTV_TONE",
953 .cmd = DTV_TONE,
954 .set = 1,
955 },
956 [DTV_PILOT] = {
957 .name = "DTV_PILOT",
958 .cmd = DTV_PILOT,
959 .set = 1,
960 },
961 [DTV_ROLLOFF] = {
962 .name = "DTV_ROLLOFF",
963 .cmd = DTV_ROLLOFF,
964 .set = 1,
965 },
966 [DTV_DELIVERY_SYSTEM] = {
967 .name = "DTV_DELIVERY_SYSTEM",
968 .cmd = DTV_DELIVERY_SYSTEM,
969 .set = 1,
970 },
971 [DTV_HIERARCHY] = {
972 .name = "DTV_HIERARCHY",
973 .cmd = DTV_HIERARCHY,
974 .set = 1,
975 },
976 [DTV_CODE_RATE_HP] = {
977 .name = "DTV_CODE_RATE_HP",
978 .cmd = DTV_CODE_RATE_HP,
979 .set = 1,
980 },
981 [DTV_CODE_RATE_LP] = {
982 .name = "DTV_CODE_RATE_LP",
983 .cmd = DTV_CODE_RATE_LP,
984 .set = 1,
985 },
986 [DTV_GUARD_INTERVAL] = {
987 .name = "DTV_GUARD_INTERVAL",
988 .cmd = DTV_GUARD_INTERVAL,
989 .set = 1,
990 },
991 [DTV_TRANSMISSION_MODE] = {
992 .name = "DTV_TRANSMISSION_MODE",
993 .cmd = DTV_TRANSMISSION_MODE,
994 .set = 1,
995 },
996 919
997 _DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0), 920 _DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0),
998 _DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0), 921 _DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0),
@@ -1035,43 +958,13 @@ static struct dtv_cmds_h dtv_cmds[] = {
1035 _DTV_CMD(DTV_ISDBS_TS_ID, 1, 0), 958 _DTV_CMD(DTV_ISDBS_TS_ID, 1, 0),
1036 959
1037 /* Get */ 960 /* Get */
1038 [DTV_DISEQC_SLAVE_REPLY] = { 961 _DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
1039 .name = "DTV_DISEQC_SLAVE_REPLY", 962 _DTV_CMD(DTV_API_VERSION, 0, 0),
1040 .cmd = DTV_DISEQC_SLAVE_REPLY, 963 _DTV_CMD(DTV_CODE_RATE_HP, 0, 0),
1041 .set = 0, 964 _DTV_CMD(DTV_CODE_RATE_LP, 0, 0),
1042 .buffer = 1, 965 _DTV_CMD(DTV_GUARD_INTERVAL, 0, 0),
1043 }, 966 _DTV_CMD(DTV_TRANSMISSION_MODE, 0, 0),
1044 967 _DTV_CMD(DTV_HIERARCHY, 0, 0),
1045 [DTV_API_VERSION] = {
1046 .name = "DTV_API_VERSION",
1047 .cmd = DTV_API_VERSION,
1048 .set = 0,
1049 },
1050 [DTV_CODE_RATE_HP] = {
1051 .name = "DTV_CODE_RATE_HP",
1052 .cmd = DTV_CODE_RATE_HP,
1053 .set = 0,
1054 },
1055 [DTV_CODE_RATE_LP] = {
1056 .name = "DTV_CODE_RATE_LP",
1057 .cmd = DTV_CODE_RATE_LP,
1058 .set = 0,
1059 },
1060 [DTV_GUARD_INTERVAL] = {
1061 .name = "DTV_GUARD_INTERVAL",
1062 .cmd = DTV_GUARD_INTERVAL,
1063 .set = 0,
1064 },
1065 [DTV_TRANSMISSION_MODE] = {
1066 .name = "DTV_TRANSMISSION_MODE",
1067 .cmd = DTV_TRANSMISSION_MODE,
1068 .set = 0,
1069 },
1070 [DTV_HIERARCHY] = {
1071 .name = "DTV_HIERARCHY",
1072 .cmd = DTV_HIERARCHY,
1073 .set = 0,
1074 },
1075}; 968};
1076 969
1077static void dtv_property_dump(struct dtv_property *tvp) 970static void dtv_property_dump(struct dtv_property *tvp)
@@ -1306,8 +1199,6 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
1306{ 1199{
1307 int r = 0; 1200 int r = 0;
1308 1201
1309 dtv_property_dump(tvp);
1310
1311 /* Allow the frontend to validate incoming properties */ 1202 /* Allow the frontend to validate incoming properties */
1312 if (fe->ops.get_property) 1203 if (fe->ops.get_property)
1313 r = fe->ops.get_property(fe, tvp); 1204 r = fe->ops.get_property(fe, tvp);
@@ -1430,6 +1321,8 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
1430 r = -1; 1321 r = -1;
1431 } 1322 }
1432 1323
1324 dtv_property_dump(tvp);
1325
1433 return r; 1326 return r;
1434} 1327}
1435 1328
@@ -1595,7 +1488,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
1595 struct dvb_frontend_private *fepriv = fe->frontend_priv; 1488 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1596 int err = -EOPNOTSUPP; 1489 int err = -EOPNOTSUPP;
1597 1490
1598 dprintk ("%s\n", __func__); 1491 dprintk("%s (%d)\n", __func__, _IOC_NR(cmd));
1599 1492
1600 if (fepriv->exit) 1493 if (fepriv->exit)
1601 return -ENODEV; 1494 return -ENODEV;
@@ -1643,8 +1536,7 @@ static int dvb_frontend_ioctl_properties(struct inode *inode, struct file *file,
1643 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS)) 1536 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1644 return -EINVAL; 1537 return -EINVAL;
1645 1538
1646 tvp = (struct dtv_property *) kmalloc(tvps->num * 1539 tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1647 sizeof(struct dtv_property), GFP_KERNEL);
1648 if (!tvp) { 1540 if (!tvp) {
1649 err = -ENOMEM; 1541 err = -ENOMEM;
1650 goto out; 1542 goto out;
@@ -1676,8 +1568,7 @@ static int dvb_frontend_ioctl_properties(struct inode *inode, struct file *file,
1676 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS)) 1568 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
1677 return -EINVAL; 1569 return -EINVAL;
1678 1570
1679 tvp = (struct dtv_property *) kmalloc(tvps->num * 1571 tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
1680 sizeof(struct dtv_property), GFP_KERNEL);
1681 if (!tvp) { 1572 if (!tvp) {
1682 err = -ENOMEM; 1573 err = -ENOMEM;
1683 goto out; 1574 goto out;
@@ -1712,7 +1603,18 @@ static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
1712 struct dvb_device *dvbdev = file->private_data; 1603 struct dvb_device *dvbdev = file->private_data;
1713 struct dvb_frontend *fe = dvbdev->priv; 1604 struct dvb_frontend *fe = dvbdev->priv;
1714 struct dvb_frontend_private *fepriv = fe->frontend_priv; 1605 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1715 int err = -EOPNOTSUPP; 1606 int cb_err, err = -EOPNOTSUPP;
1607
1608 if (fe->dvb->fe_ioctl_override) {
1609 cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
1610 DVB_FE_IOCTL_PRE);
1611 if (cb_err < 0)
1612 return cb_err;
1613 if (cb_err > 0)
1614 return 0;
1615 /* fe_ioctl_override returning 0 allows
1616 * dvb-core to continue handling the ioctl */
1617 }
1716 1618
1717 switch (cmd) { 1619 switch (cmd) {
1718 case FE_GET_INFO: { 1620 case FE_GET_INFO: {
@@ -1978,6 +1880,13 @@ static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
1978 break; 1880 break;
1979 }; 1881 };
1980 1882
1883 if (fe->dvb->fe_ioctl_override) {
1884 cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
1885 DVB_FE_IOCTL_POST);
1886 if (cb_err < 0)
1887 return cb_err;
1888 }
1889
1981 return err; 1890 return err;
1982} 1891}
1983 1892
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
index 810f07d63246..bf0e6bed28dd 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h
@@ -36,6 +36,7 @@
36#include <linux/errno.h> 36#include <linux/errno.h>
37#include <linux/delay.h> 37#include <linux/delay.h>
38#include <linux/mutex.h> 38#include <linux/mutex.h>
39#include <linux/slab.h>
39 40
40#include <linux/dvb/frontend.h> 41#include <linux/dvb/frontend.h>
41 42
@@ -160,7 +161,7 @@ struct tuner_state {
160 * search callback possible return status 161 * search callback possible return status
161 * 162 *
162 * DVBFE_ALGO_SEARCH_SUCCESS 163 * DVBFE_ALGO_SEARCH_SUCCESS
163 * The frontend search algorithm completed and returned succesfully 164 * The frontend search algorithm completed and returned successfully
164 * 165 *
165 * DVBFE_ALGO_SEARCH_ASLEEP 166 * DVBFE_ALGO_SEARCH_ASLEEP
166 * The frontend search algorithm is sleeping 167 * The frontend search algorithm is sleeping
@@ -214,14 +215,14 @@ struct dvb_tuner_ops {
214 int (*get_status)(struct dvb_frontend *fe, u32 *status); 215 int (*get_status)(struct dvb_frontend *fe, u32 *status);
215 int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength); 216 int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
216 217
217 /** These are provided seperately from set_params in order to facilitate silicon 218 /** These are provided separately from set_params in order to facilitate silicon
218 * tuners which require sophisticated tuning loops, controlling each parameter seperately. */ 219 * tuners which require sophisticated tuning loops, controlling each parameter separately. */
219 int (*set_frequency)(struct dvb_frontend *fe, u32 frequency); 220 int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
220 int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth); 221 int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
221 222
222 /* 223 /*
223 * These are provided seperately from set_params in order to facilitate silicon 224 * These are provided separately from set_params in order to facilitate silicon
224 * tuners which require sophisticated tuning loops, controlling each parameter seperately. 225 * tuners which require sophisticated tuning loops, controlling each parameter separately.
225 */ 226 */
226 int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state); 227 int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
227 int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state); 228 int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c
index 0241a7c5c34a..441c0642b30a 100644
--- a/drivers/media/dvb/dvb-core/dvb_net.c
+++ b/drivers/media/dvb/dvb-core/dvb_net.c
@@ -504,6 +504,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
504 "bytes left in TS. Resyncing.\n", ts_remain); 504 "bytes left in TS. Resyncing.\n", ts_remain);
505 priv->ule_sndu_len = 0; 505 priv->ule_sndu_len = 0;
506 priv->need_pusi = 1; 506 priv->need_pusi = 1;
507 ts += TS_SZ;
507 continue; 508 continue;
508 } 509 }
509 510
@@ -949,11 +950,8 @@ static int dvb_net_filter_sec_set(struct net_device *dev,
949 (*secfilter)->filter_mask[10] = mac_mask[1]; 950 (*secfilter)->filter_mask[10] = mac_mask[1];
950 (*secfilter)->filter_mask[11]=mac_mask[0]; 951 (*secfilter)->filter_mask[11]=mac_mask[0];
951 952
952 dprintk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n", 953 dprintk("%s: filter mac=%pM\n", dev->name, mac);
953 dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 954 dprintk("%s: filter mask=%pM\n", dev->name, mac_mask);
954 dprintk("%s: filter mask=%02x %02x %02x %02x %02x %02x\n",
955 dev->name, mac_mask[0], mac_mask[1], mac_mask[2],
956 mac_mask[3], mac_mask[4], mac_mask[5]);
957 955
958 return 0; 956 return 0;
959} 957}
@@ -1141,18 +1139,18 @@ static void wq_set_multicast_list (struct work_struct *work)
1141 } else if ((dev->flags & IFF_ALLMULTI)) { 1139 } else if ((dev->flags & IFF_ALLMULTI)) {
1142 dprintk("%s: allmulti mode\n", dev->name); 1140 dprintk("%s: allmulti mode\n", dev->name);
1143 priv->rx_mode = RX_MODE_ALL_MULTI; 1141 priv->rx_mode = RX_MODE_ALL_MULTI;
1144 } else if (dev->mc_count) { 1142 } else if (!netdev_mc_empty(dev)) {
1145 int mci; 1143 int mci;
1146 struct dev_mc_list *mc; 1144 struct dev_mc_list *mc;
1147 1145
1148 dprintk("%s: set_mc_list, %d entries\n", 1146 dprintk("%s: set_mc_list, %d entries\n",
1149 dev->name, dev->mc_count); 1147 dev->name, netdev_mc_count(dev));
1150 1148
1151 priv->rx_mode = RX_MODE_MULTI; 1149 priv->rx_mode = RX_MODE_MULTI;
1152 priv->multi_num = 0; 1150 priv->multi_num = 0;
1153 1151
1154 for (mci = 0, mc=dev->mc_list; 1152 for (mci = 0, mc=dev->mc_list;
1155 mci < dev->mc_count; 1153 mci < netdev_mc_count(dev);
1156 mc = mc->next, mci++) { 1154 mc = mc->next, mci++) {
1157 dvb_set_mc_filter(dev, mc); 1155 dvb_set_mc_filter(dev, mc);
1158 } 1156 }
@@ -1239,7 +1237,6 @@ static void dvb_net_setup(struct net_device *dev)
1239 dev->header_ops = &dvb_header_ops; 1237 dev->header_ops = &dvb_header_ops;
1240 dev->netdev_ops = &dvb_netdev_ops; 1238 dev->netdev_ops = &dvb_netdev_ops;
1241 dev->mtu = 4096; 1239 dev->mtu = 4096;
1242 dev->mc_count = 0;
1243 1240
1244 dev->flags |= IFF_NOARP; 1241 dev->flags |= IFF_NOARP;
1245} 1242}
@@ -1396,7 +1393,7 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
1396 return ret; 1393 return ret;
1397 } 1394 }
1398 1395
1399 /* binary compatiblity cruft */ 1396 /* binary compatibility cruft */
1400 case __NET_ADD_IF_OLD: 1397 case __NET_ADD_IF_OLD:
1401 { 1398 {
1402 struct __dvb_net_if_old *dvbnetif = parg; 1399 struct __dvb_net_if_old *dvbnetif = parg;
diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
index 584bbd194dc8..a5712cd7c65f 100644
--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
@@ -89,6 +89,7 @@ void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
89 rbuf->pread = rbuf->pwrite; 89 rbuf->pread = rbuf->pwrite;
90 rbuf->error = 0; 90 rbuf->error = 0;
91} 91}
92EXPORT_SYMBOL(dvb_ringbuffer_flush);
92 93
93void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf) 94void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf)
94{ 95{
diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h
index 01fc70484743..f7b499d4a3c0 100644
--- a/drivers/media/dvb/dvb-core/dvbdev.h
+++ b/drivers/media/dvb/dvb-core/dvbdev.h
@@ -54,6 +54,8 @@
54 module_param_array(adapter_nr, short, NULL, 0444); \ 54 module_param_array(adapter_nr, short, NULL, 0444); \
55 MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers") 55 MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers")
56 56
57struct dvb_frontend;
58
57struct dvb_adapter { 59struct dvb_adapter {
58 int num; 60 int num;
59 struct list_head list_head; 61 struct list_head list_head;
@@ -69,6 +71,32 @@ struct dvb_adapter {
69 int mfe_shared; /* indicates mutually exclusive frontends */ 71 int mfe_shared; /* indicates mutually exclusive frontends */
70 struct dvb_device *mfe_dvbdev; /* frontend device in use */ 72 struct dvb_device *mfe_dvbdev; /* frontend device in use */
71 struct mutex mfe_lock; /* access lock for thread creation */ 73 struct mutex mfe_lock; /* access lock for thread creation */
74
75 /* Allow the adapter/bridge driver to perform an action before and/or
76 * after the core handles an ioctl:
77 *
78 * DVB_FE_IOCTL_PRE indicates that the ioctl has not yet been handled.
79 * DVB_FE_IOCTL_POST indicates that the ioctl has been handled.
80 *
81 * When DVB_FE_IOCTL_PRE is passed to the callback as the stage arg:
82 *
83 * return 0 to allow dvb-core to handle the ioctl.
84 * return a positive int to prevent dvb-core from handling the ioctl,
85 * and exit without error.
86 * return a negative int to prevent dvb-core from handling the ioctl,
87 * and return that value as an error.
88 *
89 * When DVB_FE_IOCTL_POST is passed to the callback as the stage arg:
90 *
91 * return 0 to allow the dvb_frontend ioctl handler to exit normally.
92 * return a negative int to cause the dvb_frontend ioctl handler to
93 * return that value as an error.
94 */
95#define DVB_FE_IOCTL_PRE 0
96#define DVB_FE_IOCTL_POST 1
97 int (*fe_ioctl_override)(struct dvb_frontend *fe,
98 unsigned int cmd, void *parg,
99 unsigned int stage);
72}; 100};
73 101
74 102
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index 0e4b97fba384..e5f91f16ffa4 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -112,11 +112,13 @@ config DVB_USB_CXUSB
112 select DVB_MT352 if !DVB_FE_CUSTOMISE 112 select DVB_MT352 if !DVB_FE_CUSTOMISE
113 select DVB_ZL10353 if !DVB_FE_CUSTOMISE 113 select DVB_ZL10353 if !DVB_FE_CUSTOMISE
114 select DVB_DIB7000P if !DVB_FE_CUSTOMISE 114 select DVB_DIB7000P if !DVB_FE_CUSTOMISE
115 select DVB_LGS8GL5 if !DVB_FE_CUSTOMISE
116 select DVB_TUNER_DIB0070 if !DVB_FE_CUSTOMISE 115 select DVB_TUNER_DIB0070 if !DVB_FE_CUSTOMISE
116 select DVB_ATBM8830 if !DVB_FE_CUSTOMISE
117 select DVB_LGS8GXX if !DVB_FE_CUSTOMISE
117 select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMISE 118 select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMISE
118 select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE 119 select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE
119 select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE 120 select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
121 select MEDIA_TUNER_MAX2165 if !MEDIA_TUNER_CUSTOMISE
120 help 122 help
121 Say Y here to support the Conexant USB2.0 hybrid reference design. 123 Say Y here to support the Conexant USB2.0 hybrid reference design.
122 Currently, only DVB and ATSC modes are supported, analog mode 124 Currently, only DVB and ATSC modes are supported, analog mode
@@ -265,9 +267,13 @@ config DVB_USB_DW2102
265 select DVB_TDA10021 if !DVB_FE_CUSTOMISE 267 select DVB_TDA10021 if !DVB_FE_CUSTOMISE
266 select DVB_MT312 if !DVB_FE_CUSTOMISE 268 select DVB_MT312 if !DVB_FE_CUSTOMISE
267 select DVB_ZL10039 if !DVB_FE_CUSTOMISE 269 select DVB_ZL10039 if !DVB_FE_CUSTOMISE
270 select DVB_DS3000 if !DVB_FE_CUSTOMISE
271 select DVB_STB6100 if !DVB_FE_CUSTOMISE
272 select DVB_STV6110 if !DVB_FE_CUSTOMISE
273 select DVB_STV0900 if !DVB_FE_CUSTOMISE
268 help 274 help
269 Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers 275 Say Y here to support the DvbWorld, TeVii, Prof DVB-S/S2 USB2.0
270 and the TeVii S650, S630. 276 receivers.
271 277
272config DVB_USB_CINERGY_T2 278config DVB_USB_CINERGY_T2
273 tristate "Terratec CinergyT2/qanu USB 2.0 DVB-T receiver" 279 tristate "Terratec CinergyT2/qanu USB 2.0 DVB-T receiver"
@@ -322,3 +328,19 @@ config DVB_USB_FRIIO
322 depends on DVB_USB 328 depends on DVB_USB
323 help 329 help
324 Say Y here to support the Japanese DTV receiver Friio. 330 Say Y here to support the Japanese DTV receiver Friio.
331
332config DVB_USB_EC168
333 tristate "E3C EC168 DVB-T USB2.0 support"
334 depends on DVB_USB && EXPERIMENTAL
335 select DVB_EC100
336 select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
337 help
338 Say Y here to support the E3C EC168 DVB-T USB2.0 receiver.
339
340config DVB_USB_AZ6027
341 tristate "Azurewave DVB-S/S2 USB2.0 AZ6027 support"
342 depends on DVB_USB
343 select DVB_STB0899 if !DVB_FE_CUSTOMISE
344 select DVB_STB6100 if !DVB_FE_CUSTOMISE
345 help
346 Say Y here to support the AZ6027 device
diff --git a/drivers/media/dvb/dvb-usb/Makefile b/drivers/media/dvb/dvb-usb/Makefile
index 85b83a43d55d..1a192453b0e7 100644
--- a/drivers/media/dvb/dvb-usb/Makefile
+++ b/drivers/media/dvb/dvb-usb/Makefile
@@ -82,6 +82,12 @@ obj-$(CONFIG_DVB_USB_CE6230) += dvb-usb-ce6230.o
82dvb-usb-friio-objs = friio.o friio-fe.o 82dvb-usb-friio-objs = friio.o friio-fe.o
83obj-$(CONFIG_DVB_USB_FRIIO) += dvb-usb-friio.o 83obj-$(CONFIG_DVB_USB_FRIIO) += dvb-usb-friio.o
84 84
85dvb-usb-ec168-objs = ec168.o
86obj-$(CONFIG_DVB_USB_EC168) += dvb-usb-ec168.o
87
88dvb-usb-az6027-objs = az6027.o
89obj-$(CONFIG_DVB_USB_AZ6027) += dvb-usb-az6027.o
90
85EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ 91EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
86# due to tuner-xc3028 92# due to tuner-xc3028
87EXTRA_CFLAGS += -Idrivers/media/common/tuners 93EXTRA_CFLAGS += -Idrivers/media/common/tuners
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index cf042b309b46..74d94e45324d 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -21,6 +21,9 @@
21 * 21 *
22 */ 22 */
23 23
24#include <linux/hash.h>
25#include <linux/slab.h>
26
24#include "af9015.h" 27#include "af9015.h"
25#include "af9013.h" 28#include "af9013.h"
26#include "mt2060.h" 29#include "mt2060.h"
@@ -553,26 +556,45 @@ exit:
553 return ret; 556 return ret;
554} 557}
555 558
556/* dump eeprom */ 559/* hash (and dump) eeprom */
557static int af9015_eeprom_dump(struct dvb_usb_device *d) 560static int af9015_eeprom_hash(struct usb_device *udev)
558{ 561{
559 u8 reg, val; 562 static const unsigned int eeprom_size = 256;
563 unsigned int reg;
564 int ret;
565 u8 val, *eeprom;
566 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
560 567
561 for (reg = 0; ; reg++) { 568 eeprom = kmalloc(eeprom_size, GFP_KERNEL);
562 if (reg % 16 == 0) { 569 if (eeprom == NULL)
563 if (reg) 570 return -ENOMEM;
564 deb_info(KERN_CONT "\n"); 571
565 deb_info(KERN_DEBUG "%02x:", reg); 572 for (reg = 0; reg < eeprom_size; reg++) {
566 } 573 req.addr = reg;
567 if (af9015_read_reg_i2c(d, AF9015_I2C_EEPROM, reg, &val) == 0) 574 ret = af9015_rw_udev(udev, &req);
568 deb_info(KERN_CONT " %02x", val); 575 if (ret)
569 else 576 goto free;
570 deb_info(KERN_CONT " --"); 577 eeprom[reg] = val;
571 if (reg == 0xff)
572 break;
573 } 578 }
574 deb_info(KERN_CONT "\n"); 579
575 return 0; 580 if (dvb_usb_af9015_debug & 0x01)
581 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom,
582 eeprom_size);
583
584 BUG_ON(eeprom_size % 4);
585
586 af9015_config.eeprom_sum = 0;
587 for (reg = 0; reg < eeprom_size / sizeof(u32); reg++) {
588 af9015_config.eeprom_sum *= GOLDEN_RATIO_PRIME_32;
589 af9015_config.eeprom_sum += le32_to_cpu(((u32 *)eeprom)[reg]);
590 }
591
592 deb_info("%s: eeprom sum=%.8x\n", __func__, af9015_config.eeprom_sum);
593
594 ret = 0;
595free:
596 kfree(eeprom);
597 return ret;
576} 598}
577 599
578static int af9015_download_ir_table(struct dvb_usb_device *d) 600static int af9015_download_ir_table(struct dvb_usb_device *d)
@@ -711,12 +733,132 @@ error:
711 return ret; 733 return ret;
712} 734}
713 735
736struct af9015_setup {
737 unsigned int id;
738 struct dvb_usb_rc_key *rc_key_map;
739 unsigned int rc_key_map_size;
740 u8 *ir_table;
741 unsigned int ir_table_size;
742};
743
744static const struct af9015_setup *af9015_setup_match(unsigned int id,
745 const struct af9015_setup *table)
746{
747 for (; table->rc_key_map; table++)
748 if (table->id == id)
749 return table;
750 return NULL;
751}
752
753static const struct af9015_setup af9015_setup_modparam[] = {
754 { AF9015_REMOTE_A_LINK_DTU_M,
755 af9015_rc_keys_a_link, ARRAY_SIZE(af9015_rc_keys_a_link),
756 af9015_ir_table_a_link, ARRAY_SIZE(af9015_ir_table_a_link) },
757 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
758 af9015_rc_keys_msi, ARRAY_SIZE(af9015_rc_keys_msi),
759 af9015_ir_table_msi, ARRAY_SIZE(af9015_ir_table_msi) },
760 { AF9015_REMOTE_MYGICTV_U718,
761 af9015_rc_keys_mygictv, ARRAY_SIZE(af9015_rc_keys_mygictv),
762 af9015_ir_table_mygictv, ARRAY_SIZE(af9015_ir_table_mygictv) },
763 { AF9015_REMOTE_DIGITTRADE_DVB_T,
764 af9015_rc_keys_digittrade, ARRAY_SIZE(af9015_rc_keys_digittrade),
765 af9015_ir_table_digittrade, ARRAY_SIZE(af9015_ir_table_digittrade) },
766 { AF9015_REMOTE_AVERMEDIA_KS,
767 af9015_rc_keys_avermedia, ARRAY_SIZE(af9015_rc_keys_avermedia),
768 af9015_ir_table_avermedia_ks, ARRAY_SIZE(af9015_ir_table_avermedia_ks) },
769 { }
770};
771
772/* don't add new entries here anymore, use hashes instead */
773static const struct af9015_setup af9015_setup_usbids[] = {
774 { USB_VID_LEADTEK,
775 af9015_rc_keys_leadtek, ARRAY_SIZE(af9015_rc_keys_leadtek),
776 af9015_ir_table_leadtek, ARRAY_SIZE(af9015_ir_table_leadtek) },
777 { USB_VID_VISIONPLUS,
778 af9015_rc_keys_twinhan, ARRAY_SIZE(af9015_rc_keys_twinhan),
779 af9015_ir_table_twinhan, ARRAY_SIZE(af9015_ir_table_twinhan) },
780 { USB_VID_KWORLD_2, /* TODO: use correct rc keys */
781 af9015_rc_keys_twinhan, ARRAY_SIZE(af9015_rc_keys_twinhan),
782 af9015_ir_table_kworld, ARRAY_SIZE(af9015_ir_table_kworld) },
783 { USB_VID_AVERMEDIA,
784 af9015_rc_keys_avermedia, ARRAY_SIZE(af9015_rc_keys_avermedia),
785 af9015_ir_table_avermedia, ARRAY_SIZE(af9015_ir_table_avermedia) },
786 { USB_VID_MSI_2,
787 af9015_rc_keys_msi_digivox_iii, ARRAY_SIZE(af9015_rc_keys_msi_digivox_iii),
788 af9015_ir_table_msi_digivox_iii, ARRAY_SIZE(af9015_ir_table_msi_digivox_iii) },
789 { }
790};
791
792static const struct af9015_setup af9015_setup_hashes[] = {
793 { 0xb8feb708,
794 af9015_rc_keys_msi, ARRAY_SIZE(af9015_rc_keys_msi),
795 af9015_ir_table_msi, ARRAY_SIZE(af9015_ir_table_msi) },
796 { 0xa3703d00,
797 af9015_rc_keys_a_link, ARRAY_SIZE(af9015_rc_keys_a_link),
798 af9015_ir_table_a_link, ARRAY_SIZE(af9015_ir_table_a_link) },
799 { 0x9b7dc64e,
800 af9015_rc_keys_mygictv, ARRAY_SIZE(af9015_rc_keys_mygictv),
801 af9015_ir_table_mygictv, ARRAY_SIZE(af9015_ir_table_mygictv) },
802 { }
803};
804
805static void af9015_set_remote_config(struct usb_device *udev,
806 struct dvb_usb_device_properties *props)
807{
808 const struct af9015_setup *table = NULL;
809
810 if (dvb_usb_af9015_remote) {
811 /* load remote defined as module param */
812 table = af9015_setup_match(dvb_usb_af9015_remote,
813 af9015_setup_modparam);
814 } else {
815 u16 vendor = le16_to_cpu(udev->descriptor.idVendor);
816
817 table = af9015_setup_match(af9015_config.eeprom_sum,
818 af9015_setup_hashes);
819
820 if (!table && vendor == USB_VID_AFATECH) {
821 /* Check USB manufacturer and product strings and try
822 to determine correct remote in case of chip vendor
823 reference IDs are used.
824 DO NOT ADD ANYTHING NEW HERE. Use hashes instead.
825 */
826 char manufacturer[10];
827 memset(manufacturer, 0, sizeof(manufacturer));
828 usb_string(udev, udev->descriptor.iManufacturer,
829 manufacturer, sizeof(manufacturer));
830 if (!strcmp("MSI", manufacturer)) {
831 /* iManufacturer 1 MSI
832 iProduct 2 MSI K-VOX */
833 table = af9015_setup_match(
834 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
835 af9015_setup_modparam);
836 } else if (udev->descriptor.idProduct ==
837 cpu_to_le16(USB_PID_TREKSTOR_DVBT)) {
838 table = &(const struct af9015_setup){ 0,
839 af9015_rc_keys_trekstor,
840 ARRAY_SIZE(af9015_rc_keys_trekstor),
841 af9015_ir_table_trekstor,
842 ARRAY_SIZE(af9015_ir_table_trekstor)
843 };
844 }
845 } else if (!table)
846 table = af9015_setup_match(vendor, af9015_setup_usbids);
847 }
848
849 if (table) {
850 props->rc_key_map = table->rc_key_map;
851 props->rc_key_map_size = table->rc_key_map_size;
852 af9015_config.ir_table = table->ir_table;
853 af9015_config.ir_table_size = table->ir_table_size;
854 }
855}
856
714static int af9015_read_config(struct usb_device *udev) 857static int af9015_read_config(struct usb_device *udev)
715{ 858{
716 int ret; 859 int ret;
717 u8 val, i, offset = 0; 860 u8 val, i, offset = 0;
718 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val}; 861 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
719 char manufacturer[10];
720 862
721 /* IR remote controller */ 863 /* IR remote controller */
722 req.addr = AF9015_EEPROM_IR_MODE; 864 req.addr = AF9015_EEPROM_IR_MODE;
@@ -728,148 +870,18 @@ static int af9015_read_config(struct usb_device *udev)
728 } 870 }
729 if (ret) 871 if (ret)
730 goto error; 872 goto error;
873
874 ret = af9015_eeprom_hash(udev);
875 if (ret)
876 goto error;
877
731 deb_info("%s: IR mode:%d\n", __func__, val); 878 deb_info("%s: IR mode:%d\n", __func__, val);
732 for (i = 0; i < af9015_properties_count; i++) { 879 for (i = 0; i < af9015_properties_count; i++) {
733 if (val == AF9015_IR_MODE_DISABLED || val == 0x04) { 880 if (val == AF9015_IR_MODE_DISABLED) {
734 af9015_properties[i].rc_key_map = NULL; 881 af9015_properties[i].rc_key_map = NULL;
735 af9015_properties[i].rc_key_map_size = 0; 882 af9015_properties[i].rc_key_map_size = 0;
736 } else if (dvb_usb_af9015_remote) { 883 } else
737 /* load remote defined as module param */ 884 af9015_set_remote_config(udev, &af9015_properties[i]);
738 switch (dvb_usb_af9015_remote) {
739 case AF9015_REMOTE_A_LINK_DTU_M:
740 af9015_properties[i].rc_key_map =
741 af9015_rc_keys_a_link;
742 af9015_properties[i].rc_key_map_size =
743 ARRAY_SIZE(af9015_rc_keys_a_link);
744 af9015_config.ir_table = af9015_ir_table_a_link;
745 af9015_config.ir_table_size =
746 ARRAY_SIZE(af9015_ir_table_a_link);
747 break;
748 case AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3:
749 af9015_properties[i].rc_key_map =
750 af9015_rc_keys_msi;
751 af9015_properties[i].rc_key_map_size =
752 ARRAY_SIZE(af9015_rc_keys_msi);
753 af9015_config.ir_table = af9015_ir_table_msi;
754 af9015_config.ir_table_size =
755 ARRAY_SIZE(af9015_ir_table_msi);
756 break;
757 case AF9015_REMOTE_MYGICTV_U718:
758 af9015_properties[i].rc_key_map =
759 af9015_rc_keys_mygictv;
760 af9015_properties[i].rc_key_map_size =
761 ARRAY_SIZE(af9015_rc_keys_mygictv);
762 af9015_config.ir_table =
763 af9015_ir_table_mygictv;
764 af9015_config.ir_table_size =
765 ARRAY_SIZE(af9015_ir_table_mygictv);
766 break;
767 case AF9015_REMOTE_DIGITTRADE_DVB_T:
768 af9015_properties[i].rc_key_map =
769 af9015_rc_keys_digittrade;
770 af9015_properties[i].rc_key_map_size =
771 ARRAY_SIZE(af9015_rc_keys_digittrade);
772 af9015_config.ir_table =
773 af9015_ir_table_digittrade;
774 af9015_config.ir_table_size =
775 ARRAY_SIZE(af9015_ir_table_digittrade);
776 break;
777 case AF9015_REMOTE_AVERMEDIA_KS:
778 af9015_properties[i].rc_key_map =
779 af9015_rc_keys_avermedia;
780 af9015_properties[i].rc_key_map_size =
781 ARRAY_SIZE(af9015_rc_keys_avermedia);
782 af9015_config.ir_table =
783 af9015_ir_table_avermedia_ks;
784 af9015_config.ir_table_size =
785 ARRAY_SIZE(af9015_ir_table_avermedia_ks);
786 break;
787 }
788 } else {
789 switch (le16_to_cpu(udev->descriptor.idVendor)) {
790 case USB_VID_LEADTEK:
791 af9015_properties[i].rc_key_map =
792 af9015_rc_keys_leadtek;
793 af9015_properties[i].rc_key_map_size =
794 ARRAY_SIZE(af9015_rc_keys_leadtek);
795 af9015_config.ir_table =
796 af9015_ir_table_leadtek;
797 af9015_config.ir_table_size =
798 ARRAY_SIZE(af9015_ir_table_leadtek);
799 break;
800 case USB_VID_VISIONPLUS:
801 af9015_properties[i].rc_key_map =
802 af9015_rc_keys_twinhan;
803 af9015_properties[i].rc_key_map_size =
804 ARRAY_SIZE(af9015_rc_keys_twinhan);
805 af9015_config.ir_table =
806 af9015_ir_table_twinhan;
807 af9015_config.ir_table_size =
808 ARRAY_SIZE(af9015_ir_table_twinhan);
809 break;
810 case USB_VID_KWORLD_2:
811 /* TODO: use correct rc keys */
812 af9015_properties[i].rc_key_map =
813 af9015_rc_keys_twinhan;
814 af9015_properties[i].rc_key_map_size =
815 ARRAY_SIZE(af9015_rc_keys_twinhan);
816 af9015_config.ir_table = af9015_ir_table_kworld;
817 af9015_config.ir_table_size =
818 ARRAY_SIZE(af9015_ir_table_kworld);
819 break;
820 /* Check USB manufacturer and product strings and try
821 to determine correct remote in case of chip vendor
822 reference IDs are used. */
823 case USB_VID_AFATECH:
824 memset(manufacturer, 0, sizeof(manufacturer));
825 usb_string(udev, udev->descriptor.iManufacturer,
826 manufacturer, sizeof(manufacturer));
827 if (!strcmp("Geniatech", manufacturer)) {
828 /* iManufacturer 1 Geniatech
829 iProduct 2 AF9015 */
830 af9015_properties[i].rc_key_map =
831 af9015_rc_keys_mygictv;
832 af9015_properties[i].rc_key_map_size =
833 ARRAY_SIZE(af9015_rc_keys_mygictv);
834 af9015_config.ir_table =
835 af9015_ir_table_mygictv;
836 af9015_config.ir_table_size =
837 ARRAY_SIZE(af9015_ir_table_mygictv);
838 } else if (!strcmp("MSI", manufacturer)) {
839 /* iManufacturer 1 MSI
840 iProduct 2 MSI K-VOX */
841 af9015_properties[i].rc_key_map =
842 af9015_rc_keys_msi;
843 af9015_properties[i].rc_key_map_size =
844 ARRAY_SIZE(af9015_rc_keys_msi);
845 af9015_config.ir_table =
846 af9015_ir_table_msi;
847 af9015_config.ir_table_size =
848 ARRAY_SIZE(af9015_ir_table_msi);
849 } else if (udev->descriptor.idProduct ==
850 cpu_to_le16(USB_PID_TREKSTOR_DVBT)) {
851 af9015_properties[i].rc_key_map =
852 af9015_rc_keys_trekstor;
853 af9015_properties[i].rc_key_map_size =
854 ARRAY_SIZE(af9015_rc_keys_trekstor);
855 af9015_config.ir_table =
856 af9015_ir_table_trekstor;
857 af9015_config.ir_table_size =
858 ARRAY_SIZE(af9015_ir_table_trekstor);
859 }
860 break;
861 case USB_VID_AVERMEDIA:
862 af9015_properties[i].rc_key_map =
863 af9015_rc_keys_avermedia;
864 af9015_properties[i].rc_key_map_size =
865 ARRAY_SIZE(af9015_rc_keys_avermedia);
866 af9015_config.ir_table =
867 af9015_ir_table_avermedia;
868 af9015_config.ir_table_size =
869 ARRAY_SIZE(af9015_ir_table_avermedia);
870 break;
871 }
872 }
873 } 885 }
874 886
875 /* TS mode - one or two receivers */ 887 /* TS mode - one or two receivers */
@@ -991,6 +1003,9 @@ static int af9015_read_config(struct usb_device *udev)
991 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO; 1003 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
992 af9015_af9013_config[i].rf_spec_inv = 1; 1004 af9015_af9013_config[i].rf_spec_inv = 1;
993 break; 1005 break;
1006 case AF9013_TUNER_TDA18218:
1007 warn("tuner NXP TDA18218 not supported yet");
1008 return -ENODEV;
994 default: 1009 default:
995 warn("tuner id:%d not supported, please report!", val); 1010 warn("tuner id:%d not supported, please report!", val);
996 return -ENODEV; 1011 return -ENODEV;
@@ -1115,11 +1130,6 @@ static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1115 1130
1116 deb_info("%s: init I2C\n", __func__); 1131 deb_info("%s: init I2C\n", __func__);
1117 ret = af9015_i2c_init(adap->dev); 1132 ret = af9015_i2c_init(adap->dev);
1118
1119 /* dump eeprom (debug) */
1120 ret = af9015_eeprom_dump(adap->dev);
1121 if (ret)
1122 return ret;
1123 } else { 1133 } else {
1124 /* select I2C adapter */ 1134 /* select I2C adapter */
1125 i2c_adap = &state->i2c_adap; 1135 i2c_adap = &state->i2c_adap;
@@ -1283,6 +1293,10 @@ static struct usb_device_id af9015_usb_table[] = {
1283 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)}, 1293 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
1284 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)}, 1294 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
1285/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)}, 1295/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
1296 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
1297 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
1298 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2)},
1299 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS)},
1286 {0}, 1300 {0},
1287}; 1301};
1288MODULE_DEVICE_TABLE(usb, af9015_usb_table); 1302MODULE_DEVICE_TABLE(usb, af9015_usb_table);
@@ -1296,7 +1310,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1296 .firmware = "dvb-usb-af9015.fw", 1310 .firmware = "dvb-usb-af9015.fw",
1297 .no_reconnect = 1, 1311 .no_reconnect = 1,
1298 1312
1299 .size_of_priv = sizeof(struct af9015_state), \ 1313 .size_of_priv = sizeof(struct af9015_state),
1300 1314
1301 .num_adapters = 2, 1315 .num_adapters = 2,
1302 .adapter = { 1316 .adapter = {
@@ -1369,7 +1383,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1369 }, 1383 },
1370 { 1384 {
1371 .name = "DigitalNow TinyTwin DVB-T Receiver", 1385 .name = "DigitalNow TinyTwin DVB-T Receiver",
1372 .cold_ids = {&af9015_usb_table[5], NULL}, 1386 .cold_ids = {&af9015_usb_table[5],
1387 &af9015_usb_table[28], NULL},
1373 .warm_ids = {NULL}, 1388 .warm_ids = {NULL},
1374 }, 1389 },
1375 { 1390 {
@@ -1402,7 +1417,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1402 .firmware = "dvb-usb-af9015.fw", 1417 .firmware = "dvb-usb-af9015.fw",
1403 .no_reconnect = 1, 1418 .no_reconnect = 1,
1404 1419
1405 .size_of_priv = sizeof(struct af9015_state), \ 1420 .size_of_priv = sizeof(struct af9015_state),
1406 1421
1407 .num_adapters = 2, 1422 .num_adapters = 2,
1408 .adapter = { 1423 .adapter = {
@@ -1508,7 +1523,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1508 .firmware = "dvb-usb-af9015.fw", 1523 .firmware = "dvb-usb-af9015.fw",
1509 .no_reconnect = 1, 1524 .no_reconnect = 1,
1510 1525
1511 .size_of_priv = sizeof(struct af9015_state), \ 1526 .size_of_priv = sizeof(struct af9015_state),
1512 1527
1513 .num_adapters = 2, 1528 .num_adapters = 2,
1514 .adapter = { 1529 .adapter = {
@@ -1554,7 +1569,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1554 1569
1555 .i2c_algo = &af9015_i2c_algo, 1570 .i2c_algo = &af9015_i2c_algo,
1556 1571
1557 .num_device_descs = 4, /* max 9 */ 1572 .num_device_descs = 7, /* max 9 */
1558 .devices = { 1573 .devices = {
1559 { 1574 {
1560 .name = "AverMedia AVerTV Volar GPS 805 (A805)", 1575 .name = "AverMedia AVerTV Volar GPS 805 (A805)",
@@ -1577,6 +1592,22 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1577 .cold_ids = {&af9015_usb_table[24], NULL}, 1592 .cold_ids = {&af9015_usb_table[24], NULL},
1578 .warm_ids = {NULL}, 1593 .warm_ids = {NULL},
1579 }, 1594 },
1595 {
1596 .name = "KWorld PlusTV DVB-T PCI Pro Card " \
1597 "(DVB-T PC160-T)",
1598 .cold_ids = {&af9015_usb_table[26], NULL},
1599 .warm_ids = {NULL},
1600 },
1601 {
1602 .name = "Sveon STV20 Tuner USB DVB-T HDTV",
1603 .cold_ids = {&af9015_usb_table[27], NULL},
1604 .warm_ids = {NULL},
1605 },
1606 {
1607 .name = "Leadtek WinFast DTV2000DS",
1608 .cold_ids = {&af9015_usb_table[29], NULL},
1609 .warm_ids = {NULL},
1610 },
1580 } 1611 }
1581 }, 1612 },
1582}; 1613};
diff --git a/drivers/media/dvb/dvb-usb/af9015.h b/drivers/media/dvb/dvb-usb/af9015.h
index c41f30e4a1b8..ef36b1831490 100644
--- a/drivers/media/dvb/dvb-usb/af9015.h
+++ b/drivers/media/dvb/dvb-usb/af9015.h
@@ -95,6 +95,7 @@ enum af9015_ir_mode {
95 AF9015_IR_MODE_HID, 95 AF9015_IR_MODE_HID,
96 AF9015_IR_MODE_RLC, 96 AF9015_IR_MODE_RLC,
97 AF9015_IR_MODE_RC6, 97 AF9015_IR_MODE_RC6,
98 AF9015_IR_MODE_POLLING, /* just guess */
98}; 99};
99 100
100struct af9015_state { 101struct af9015_state {
@@ -106,6 +107,7 @@ struct af9015_config {
106 u16 mt2060_if1[2]; 107 u16 mt2060_if1[2];
107 u16 firmware_size; 108 u16 firmware_size;
108 u16 firmware_checksum; 109 u16 firmware_checksum;
110 u32 eeprom_sum;
109 u8 *ir_table; 111 u8 *ir_table;
110 u16 ir_table_size; 112 u16 ir_table_size;
111}; 113};
@@ -119,6 +121,7 @@ enum af9015_remote {
119/* 5 */ AF9015_REMOTE_AVERMEDIA_KS, 121/* 5 */ AF9015_REMOTE_AVERMEDIA_KS,
120}; 122};
121 123
124/* LeadTek - Y04G0051 */
122/* Leadtek WinFast DTV Dongle Gold */ 125/* Leadtek WinFast DTV Dongle Gold */
123static struct dvb_usb_rc_key af9015_rc_keys_leadtek[] = { 126static struct dvb_usb_rc_key af9015_rc_keys_leadtek[] = {
124 { 0x001e, KEY_1 }, 127 { 0x001e, KEY_1 },
@@ -131,64 +134,96 @@ static struct dvb_usb_rc_key af9015_rc_keys_leadtek[] = {
131 { 0x0025, KEY_8 }, 134 { 0x0025, KEY_8 },
132 { 0x0026, KEY_9 }, 135 { 0x0026, KEY_9 },
133 { 0x0027, KEY_0 }, 136 { 0x0027, KEY_0 },
134 { 0x0028, KEY_ENTER }, 137 { 0x0028, KEY_OK },
135 { 0x004f, KEY_VOLUMEUP }, 138 { 0x004f, KEY_RIGHT },
136 { 0x0050, KEY_VOLUMEDOWN }, 139 { 0x0050, KEY_LEFT },
137 { 0x0051, KEY_CHANNELDOWN }, 140 { 0x0051, KEY_DOWN },
138 { 0x0052, KEY_CHANNELUP }, 141 { 0x0052, KEY_UP },
142 { 0x011a, KEY_POWER2 },
143 { 0x04b4, KEY_TV },
144 { 0x04b3, KEY_RED },
145 { 0x04b2, KEY_GREEN },
146 { 0x04b1, KEY_YELLOW },
147 { 0x04b0, KEY_BLUE },
148 { 0x003d, KEY_TEXT },
149 { 0x0113, KEY_SLEEP },
150 { 0x0010, KEY_MUTE },
151 { 0x0105, KEY_ESC },
152 { 0x0009, KEY_SCREEN },
153 { 0x010f, KEY_MENU },
154 { 0x003f, KEY_CHANNEL },
155 { 0x0013, KEY_REWIND },
156 { 0x0012, KEY_PLAY },
157 { 0x0011, KEY_FASTFORWARD },
158 { 0x0005, KEY_PREVIOUS },
159 { 0x0029, KEY_STOP },
160 { 0x002b, KEY_NEXT },
161 { 0x0041, KEY_EPG },
162 { 0x0019, KEY_VIDEO },
163 { 0x0016, KEY_AUDIO },
164 { 0x0037, KEY_DOT },
165 { 0x002a, KEY_AGAIN },
166 { 0x002c, KEY_CAMERA },
167 { 0x003c, KEY_NEW },
168 { 0x0115, KEY_RECORD },
169 { 0x010b, KEY_TIME },
170 { 0x0043, KEY_VOLUMEUP },
171 { 0x0042, KEY_VOLUMEDOWN },
172 { 0x004b, KEY_CHANNELUP },
173 { 0x004e, KEY_CHANNELDOWN },
139}; 174};
140 175
141static u8 af9015_ir_table_leadtek[] = { 176static u8 af9015_ir_table_leadtek[] = {
142 0x03, 0xfc, 0x00, 0xff, 0x1a, 0x01, 0x00, 177 0x03, 0xfc, 0x00, 0xff, 0x1a, 0x01, 0x00, /* KEY_POWER2 */
143 0x03, 0xfc, 0x56, 0xa9, 0x00, 0x00, 0x00, 178 0x03, 0xfc, 0x56, 0xa9, 0xb4, 0x04, 0x00, /* KEY_TV */
144 0x03, 0xfc, 0x4b, 0xb4, 0x00, 0x00, 0x00, 179 0x03, 0xfc, 0x4b, 0xb4, 0xb3, 0x04, 0x00, /* KEY_RED */
145 0x03, 0xfc, 0x4c, 0xb3, 0xb2, 0x04, 0x00, 180 0x03, 0xfc, 0x4c, 0xb3, 0xb2, 0x04, 0x00, /* KEY_GREEN */
146 0x03, 0xfc, 0x4d, 0xb2, 0x00, 0x00, 0x00, 181 0x03, 0xfc, 0x4d, 0xb2, 0xb1, 0x04, 0x00, /* KEY_YELLOW */
147 0x03, 0xfc, 0x4e, 0xb1, 0x00, 0x00, 0x00, 182 0x03, 0xfc, 0x4e, 0xb1, 0xb0, 0x04, 0x00, /* KEY_BLUE */
148 0x03, 0xfc, 0x1f, 0xe0, 0x3d, 0x00, 0x00, 183 0x03, 0xfc, 0x1f, 0xe0, 0x3d, 0x00, 0x00, /* KEY_TEXT */
149 0x03, 0xfc, 0x40, 0xbf, 0x13, 0x01, 0x00, 184 0x03, 0xfc, 0x40, 0xbf, 0x13, 0x01, 0x00, /* KEY_SLEEP */
150 0x03, 0xfc, 0x14, 0xeb, 0x10, 0x00, 0x00, 185 0x03, 0xfc, 0x14, 0xeb, 0x10, 0x00, 0x00, /* KEY_MUTE */
151 0x03, 0xfc, 0x49, 0xb6, 0x05, 0x01, 0x00, 186 0x03, 0xfc, 0x49, 0xb6, 0x05, 0x01, 0x00, /* KEY_ESC */
152 0x03, 0xfc, 0x50, 0xaf, 0x29, 0x00, 0x00, 187 0x03, 0xfc, 0x50, 0xaf, 0x29, 0x00, 0x00, /* KEY_STOP (1)*/
153 0x03, 0xfc, 0x0c, 0xf3, 0x52, 0x00, 0x00, 188 0x03, 0xfc, 0x0c, 0xf3, 0x52, 0x00, 0x00, /* KEY_UP */
154 0x03, 0xfc, 0x03, 0xfc, 0x09, 0x00, 0x00, 189 0x03, 0xfc, 0x03, 0xfc, 0x09, 0x00, 0x00, /* KEY_SCREEN */
155 0x03, 0xfc, 0x08, 0xf7, 0x50, 0x00, 0x00, 190 0x03, 0xfc, 0x08, 0xf7, 0x50, 0x00, 0x00, /* KEY_LEFT */
156 0x03, 0xfc, 0x13, 0xec, 0x28, 0x00, 0x00, 191 0x03, 0xfc, 0x13, 0xec, 0x28, 0x00, 0x00, /* KEY_OK (1) */
157 0x03, 0xfc, 0x04, 0xfb, 0x4f, 0x00, 0x00, 192 0x03, 0xfc, 0x04, 0xfb, 0x4f, 0x00, 0x00, /* KEY_RIGHT */
158 0x03, 0xfc, 0x4f, 0xb0, 0x0f, 0x01, 0x00, 193 0x03, 0xfc, 0x4f, 0xb0, 0x0f, 0x01, 0x00, /* KEY_MENU */
159 0x03, 0xfc, 0x10, 0xef, 0x51, 0x00, 0x00, 194 0x03, 0xfc, 0x10, 0xef, 0x51, 0x00, 0x00, /* KEY_DOWN */
160 0x03, 0xfc, 0x51, 0xae, 0x3f, 0x00, 0x00, 195 0x03, 0xfc, 0x51, 0xae, 0x3f, 0x00, 0x00, /* KEY_CHANNEL */
161 0x03, 0xfc, 0x42, 0xbd, 0x13, 0x00, 0x00, 196 0x03, 0xfc, 0x42, 0xbd, 0x13, 0x00, 0x00, /* KEY_REWIND */
162 0x03, 0xfc, 0x43, 0xbc, 0x00, 0x00, 0x00, 197 0x03, 0xfc, 0x43, 0xbc, 0x12, 0x00, 0x00, /* KEY_PLAY */
163 0x03, 0xfc, 0x44, 0xbb, 0x11, 0x00, 0x00, 198 0x03, 0xfc, 0x44, 0xbb, 0x11, 0x00, 0x00, /* KEY_FASTFORWARD */
164 0x03, 0xfc, 0x52, 0xad, 0x19, 0x00, 0x00, 199 0x03, 0xfc, 0x52, 0xad, 0x19, 0x00, 0x00, /* KEY_VIDEO (1) */
165 0x03, 0xfc, 0x54, 0xab, 0x05, 0x00, 0x00, 200 0x03, 0xfc, 0x54, 0xab, 0x05, 0x00, 0x00, /* KEY_PREVIOUS */
166 0x03, 0xfc, 0x46, 0xb9, 0x29, 0x00, 0x00, 201 0x03, 0xfc, 0x46, 0xb9, 0x29, 0x00, 0x00, /* KEY_STOP (2) */
167 0x03, 0xfc, 0x55, 0xaa, 0x2b, 0x00, 0x00, 202 0x03, 0xfc, 0x55, 0xaa, 0x2b, 0x00, 0x00, /* KEY_NEXT */
168 0x03, 0xfc, 0x53, 0xac, 0x41, 0x00, 0x00, 203 0x03, 0xfc, 0x53, 0xac, 0x41, 0x00, 0x00, /* KEY_EPG */
169 0x03, 0xfc, 0x05, 0xfa, 0x1e, 0x00, 0x00, 204 0x03, 0xfc, 0x05, 0xfa, 0x1e, 0x00, 0x00, /* KEY_1 */
170 0x03, 0xfc, 0x06, 0xf9, 0x1f, 0x00, 0x00, 205 0x03, 0xfc, 0x06, 0xf9, 0x1f, 0x00, 0x00, /* KEY_2 */
171 0x03, 0xfc, 0x07, 0xf8, 0x20, 0x00, 0x00, 206 0x03, 0xfc, 0x07, 0xf8, 0x20, 0x00, 0x00, /* KEY_3 */
172 0x03, 0xfc, 0x1e, 0xe1, 0x19, 0x00, 0x00, 207 0x03, 0xfc, 0x1e, 0xe1, 0x19, 0x00, 0x00, /* KEY_VIDEO (2) */
173 0x03, 0xfc, 0x09, 0xf6, 0x21, 0x00, 0x00, 208 0x03, 0xfc, 0x09, 0xf6, 0x21, 0x00, 0x00, /* KEY_4 */
174 0x03, 0xfc, 0x0a, 0xf5, 0x22, 0x00, 0x00, 209 0x03, 0xfc, 0x0a, 0xf5, 0x22, 0x00, 0x00, /* KEY_5 */
175 0x03, 0xfc, 0x0b, 0xf4, 0x23, 0x00, 0x00, 210 0x03, 0xfc, 0x0b, 0xf4, 0x23, 0x00, 0x00, /* KEY_6 */
176 0x03, 0xfc, 0x1b, 0xe4, 0x16, 0x00, 0x00, 211 0x03, 0xfc, 0x1b, 0xe4, 0x16, 0x00, 0x00, /* KEY_AUDIO */
177 0x03, 0xfc, 0x0d, 0xf2, 0x24, 0x00, 0x00, 212 0x03, 0xfc, 0x0d, 0xf2, 0x24, 0x00, 0x00, /* KEY_7 */
178 0x03, 0xfc, 0x0e, 0xf1, 0x25, 0x00, 0x00, 213 0x03, 0xfc, 0x0e, 0xf1, 0x25, 0x00, 0x00, /* KEY_8 */
179 0x03, 0xfc, 0x0f, 0xf0, 0x26, 0x00, 0x00, 214 0x03, 0xfc, 0x0f, 0xf0, 0x26, 0x00, 0x00, /* KEY_9 */
180 0x03, 0xfc, 0x16, 0xe9, 0x28, 0x00, 0x00, 215 0x03, 0xfc, 0x16, 0xe9, 0x28, 0x00, 0x00, /* KEY_OK (2) */
181 0x03, 0xfc, 0x41, 0xbe, 0x37, 0x00, 0x00, 216 0x03, 0xfc, 0x41, 0xbe, 0x37, 0x00, 0x00, /* KEY_DOT */
182 0x03, 0xfc, 0x12, 0xed, 0x27, 0x00, 0x00, 217 0x03, 0xfc, 0x12, 0xed, 0x27, 0x00, 0x00, /* KEY_0 */
183 0x03, 0xfc, 0x11, 0xee, 0x2a, 0x00, 0x00, 218 0x03, 0xfc, 0x11, 0xee, 0x2a, 0x00, 0x00, /* KEY_AGAIN */
184 0x03, 0xfc, 0x48, 0xb7, 0x2c, 0x00, 0x00, 219 0x03, 0xfc, 0x48, 0xb7, 0x2c, 0x00, 0x00, /* KEY_CAMERA */
185 0x03, 0xfc, 0x4a, 0xb5, 0x3c, 0x00, 0x00, 220 0x03, 0xfc, 0x4a, 0xb5, 0x3c, 0x00, 0x00, /* KEY_NEW */
186 0x03, 0xfc, 0x47, 0xb8, 0x15, 0x01, 0x00, 221 0x03, 0xfc, 0x47, 0xb8, 0x15, 0x01, 0x00, /* KEY_RECORD */
187 0x03, 0xfc, 0x45, 0xba, 0x0b, 0x01, 0x00, 222 0x03, 0xfc, 0x45, 0xba, 0x0b, 0x01, 0x00, /* KEY_TIME */
188 0x03, 0xfc, 0x5e, 0xa1, 0x43, 0x00, 0x00, 223 0x03, 0xfc, 0x5e, 0xa1, 0x43, 0x00, 0x00, /* KEY_VOLUMEUP */
189 0x03, 0xfc, 0x5a, 0xa5, 0x42, 0x00, 0x00, 224 0x03, 0xfc, 0x5a, 0xa5, 0x42, 0x00, 0x00, /* KEY_VOLUMEDOWN */
190 0x03, 0xfc, 0x5b, 0xa4, 0x4b, 0x00, 0x00, 225 0x03, 0xfc, 0x5b, 0xa4, 0x4b, 0x00, 0x00, /* KEY_CHANNELUP */
191 0x03, 0xfc, 0x5f, 0xa0, 0x4e, 0x00, 0x00, 226 0x03, 0xfc, 0x5f, 0xa0, 0x4e, 0x00, 0x00, /* KEY_CHANNELDOWN */
192}; 227};
193 228
194/* TwinHan AzureWave AD-TU700(704J) */ 229/* TwinHan AzureWave AD-TU700(704J) */
@@ -746,4 +781,75 @@ static u8 af9015_ir_table_trekstor[] = {
746 0x00, 0xff, 0x84, 0x7b, 0x27, 0x07, 0x00, 781 0x00, 0xff, 0x84, 0x7b, 0x27, 0x07, 0x00,
747}; 782};
748 783
784/* MSI DIGIVOX mini III */
785static struct dvb_usb_rc_key af9015_rc_keys_msi_digivox_iii[] = {
786 { 0x0713, KEY_POWER }, /* [red power button] */
787 { 0x073b, KEY_VIDEO }, /* Source */
788 { 0x073e, KEY_ZOOM }, /* Zoom */
789 { 0x070b, KEY_POWER2 }, /* ShutDown */
790 { 0x071e, KEY_1 },
791 { 0x071f, KEY_2 },
792 { 0x0720, KEY_3 },
793 { 0x0721, KEY_4 },
794 { 0x0722, KEY_5 },
795 { 0x0723, KEY_6 },
796 { 0x0724, KEY_7 },
797 { 0x0725, KEY_8 },
798 { 0x0726, KEY_9 },
799 { 0x0727, KEY_0 },
800 { 0x0752, KEY_CHANNELUP }, /* CH+ */
801 { 0x0751, KEY_CHANNELDOWN }, /* CH- */
802 { 0x0750, KEY_VOLUMEUP }, /* Vol+ */
803 { 0x074f, KEY_VOLUMEDOWN }, /* Vol- */
804 { 0x0705, KEY_ESC }, /* [back up arrow] */
805 { 0x0708, KEY_OK }, /* [enter arrow] */
806 { 0x073f, KEY_RECORD }, /* Rec */
807 { 0x0716, KEY_STOP }, /* Stop */
808 { 0x072a, KEY_PLAY }, /* Play */
809 { 0x073c, KEY_MUTE }, /* Mute */
810 { 0x0718, KEY_UP },
811 { 0x0707, KEY_DOWN },
812 { 0x070f, KEY_LEFT },
813 { 0x0715, KEY_RIGHT },
814 { 0x0736, KEY_RED },
815 { 0x0737, KEY_GREEN },
816 { 0x072d, KEY_YELLOW },
817 { 0x072e, KEY_BLUE },
818};
819
820static u8 af9015_ir_table_msi_digivox_iii[] = {
821 0x61, 0xd6, 0x43, 0xbc, 0x13, 0x07, 0x00, /* KEY_POWER */
822 0x61, 0xd6, 0x01, 0xfe, 0x3b, 0x07, 0x00, /* KEY_VIDEO */
823 0x61, 0xd6, 0x0b, 0xf4, 0x3e, 0x07, 0x00, /* KEY_ZOOM */
824 0x61, 0xd6, 0x03, 0xfc, 0x0b, 0x07, 0x00, /* KEY_POWER2 */
825 0x61, 0xd6, 0x04, 0xfb, 0x1e, 0x07, 0x00, /* KEY_1 */
826 0x61, 0xd6, 0x08, 0xf7, 0x1f, 0x07, 0x00, /* KEY_2 */
827 0x61, 0xd6, 0x02, 0xfd, 0x20, 0x07, 0x00, /* KEY_3 */
828 0x61, 0xd6, 0x0f, 0xf0, 0x21, 0x07, 0x00, /* KEY_4 */
829 0x61, 0xd6, 0x05, 0xfa, 0x22, 0x07, 0x00, /* KEY_5 */
830 0x61, 0xd6, 0x06, 0xf9, 0x23, 0x07, 0x00, /* KEY_6 */
831 0x61, 0xd6, 0x0c, 0xf3, 0x24, 0x07, 0x00, /* KEY_7 */
832 0x61, 0xd6, 0x0d, 0xf2, 0x25, 0x07, 0x00, /* KEY_8 */
833 0x61, 0xd6, 0x0a, 0xf5, 0x26, 0x07, 0x00, /* KEY_9 */
834 0x61, 0xd6, 0x11, 0xee, 0x27, 0x07, 0x00, /* KEY_0 */
835 0x61, 0xd6, 0x09, 0xf6, 0x52, 0x07, 0x00, /* KEY_CHANNELUP */
836 0x61, 0xd6, 0x07, 0xf8, 0x51, 0x07, 0x00, /* KEY_CHANNELDOWN */
837 0x61, 0xd6, 0x0e, 0xf1, 0x50, 0x07, 0x00, /* KEY_VOLUMEUP */
838 0x61, 0xd6, 0x13, 0xec, 0x4f, 0x07, 0x00, /* KEY_VOLUMEDOWN */
839 0x61, 0xd6, 0x10, 0xef, 0x05, 0x07, 0x00, /* KEY_ESC */
840 0x61, 0xd6, 0x12, 0xed, 0x08, 0x07, 0x00, /* KEY_OK */
841 0x61, 0xd6, 0x14, 0xeb, 0x3f, 0x07, 0x00, /* KEY_RECORD */
842 0x61, 0xd6, 0x15, 0xea, 0x16, 0x07, 0x00, /* KEY_STOP */
843 0x61, 0xd6, 0x16, 0xe9, 0x2a, 0x07, 0x00, /* KEY_PLAY */
844 0x61, 0xd6, 0x17, 0xe8, 0x3c, 0x07, 0x00, /* KEY_MUTE */
845 0x61, 0xd6, 0x18, 0xe7, 0x18, 0x07, 0x00, /* KEY_UP */
846 0x61, 0xd6, 0x19, 0xe6, 0x07, 0x07, 0x00, /* KEY_DOWN */
847 0x61, 0xd6, 0x1a, 0xe5, 0x0f, 0x07, 0x00, /* KEY_LEFT */
848 0x61, 0xd6, 0x1b, 0xe4, 0x15, 0x07, 0x00, /* KEY_RIGHT */
849 0x61, 0xd6, 0x1c, 0xe3, 0x36, 0x07, 0x00, /* KEY_RED */
850 0x61, 0xd6, 0x1d, 0xe2, 0x37, 0x07, 0x00, /* KEY_GREEN */
851 0x61, 0xd6, 0x1e, 0xe1, 0x2d, 0x07, 0x00, /* KEY_YELLOW */
852 0x61, 0xd6, 0x1f, 0xe0, 0x2e, 0x07, 0x00, /* KEY_BLUE */
853};
854
749#endif 855#endif
diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c
index 2ae7f648effe..bb69f3719f9a 100644
--- a/drivers/media/dvb/dvb-usb/anysee.c
+++ b/drivers/media/dvb/dvb-usb/anysee.c
@@ -344,7 +344,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
344 if (ret) 344 if (ret)
345 return ret; 345 return ret;
346 346
347 err("Unkown Anysee version: %02x %02x %02x. "\ 347 err("Unknown Anysee version: %02x %02x %02x. "\
348 "Please report the <linux-dvb@linuxtv.org>.", 348 "Please report the <linux-dvb@linuxtv.org>.",
349 hw_info[0], hw_info[1], hw_info[2]); 349 hw_info[0], hw_info[1], hw_info[2]);
350 350
diff --git a/drivers/media/dvb/dvb-usb/az6027.c b/drivers/media/dvb/dvb-usb/az6027.c
new file mode 100644
index 000000000000..d7290b2c0913
--- /dev/null
+++ b/drivers/media/dvb/dvb-usb/az6027.c
@@ -0,0 +1,1151 @@
1/* DVB USB compliant Linux driver for the AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)
2 * receiver.
3 *
4 * Copyright (C) 2009 Adams.Xu <adams.xu@azwave.com.cn>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation, version 2.
9 *
10 * see Documentation/dvb/README.dvb-usb for more information
11 */
12#include "az6027.h"
13
14#include "stb0899_drv.h"
15#include "stb0899_reg.h"
16#include "stb0899_cfg.h"
17
18#include "stb6100.h"
19#include "stb6100_cfg.h"
20#include "dvb_ca_en50221.h"
21
22int dvb_usb_az6027_debug;
23module_param_named(debug, dvb_usb_az6027_debug, int, 0644);
24MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DVB_USB_DEBUG_STATUS);
25
26DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
27
28struct az6027_device_state {
29 struct dvb_ca_en50221 ca;
30 struct mutex ca_mutex;
31 u8 power_state;
32};
33
34static const struct stb0899_s1_reg az6027_stb0899_s1_init_1[] = {
35
36 /* 0x0000000b, SYSREG */
37 { STB0899_DEV_ID , 0x30 },
38 { STB0899_DISCNTRL1 , 0x32 },
39 { STB0899_DISCNTRL2 , 0x80 },
40 { STB0899_DISRX_ST0 , 0x04 },
41 { STB0899_DISRX_ST1 , 0x00 },
42 { STB0899_DISPARITY , 0x00 },
43 { STB0899_DISFIFO , 0x00 },
44 { STB0899_DISSTATUS , 0x20 },
45 { STB0899_DISF22 , 0x99 },
46 { STB0899_DISF22RX , 0xa8 },
47 /* SYSREG ? */
48 { STB0899_ACRPRESC , 0x11 },
49 { STB0899_ACRDIV1 , 0x0a },
50 { STB0899_ACRDIV2 , 0x05 },
51 { STB0899_DACR1 , 0x00 },
52 { STB0899_DACR2 , 0x00 },
53 { STB0899_OUTCFG , 0x00 },
54 { STB0899_MODECFG , 0x00 },
55 { STB0899_IRQSTATUS_3 , 0xfe },
56 { STB0899_IRQSTATUS_2 , 0x03 },
57 { STB0899_IRQSTATUS_1 , 0x7c },
58 { STB0899_IRQSTATUS_0 , 0xf4 },
59 { STB0899_IRQMSK_3 , 0xf3 },
60 { STB0899_IRQMSK_2 , 0xfc },
61 { STB0899_IRQMSK_1 , 0xff },
62 { STB0899_IRQMSK_0 , 0xff },
63 { STB0899_IRQCFG , 0x00 },
64 { STB0899_I2CCFG , 0x88 },
65 { STB0899_I2CRPT , 0x58 },
66 { STB0899_IOPVALUE5 , 0x00 },
67 { STB0899_IOPVALUE4 , 0x33 },
68 { STB0899_IOPVALUE3 , 0x6d },
69 { STB0899_IOPVALUE2 , 0x90 },
70 { STB0899_IOPVALUE1 , 0x60 },
71 { STB0899_IOPVALUE0 , 0x00 },
72 { STB0899_GPIO00CFG , 0x82 },
73 { STB0899_GPIO01CFG , 0x82 },
74 { STB0899_GPIO02CFG , 0x82 },
75 { STB0899_GPIO03CFG , 0x82 },
76 { STB0899_GPIO04CFG , 0x82 },
77 { STB0899_GPIO05CFG , 0x82 },
78 { STB0899_GPIO06CFG , 0x82 },
79 { STB0899_GPIO07CFG , 0x82 },
80 { STB0899_GPIO08CFG , 0x82 },
81 { STB0899_GPIO09CFG , 0x82 },
82 { STB0899_GPIO10CFG , 0x82 },
83 { STB0899_GPIO11CFG , 0x82 },
84 { STB0899_GPIO12CFG , 0x82 },
85 { STB0899_GPIO13CFG , 0x82 },
86 { STB0899_GPIO14CFG , 0x82 },
87 { STB0899_GPIO15CFG , 0x82 },
88 { STB0899_GPIO16CFG , 0x82 },
89 { STB0899_GPIO17CFG , 0x82 },
90 { STB0899_GPIO18CFG , 0x82 },
91 { STB0899_GPIO19CFG , 0x82 },
92 { STB0899_GPIO20CFG , 0x82 },
93 { STB0899_SDATCFG , 0xb8 },
94 { STB0899_SCLTCFG , 0xba },
95 { STB0899_AGCRFCFG , 0x1c }, /* 0x11 */
96 { STB0899_GPIO22 , 0x82 }, /* AGCBB2CFG */
97 { STB0899_GPIO21 , 0x91 }, /* AGCBB1CFG */
98 { STB0899_DIRCLKCFG , 0x82 },
99 { STB0899_CLKOUT27CFG , 0x7e },
100 { STB0899_STDBYCFG , 0x82 },
101 { STB0899_CS0CFG , 0x82 },
102 { STB0899_CS1CFG , 0x82 },
103 { STB0899_DISEQCOCFG , 0x20 },
104 { STB0899_GPIO32CFG , 0x82 },
105 { STB0899_GPIO33CFG , 0x82 },
106 { STB0899_GPIO34CFG , 0x82 },
107 { STB0899_GPIO35CFG , 0x82 },
108 { STB0899_GPIO36CFG , 0x82 },
109 { STB0899_GPIO37CFG , 0x82 },
110 { STB0899_GPIO38CFG , 0x82 },
111 { STB0899_GPIO39CFG , 0x82 },
112 { STB0899_NCOARSE , 0x17 }, /* 0x15 = 27 Mhz Clock, F/3 = 198MHz, F/6 = 99MHz */
113 { STB0899_SYNTCTRL , 0x02 }, /* 0x00 = CLK from CLKI, 0x02 = CLK from XTALI */
114 { STB0899_FILTCTRL , 0x00 },
115 { STB0899_SYSCTRL , 0x01 },
116 { STB0899_STOPCLK1 , 0x20 },
117 { STB0899_STOPCLK2 , 0x00 },
118 { STB0899_INTBUFSTATUS , 0x00 },
119 { STB0899_INTBUFCTRL , 0x0a },
120 { 0xffff , 0xff },
121};
122
123static const struct stb0899_s1_reg az6027_stb0899_s1_init_3[] = {
124 { STB0899_DEMOD , 0x00 },
125 { STB0899_RCOMPC , 0xc9 },
126 { STB0899_AGC1CN , 0x01 },
127 { STB0899_AGC1REF , 0x10 },
128 { STB0899_RTC , 0x23 },
129 { STB0899_TMGCFG , 0x4e },
130 { STB0899_AGC2REF , 0x34 },
131 { STB0899_TLSR , 0x84 },
132 { STB0899_CFD , 0xf7 },
133 { STB0899_ACLC , 0x87 },
134 { STB0899_BCLC , 0x94 },
135 { STB0899_EQON , 0x41 },
136 { STB0899_LDT , 0xf1 },
137 { STB0899_LDT2 , 0xe3 },
138 { STB0899_EQUALREF , 0xb4 },
139 { STB0899_TMGRAMP , 0x10 },
140 { STB0899_TMGTHD , 0x30 },
141 { STB0899_IDCCOMP , 0xfd },
142 { STB0899_QDCCOMP , 0xff },
143 { STB0899_POWERI , 0x0c },
144 { STB0899_POWERQ , 0x0f },
145 { STB0899_RCOMP , 0x6c },
146 { STB0899_AGCIQIN , 0x80 },
147 { STB0899_AGC2I1 , 0x06 },
148 { STB0899_AGC2I2 , 0x00 },
149 { STB0899_TLIR , 0x30 },
150 { STB0899_RTF , 0x7f },
151 { STB0899_DSTATUS , 0x00 },
152 { STB0899_LDI , 0xbc },
153 { STB0899_CFRM , 0xea },
154 { STB0899_CFRL , 0x31 },
155 { STB0899_NIRM , 0x2b },
156 { STB0899_NIRL , 0x80 },
157 { STB0899_ISYMB , 0x1d },
158 { STB0899_QSYMB , 0xa6 },
159 { STB0899_SFRH , 0x2f },
160 { STB0899_SFRM , 0x68 },
161 { STB0899_SFRL , 0x40 },
162 { STB0899_SFRUPH , 0x2f },
163 { STB0899_SFRUPM , 0x68 },
164 { STB0899_SFRUPL , 0x40 },
165 { STB0899_EQUAI1 , 0x02 },
166 { STB0899_EQUAQ1 , 0xff },
167 { STB0899_EQUAI2 , 0x04 },
168 { STB0899_EQUAQ2 , 0x05 },
169 { STB0899_EQUAI3 , 0x02 },
170 { STB0899_EQUAQ3 , 0xfd },
171 { STB0899_EQUAI4 , 0x03 },
172 { STB0899_EQUAQ4 , 0x07 },
173 { STB0899_EQUAI5 , 0x08 },
174 { STB0899_EQUAQ5 , 0xf5 },
175 { STB0899_DSTATUS2 , 0x00 },
176 { STB0899_VSTATUS , 0x00 },
177 { STB0899_VERROR , 0x86 },
178 { STB0899_IQSWAP , 0x2a },
179 { STB0899_ECNT1M , 0x00 },
180 { STB0899_ECNT1L , 0x00 },
181 { STB0899_ECNT2M , 0x00 },
182 { STB0899_ECNT2L , 0x00 },
183 { STB0899_ECNT3M , 0x0a },
184 { STB0899_ECNT3L , 0xad },
185 { STB0899_FECAUTO1 , 0x06 },
186 { STB0899_FECM , 0x01 },
187 { STB0899_VTH12 , 0xb0 },
188 { STB0899_VTH23 , 0x7a },
189 { STB0899_VTH34 , 0x58 },
190 { STB0899_VTH56 , 0x38 },
191 { STB0899_VTH67 , 0x34 },
192 { STB0899_VTH78 , 0x24 },
193 { STB0899_PRVIT , 0xff },
194 { STB0899_VITSYNC , 0x19 },
195 { STB0899_RSULC , 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
196 { STB0899_TSULC , 0x42 },
197 { STB0899_RSLLC , 0x41 },
198 { STB0899_TSLPL , 0x12 },
199 { STB0899_TSCFGH , 0x0c },
200 { STB0899_TSCFGM , 0x00 },
201 { STB0899_TSCFGL , 0x00 },
202 { STB0899_TSOUT , 0x69 }, /* 0x0d for CAM */
203 { STB0899_RSSYNCDEL , 0x00 },
204 { STB0899_TSINHDELH , 0x02 },
205 { STB0899_TSINHDELM , 0x00 },
206 { STB0899_TSINHDELL , 0x00 },
207 { STB0899_TSLLSTKM , 0x1b },
208 { STB0899_TSLLSTKL , 0xb3 },
209 { STB0899_TSULSTKM , 0x00 },
210 { STB0899_TSULSTKL , 0x00 },
211 { STB0899_PCKLENUL , 0xbc },
212 { STB0899_PCKLENLL , 0xcc },
213 { STB0899_RSPCKLEN , 0xbd },
214 { STB0899_TSSTATUS , 0x90 },
215 { STB0899_ERRCTRL1 , 0xb6 },
216 { STB0899_ERRCTRL2 , 0x95 },
217 { STB0899_ERRCTRL3 , 0x8d },
218 { STB0899_DMONMSK1 , 0x27 },
219 { STB0899_DMONMSK0 , 0x03 },
220 { STB0899_DEMAPVIT , 0x5c },
221 { STB0899_PLPARM , 0x19 },
222 { STB0899_PDELCTRL , 0x48 },
223 { STB0899_PDELCTRL2 , 0x00 },
224 { STB0899_BBHCTRL1 , 0x00 },
225 { STB0899_BBHCTRL2 , 0x00 },
226 { STB0899_HYSTTHRESH , 0x77 },
227 { STB0899_MATCSTM , 0x00 },
228 { STB0899_MATCSTL , 0x00 },
229 { STB0899_UPLCSTM , 0x00 },
230 { STB0899_UPLCSTL , 0x00 },
231 { STB0899_DFLCSTM , 0x00 },
232 { STB0899_DFLCSTL , 0x00 },
233 { STB0899_SYNCCST , 0x00 },
234 { STB0899_SYNCDCSTM , 0x00 },
235 { STB0899_SYNCDCSTL , 0x00 },
236 { STB0899_ISI_ENTRY , 0x00 },
237 { STB0899_ISI_BIT_EN , 0x00 },
238 { STB0899_MATSTRM , 0xf0 },
239 { STB0899_MATSTRL , 0x02 },
240 { STB0899_UPLSTRM , 0x45 },
241 { STB0899_UPLSTRL , 0x60 },
242 { STB0899_DFLSTRM , 0xe3 },
243 { STB0899_DFLSTRL , 0x00 },
244 { STB0899_SYNCSTR , 0x47 },
245 { STB0899_SYNCDSTRM , 0x05 },
246 { STB0899_SYNCDSTRL , 0x18 },
247 { STB0899_CFGPDELSTATUS1 , 0x19 },
248 { STB0899_CFGPDELSTATUS2 , 0x2b },
249 { STB0899_BBFERRORM , 0x00 },
250 { STB0899_BBFERRORL , 0x01 },
251 { STB0899_UPKTERRORM , 0x00 },
252 { STB0899_UPKTERRORL , 0x00 },
253 { 0xffff , 0xff },
254};
255
256
257
258struct stb0899_config az6027_stb0899_config = {
259 .init_dev = az6027_stb0899_s1_init_1,
260 .init_s2_demod = stb0899_s2_init_2,
261 .init_s1_demod = az6027_stb0899_s1_init_3,
262 .init_s2_fec = stb0899_s2_init_4,
263 .init_tst = stb0899_s1_init_5,
264
265 .demod_address = 0xd0, /* 0x68, 0xd0 >> 1 */
266
267 .xtal_freq = 27000000,
268 .inversion = IQ_SWAP_ON, /* 1 */
269
270 .lo_clk = 76500000,
271 .hi_clk = 99000000,
272
273 .esno_ave = STB0899_DVBS2_ESNO_AVE,
274 .esno_quant = STB0899_DVBS2_ESNO_QUANT,
275 .avframes_coarse = STB0899_DVBS2_AVFRAMES_COARSE,
276 .avframes_fine = STB0899_DVBS2_AVFRAMES_FINE,
277 .miss_threshold = STB0899_DVBS2_MISS_THRESHOLD,
278 .uwp_threshold_acq = STB0899_DVBS2_UWP_THRESHOLD_ACQ,
279 .uwp_threshold_track = STB0899_DVBS2_UWP_THRESHOLD_TRACK,
280 .uwp_threshold_sof = STB0899_DVBS2_UWP_THRESHOLD_SOF,
281 .sof_search_timeout = STB0899_DVBS2_SOF_SEARCH_TIMEOUT,
282
283 .btr_nco_bits = STB0899_DVBS2_BTR_NCO_BITS,
284 .btr_gain_shift_offset = STB0899_DVBS2_BTR_GAIN_SHIFT_OFFSET,
285 .crl_nco_bits = STB0899_DVBS2_CRL_NCO_BITS,
286 .ldpc_max_iter = STB0899_DVBS2_LDPC_MAX_ITER,
287
288 .tuner_get_frequency = stb6100_get_frequency,
289 .tuner_set_frequency = stb6100_set_frequency,
290 .tuner_set_bandwidth = stb6100_set_bandwidth,
291 .tuner_get_bandwidth = stb6100_get_bandwidth,
292 .tuner_set_rfsiggain = NULL,
293};
294
295struct stb6100_config az6027_stb6100_config = {
296 .tuner_address = 0xc0,
297 .refclock = 27000000,
298};
299
300
301/* check for mutex FIXME */
302int az6027_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
303{
304 int ret = -1;
305 if (mutex_lock_interruptible(&d->usb_mutex))
306 return -EAGAIN;
307
308 ret = usb_control_msg(d->udev,
309 usb_rcvctrlpipe(d->udev, 0),
310 req,
311 USB_TYPE_VENDOR | USB_DIR_IN,
312 value,
313 index,
314 b,
315 blen,
316 2000);
317
318 if (ret < 0) {
319 warn("usb in operation failed. (%d)", ret);
320 ret = -EIO;
321 } else
322 ret = 0;
323
324 deb_xfer("in: req. %02x, val: %04x, ind: %04x, buffer: ", req, value, index);
325 debug_dump(b, blen, deb_xfer);
326
327 mutex_unlock(&d->usb_mutex);
328 return ret;
329}
330
331static int az6027_usb_out_op(struct dvb_usb_device *d,
332 u8 req,
333 u16 value,
334 u16 index,
335 u8 *b,
336 int blen)
337{
338 int ret;
339
340 deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ", req, value, index);
341 debug_dump(b, blen, deb_xfer);
342
343 if (mutex_lock_interruptible(&d->usb_mutex))
344 return -EAGAIN;
345
346 ret = usb_control_msg(d->udev,
347 usb_sndctrlpipe(d->udev, 0),
348 req,
349 USB_TYPE_VENDOR | USB_DIR_OUT,
350 value,
351 index,
352 b,
353 blen,
354 2000);
355
356 if (ret != blen) {
357 warn("usb out operation failed. (%d)", ret);
358 mutex_unlock(&d->usb_mutex);
359 return -EIO;
360 } else{
361 mutex_unlock(&d->usb_mutex);
362 return 0;
363 }
364}
365
366static int az6027_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
367{
368 int ret;
369 u8 req;
370 u16 value;
371 u16 index;
372 int blen;
373
374 deb_info("%s %d", __func__, onoff);
375
376 req = 0xBC;
377 value = onoff;
378 index = 0;
379 blen = 0;
380
381 ret = az6027_usb_out_op(adap->dev, req, value, index, NULL, blen);
382 if (ret != 0)
383 warn("usb out operation failed. (%d)", ret);
384
385 return ret;
386}
387
388/* keys for the enclosed remote control */
389static struct dvb_usb_rc_key az6027_rc_keys[] = {
390 { 0x01, KEY_1 },
391 { 0x02, KEY_2 },
392};
393
394/* remote control stuff (does not work with my box) */
395static int az6027_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
396{
397 return 0;
398}
399
400/*
401int az6027_power_ctrl(struct dvb_usb_device *d, int onoff)
402{
403 u8 v = onoff;
404 return az6027_usb_out_op(d,0xBC,v,3,NULL,1);
405}
406*/
407
408static int az6027_ci_read_attribute_mem(struct dvb_ca_en50221 *ca,
409 int slot,
410 int address)
411{
412 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
413 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
414
415 int ret;
416 u8 req;
417 u16 value;
418 u16 index;
419 int blen;
420 u8 b[12];
421
422 if (slot != 0)
423 return -EINVAL;
424
425 mutex_lock(&state->ca_mutex);
426
427 req = 0xC1;
428 value = address;
429 index = 0;
430 blen = 1;
431
432 ret = az6027_usb_in_op(d, req, value, index, b, blen);
433 if (ret < 0) {
434 warn("usb in operation failed. (%d)", ret);
435 ret = -EINVAL;
436 } else {
437 ret = b[0];
438 }
439
440 mutex_unlock(&state->ca_mutex);
441 return ret;
442}
443
444static int az6027_ci_write_attribute_mem(struct dvb_ca_en50221 *ca,
445 int slot,
446 int address,
447 u8 value)
448{
449 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
450 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
451
452 int ret;
453 u8 req;
454 u16 value1;
455 u16 index;
456 int blen;
457
458 deb_info("%s %d", __func__, slot);
459 if (slot != 0)
460 return -EINVAL;
461
462 mutex_lock(&state->ca_mutex);
463 req = 0xC2;
464 value1 = address;
465 index = value;
466 blen = 0;
467
468 ret = az6027_usb_out_op(d, req, value1, index, NULL, blen);
469 if (ret != 0)
470 warn("usb out operation failed. (%d)", ret);
471
472 mutex_unlock(&state->ca_mutex);
473 return ret;
474}
475
476static int az6027_ci_read_cam_control(struct dvb_ca_en50221 *ca,
477 int slot,
478 u8 address)
479{
480 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
481 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
482
483 int ret;
484 u8 req;
485 u16 value;
486 u16 index;
487 int blen;
488 u8 b[12];
489
490 if (slot != 0)
491 return -EINVAL;
492
493 mutex_lock(&state->ca_mutex);
494
495 req = 0xC3;
496 value = address;
497 index = 0;
498 blen = 2;
499
500 ret = az6027_usb_in_op(d, req, value, index, b, blen);
501 if (ret < 0) {
502 warn("usb in operation failed. (%d)", ret);
503 ret = -EINVAL;
504 } else {
505 if (b[0] == 0)
506 warn("Read CI IO error");
507
508 ret = b[1];
509 deb_info("read cam data = %x from 0x%x", b[1], value);
510 }
511
512 mutex_unlock(&state->ca_mutex);
513 return ret;
514}
515
516static int az6027_ci_write_cam_control(struct dvb_ca_en50221 *ca,
517 int slot,
518 u8 address,
519 u8 value)
520{
521 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
522 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
523
524 int ret;
525 u8 req;
526 u16 value1;
527 u16 index;
528 int blen;
529
530 if (slot != 0)
531 return -EINVAL;
532
533 mutex_lock(&state->ca_mutex);
534 req = 0xC4;
535 value1 = address;
536 index = value;
537 blen = 0;
538
539 ret = az6027_usb_out_op(d, req, value1, index, NULL, blen);
540 if (ret != 0) {
541 warn("usb out operation failed. (%d)", ret);
542 goto failed;
543 }
544
545failed:
546 mutex_unlock(&state->ca_mutex);
547 return ret;
548}
549
550static int CI_CamReady(struct dvb_ca_en50221 *ca, int slot)
551{
552 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
553
554 int ret;
555 u8 req;
556 u16 value;
557 u16 index;
558 int blen;
559 u8 b[12];
560
561 req = 0xC8;
562 value = 0;
563 index = 0;
564 blen = 1;
565
566 ret = az6027_usb_in_op(d, req, value, index, b, blen);
567 if (ret < 0) {
568 warn("usb in operation failed. (%d)", ret);
569 ret = -EIO;
570 } else{
571 ret = b[0];
572 }
573 return ret;
574}
575
576static int az6027_ci_slot_reset(struct dvb_ca_en50221 *ca, int slot)
577{
578 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
579 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
580
581 int ret, i;
582 u8 req;
583 u16 value;
584 u16 index;
585 int blen;
586
587 mutex_lock(&state->ca_mutex);
588
589 req = 0xC6;
590 value = 1;
591 index = 0;
592 blen = 0;
593
594 ret = az6027_usb_out_op(d, req, value, index, NULL, blen);
595 if (ret != 0) {
596 warn("usb out operation failed. (%d)", ret);
597 goto failed;
598 }
599
600 msleep(500);
601 req = 0xC6;
602 value = 0;
603 index = 0;
604 blen = 0;
605
606 ret = az6027_usb_out_op(d, req, value, index, NULL, blen);
607 if (ret != 0) {
608 warn("usb out operation failed. (%d)", ret);
609 goto failed;
610 }
611
612 for (i = 0; i < 15; i++) {
613 msleep(100);
614
615 if (CI_CamReady(ca, slot)) {
616 deb_info("CAM Ready");
617 break;
618 }
619 }
620 msleep(5000);
621
622failed:
623 mutex_unlock(&state->ca_mutex);
624 return ret;
625}
626
627static int az6027_ci_slot_shutdown(struct dvb_ca_en50221 *ca, int slot)
628{
629 return 0;
630}
631
632static int az6027_ci_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot)
633{
634 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
635 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
636
637 int ret;
638 u8 req;
639 u16 value;
640 u16 index;
641 int blen;
642
643 deb_info("%s", __func__);
644 mutex_lock(&state->ca_mutex);
645 req = 0xC7;
646 value = 1;
647 index = 0;
648 blen = 0;
649
650 ret = az6027_usb_out_op(d, req, value, index, NULL, blen);
651 if (ret != 0) {
652 warn("usb out operation failed. (%d)", ret);
653 goto failed;
654 }
655
656failed:
657 mutex_unlock(&state->ca_mutex);
658 return ret;
659}
660
661static int az6027_ci_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open)
662{
663 struct dvb_usb_device *d = (struct dvb_usb_device *)ca->data;
664 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
665 int ret;
666 u8 req;
667 u16 value;
668 u16 index;
669 int blen;
670 u8 b[12];
671
672 mutex_lock(&state->ca_mutex);
673
674 req = 0xC5;
675 value = 0;
676 index = 0;
677 blen = 1;
678
679 ret = az6027_usb_in_op(d, req, value, index, b, blen);
680 if (ret < 0) {
681 warn("usb in operation failed. (%d)", ret);
682 ret = -EIO;
683 } else
684 ret = 0;
685
686 if (b[0] == 0) {
687 ret = 0;
688
689 } else if (b[0] == 1) {
690 ret = DVB_CA_EN50221_POLL_CAM_PRESENT |
691 DVB_CA_EN50221_POLL_CAM_READY;
692 }
693
694 mutex_unlock(&state->ca_mutex);
695 return ret;
696}
697
698
699static void az6027_ci_uninit(struct dvb_usb_device *d)
700{
701 struct az6027_device_state *state;
702
703 deb_info("%s", __func__);
704
705 if (NULL == d)
706 return;
707
708 state = (struct az6027_device_state *)d->priv;
709 if (NULL == state)
710 return;
711
712 if (NULL == state->ca.data)
713 return;
714
715 dvb_ca_en50221_release(&state->ca);
716
717 memset(&state->ca, 0, sizeof(state->ca));
718}
719
720
721static int az6027_ci_init(struct dvb_usb_adapter *a)
722{
723 struct dvb_usb_device *d = a->dev;
724 struct az6027_device_state *state = (struct az6027_device_state *)d->priv;
725 int ret;
726
727 deb_info("%s", __func__);
728
729 mutex_init(&state->ca_mutex);
730
731 state->ca.owner = THIS_MODULE;
732 state->ca.read_attribute_mem = az6027_ci_read_attribute_mem;
733 state->ca.write_attribute_mem = az6027_ci_write_attribute_mem;
734 state->ca.read_cam_control = az6027_ci_read_cam_control;
735 state->ca.write_cam_control = az6027_ci_write_cam_control;
736 state->ca.slot_reset = az6027_ci_slot_reset;
737 state->ca.slot_shutdown = az6027_ci_slot_shutdown;
738 state->ca.slot_ts_enable = az6027_ci_slot_ts_enable;
739 state->ca.poll_slot_status = az6027_ci_poll_slot_status;
740 state->ca.data = d;
741
742 ret = dvb_ca_en50221_init(&a->dvb_adap,
743 &state->ca,
744 0, /* flags */
745 1);/* n_slots */
746 if (ret != 0) {
747 err("Cannot initialize CI: Error %d.", ret);
748 memset(&state->ca, 0, sizeof(state->ca));
749 return ret;
750 }
751
752 deb_info("CI initialized.");
753
754 return 0;
755}
756
757/*
758static int az6027_read_mac_addr(struct dvb_usb_device *d, u8 mac[6])
759{
760 az6027_usb_in_op(d, 0xb7, 6, 0, &mac[0], 6);
761 return 0;
762}
763*/
764
765static int az6027_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
766{
767
768 u8 buf;
769 int ret;
770 struct dvb_usb_adapter *adap = fe->dvb->priv;
771
772 struct i2c_msg i2c_msg = {
773 .addr = 0x99,
774 .flags = 0,
775 .buf = &buf,
776 .len = 1
777 };
778
779 /*
780 * 2 --18v
781 * 1 --13v
782 * 0 --off
783 */
784 switch (voltage) {
785 case SEC_VOLTAGE_13:
786 buf = 1;
787 ret = i2c_transfer(&adap->dev->i2c_adap, &i2c_msg, 1);
788 break;
789
790 case SEC_VOLTAGE_18:
791 buf = 2;
792 ret = i2c_transfer(&adap->dev->i2c_adap, &i2c_msg, 1);
793 break;
794
795 case SEC_VOLTAGE_OFF:
796 buf = 0;
797 ret = i2c_transfer(&adap->dev->i2c_adap, &i2c_msg, 1);
798 break;
799
800 default:
801 return -EINVAL;
802 }
803 return 0;
804}
805
806
807static int az6027_frontend_poweron(struct dvb_usb_adapter *adap)
808{
809 int ret;
810 u8 req;
811 u16 value;
812 u16 index;
813 int blen;
814
815 req = 0xBC;
816 value = 1; /* power on */
817 index = 3;
818 blen = 0;
819
820 ret = az6027_usb_out_op(adap->dev, req, value, index, NULL, blen);
821 if (ret != 0)
822 return -EIO;
823
824 return 0;
825}
826static int az6027_frontend_reset(struct dvb_usb_adapter *adap)
827{
828 int ret;
829 u8 req;
830 u16 value;
831 u16 index;
832 int blen;
833
834 /* reset demodulator */
835 req = 0xC0;
836 value = 1; /* high */
837 index = 3;
838 blen = 0;
839
840 ret = az6027_usb_out_op(adap->dev, req, value, index, NULL, blen);
841 if (ret != 0)
842 return -EIO;
843
844 req = 0xC0;
845 value = 0; /* low */
846 index = 3;
847 blen = 0;
848 msleep_interruptible(200);
849
850 ret = az6027_usb_out_op(adap->dev, req, value, index, NULL, blen);
851 if (ret != 0)
852 return -EIO;
853
854 msleep_interruptible(200);
855
856 req = 0xC0;
857 value = 1; /*high */
858 index = 3;
859 blen = 0;
860
861 ret = az6027_usb_out_op(adap->dev, req, value, index, NULL, blen);
862 if (ret != 0)
863 return -EIO;
864
865 msleep_interruptible(200);
866 return 0;
867}
868
869static int az6027_frontend_tsbypass(struct dvb_usb_adapter *adap, int onoff)
870{
871 int ret;
872 u8 req;
873 u16 value;
874 u16 index;
875 int blen;
876
877 /* TS passthrough */
878 req = 0xC7;
879 value = onoff;
880 index = 0;
881 blen = 0;
882
883 ret = az6027_usb_out_op(adap->dev, req, value, index, NULL, blen);
884 if (ret != 0)
885 return -EIO;
886
887 return 0;
888}
889
890static int az6027_frontend_attach(struct dvb_usb_adapter *adap)
891{
892
893 az6027_frontend_poweron(adap);
894 az6027_frontend_reset(adap);
895
896 deb_info("adap = %p, dev = %p\n", adap, adap->dev);
897 adap->fe = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap);
898
899 if (adap->fe) {
900 deb_info("found STB0899 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb0899_config.demod_address);
901 if (stb6100_attach(adap->fe, &az6027_stb6100_config, &adap->dev->i2c_adap)) {
902 deb_info("found STB6100 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb6100_config.tuner_address);
903 adap->fe->ops.set_voltage = az6027_set_voltage;
904 az6027_ci_init(adap);
905 } else {
906 adap->fe = NULL;
907 }
908 } else
909 warn("no front-end attached\n");
910
911 az6027_frontend_tsbypass(adap, 0);
912
913 return 0;
914}
915
916static struct dvb_usb_device_properties az6027_properties;
917
918static void az6027_usb_disconnect(struct usb_interface *intf)
919{
920 struct dvb_usb_device *d = usb_get_intfdata(intf);
921 az6027_ci_uninit(d);
922 dvb_usb_device_exit(intf);
923}
924
925
926static int az6027_usb_probe(struct usb_interface *intf,
927 const struct usb_device_id *id)
928{
929 return dvb_usb_device_init(intf,
930 &az6027_properties,
931 THIS_MODULE,
932 NULL,
933 adapter_nr);
934}
935
936/* I2C */
937static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
938{
939 struct dvb_usb_device *d = i2c_get_adapdata(adap);
940 int i = 0, j = 0, len = 0;
941 int ret;
942 u16 index;
943 u16 value;
944 int length;
945 u8 req;
946 u8 data[256];
947
948 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
949 return -EAGAIN;
950
951 if (num > 2)
952 warn("more than 2 i2c messages at a time is not handled yet. TODO.");
953
954 for (i = 0; i < num; i++) {
955
956 if (msg[i].addr == 0x99) {
957 req = 0xBE;
958 index = 0;
959 value = msg[i].buf[0] & 0x00ff;
960 length = 1;
961 az6027_usb_out_op(d, req, value, index, data, length);
962 }
963
964 if (msg[i].addr == 0xd0) {
965 /* write/read request */
966 if (i + 1 < num && (msg[i + 1].flags & I2C_M_RD)) {
967 req = 0xB9;
968 index = (((msg[i].buf[0] << 8) & 0xff00) | (msg[i].buf[1] & 0x00ff));
969 value = msg[i].addr + (msg[i].len << 8);
970 length = msg[i + 1].len + 6;
971 ret = az6027_usb_in_op(d, req, value, index, data, length);
972 len = msg[i + 1].len;
973 for (j = 0; j < len; j++)
974 msg[i + 1].buf[j] = data[j + 5];
975
976 i++;
977 } else {
978
979 if (msg[i].addr == 0xd0) {
980 /* demod 16bit addr */
981 req = 0xBD;
982 index = (((msg[i].buf[0] << 8) & 0xff00) | (msg[i].buf[1] & 0x00ff));
983 value = msg[i].addr + (2 << 8);
984 length = msg[i].len - 2;
985 len = msg[i].len - 2;
986 for (j = 0; j < len; j++)
987 data[j] = msg[i].buf[j + 2];
988
989 }
990 az6027_usb_out_op(d, req, value, index, data, length);
991 }
992 }
993
994 if (msg[i].addr == 0xc0) {
995 if (msg[i].flags & I2C_M_RD) {
996
997 req = 0xB9;
998 index = 0x0;
999 value = msg[i].addr;
1000 length = msg[i].len + 6;
1001 ret = az6027_usb_in_op(d, req, value, index, data, length);
1002 len = msg[i].len;
1003 for (j = 0; j < len; j++)
1004 msg[i].buf[j] = data[j + 5];
1005
1006 } else {
1007
1008 req = 0xBD;
1009 index = msg[i].buf[0] & 0x00FF;
1010 value = msg[i].addr + (1 << 8);
1011 length = msg[i].len - 1;
1012 len = msg[i].len - 1;
1013
1014 for (j = 0; j < len; j++)
1015 data[j] = msg[i].buf[j + 1];
1016
1017 az6027_usb_out_op(d, req, value, index, data, length);
1018 }
1019 }
1020 }
1021 mutex_unlock(&d->i2c_mutex);
1022
1023 return i;
1024}
1025
1026
1027static u32 az6027_i2c_func(struct i2c_adapter *adapter)
1028{
1029 return I2C_FUNC_I2C;
1030}
1031
1032static struct i2c_algorithm az6027_i2c_algo = {
1033 .master_xfer = az6027_i2c_xfer,
1034 .functionality = az6027_i2c_func,
1035};
1036
1037int az6027_identify_state(struct usb_device *udev,
1038 struct dvb_usb_device_properties *props,
1039 struct dvb_usb_device_description **desc,
1040 int *cold)
1041{
1042 u8 b[16];
1043 s16 ret = usb_control_msg(udev,
1044 usb_rcvctrlpipe(udev, 0),
1045 0xb7,
1046 USB_TYPE_VENDOR | USB_DIR_IN,
1047 6,
1048 0,
1049 b,
1050 6,
1051 USB_CTRL_GET_TIMEOUT);
1052
1053 *cold = ret <= 0;
1054
1055 deb_info("cold: %d\n", *cold);
1056 return 0;
1057}
1058
1059
1060static struct usb_device_id az6027_usb_table[] = {
1061 { USB_DEVICE(USB_VID_AZUREWAVE, USB_PID_AZUREWAVE_AZ6027) },
1062 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_DVBS2CI) },
1063 { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_USB2_HDCI) },
1064 { },
1065};
1066
1067MODULE_DEVICE_TABLE(usb, az6027_usb_table);
1068
1069static struct dvb_usb_device_properties az6027_properties = {
1070 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1071 .usb_ctrl = CYPRESS_FX2,
1072 .firmware = "dvb-usb-az6027-03.fw",
1073 .no_reconnect = 1,
1074
1075 .size_of_priv = sizeof(struct az6027_device_state),
1076 .identify_state = az6027_identify_state,
1077 .num_adapters = 1,
1078 .adapter = {
1079 {
1080 .streaming_ctrl = az6027_streaming_ctrl,
1081 .frontend_attach = az6027_frontend_attach,
1082
1083 /* parameter for the MPEG2-data transfer */
1084 .stream = {
1085 .type = USB_BULK,
1086 .count = 10,
1087 .endpoint = 0x02,
1088 .u = {
1089 .bulk = {
1090 .buffersize = 4096,
1091 }
1092 }
1093 },
1094 }
1095 },
1096/*
1097 .power_ctrl = az6027_power_ctrl,
1098 .read_mac_address = az6027_read_mac_addr,
1099 */
1100 .rc_key_map = az6027_rc_keys,
1101 .rc_key_map_size = ARRAY_SIZE(az6027_rc_keys),
1102 .rc_interval = 400,
1103 .rc_query = az6027_rc_query,
1104 .i2c_algo = &az6027_i2c_algo,
1105
1106 .num_device_descs = 1,
1107 .devices = {
1108 {
1109 .name = "AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)",
1110 .cold_ids = { &az6027_usb_table[0], NULL },
1111 .warm_ids = { NULL },
1112 },
1113 { NULL },
1114 }
1115};
1116
1117/* usb specific object needed to register this driver with the usb subsystem */
1118static struct usb_driver az6027_usb_driver = {
1119 .name = "dvb_usb_az6027",
1120 .probe = az6027_usb_probe,
1121 .disconnect = az6027_usb_disconnect,
1122 .id_table = az6027_usb_table,
1123};
1124
1125/* module stuff */
1126static int __init az6027_usb_module_init(void)
1127{
1128 int result;
1129
1130 result = usb_register(&az6027_usb_driver);
1131 if (result) {
1132 err("usb_register failed. (%d)", result);
1133 return result;
1134 }
1135
1136 return 0;
1137}
1138
1139static void __exit az6027_usb_module_exit(void)
1140{
1141 /* deregister this driver from the USB subsystem */
1142 usb_deregister(&az6027_usb_driver);
1143}
1144
1145module_init(az6027_usb_module_init);
1146module_exit(az6027_usb_module_exit);
1147
1148MODULE_AUTHOR("Adams Xu <Adams.xu@azwave.com.cn>");
1149MODULE_DESCRIPTION("Driver for AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)");
1150MODULE_VERSION("1.0");
1151MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/dvb-usb/az6027.h b/drivers/media/dvb/dvb-usb/az6027.h
new file mode 100644
index 000000000000..f3afe17f3f3d
--- /dev/null
+++ b/drivers/media/dvb/dvb-usb/az6027.h
@@ -0,0 +1,14 @@
1#ifndef _DVB_USB_VP6027_H_
2#define _DVB_USB_VP6027_H_
3
4#define DVB_USB_LOG_PREFIX "az6027"
5#include "dvb-usb.h"
6
7
8extern int dvb_usb_az6027_debug;
9#define deb_info(args...) dprintk(dvb_usb_az6027_debug, 0x01, args)
10#define deb_xfer(args...) dprintk(dvb_usb_az6027_debug, 0x02, args)
11#define deb_rc(args...) dprintk(dvb_usb_az6027_debug, 0x04, args)
12#define deb_fe(args...) dprintk(dvb_usb_az6027_debug, 0x08, args)
13
14#endif
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
index 2a53dd096eef..960376da7d59 100644
--- a/drivers/media/dvb/dvb-usb/cxusb.c
+++ b/drivers/media/dvb/dvb-usb/cxusb.c
@@ -25,6 +25,7 @@
25 */ 25 */
26#include <media/tuner.h> 26#include <media/tuner.h>
27#include <linux/vmalloc.h> 27#include <linux/vmalloc.h>
28#include <linux/slab.h>
28 29
29#include "cxusb.h" 30#include "cxusb.h"
30 31
@@ -36,9 +37,11 @@
36#include "tuner-xc2028.h" 37#include "tuner-xc2028.h"
37#include "tuner-simple.h" 38#include "tuner-simple.h"
38#include "mxl5005s.h" 39#include "mxl5005s.h"
40#include "max2165.h"
39#include "dib7000p.h" 41#include "dib7000p.h"
40#include "dib0070.h" 42#include "dib0070.h"
41#include "lgs8gxx.h" 43#include "lgs8gxx.h"
44#include "atbm8830.h"
42 45
43/* debug */ 46/* debug */
44static int dvb_usb_cxusb_debug; 47static int dvb_usb_cxusb_debug;
@@ -714,6 +717,11 @@ static struct mxl5005s_config d680_dmb_tuner = {
714 .AgcMasterByte = 0x00, 717 .AgcMasterByte = 0x00,
715}; 718};
716 719
720static struct max2165_config mygica_d689_max2165_cfg = {
721 .i2c_address = 0x60,
722 .osc_clk = 20
723};
724
717/* Callbacks for DVB USB */ 725/* Callbacks for DVB USB */
718static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap) 726static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
719{ 727{
@@ -813,6 +821,14 @@ static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
813 return (fe == NULL) ? -EIO : 0; 821 return (fe == NULL) ? -EIO : 0;
814} 822}
815 823
824static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
825{
826 struct dvb_frontend *fe;
827 fe = dvb_attach(max2165_attach, adap->fe,
828 &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
829 return (fe == NULL) ? -EIO : 0;
830}
831
816static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap) 832static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
817{ 833{
818 u8 b; 834 u8 b;
@@ -1160,6 +1176,58 @@ static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1160 return 0; 1176 return 0;
1161} 1177}
1162 1178
1179static struct atbm8830_config mygica_d689_atbm8830_cfg = {
1180 .prod = ATBM8830_PROD_8830,
1181 .demod_address = 0x40,
1182 .serial_ts = 0,
1183 .ts_sampling_edge = 1,
1184 .ts_clk_gated = 0,
1185 .osc_clk_freq = 30400, /* in kHz */
1186 .if_freq = 0, /* zero IF */
1187 .zif_swap_iq = 1,
1188 .agc_min = 0x2E,
1189 .agc_max = 0x90,
1190 .agc_hold_loop = 0,
1191};
1192
1193static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1194{
1195 struct dvb_usb_device *d = adap->dev;
1196
1197 /* Select required USB configuration */
1198 if (usb_set_interface(d->udev, 0, 0) < 0)
1199 err("set interface failed");
1200
1201 /* Unblock all USB pipes */
1202 usb_clear_halt(d->udev,
1203 usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1204 usb_clear_halt(d->udev,
1205 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1206 usb_clear_halt(d->udev,
1207 usb_rcvbulkpipe(d->udev, d->props.adapter[0].stream.endpoint));
1208
1209
1210 /* Reset the tuner */
1211 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1212 err("clear tuner gpio failed");
1213 return -EIO;
1214 }
1215 msleep(100);
1216 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1217 err("set tuner gpio failed");
1218 return -EIO;
1219 }
1220 msleep(100);
1221
1222 /* Attach frontend */
1223 adap->fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
1224 &d->i2c_adap);
1225 if (adap->fe == NULL)
1226 return -EIO;
1227
1228 return 0;
1229}
1230
1163/* 1231/*
1164 * DViCO has shipped two devices with the same USB ID, but only one of them 1232 * DViCO has shipped two devices with the same USB ID, but only one of them
1165 * needs a firmware download. Check the device class details to see if they 1233 * needs a firmware download. Check the device class details to see if they
@@ -1240,6 +1308,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
1240static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties; 1308static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
1241static struct dvb_usb_device_properties cxusb_aver_a868r_properties; 1309static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
1242static struct dvb_usb_device_properties cxusb_d680_dmb_properties; 1310static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
1311static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
1243 1312
1244static int cxusb_probe(struct usb_interface *intf, 1313static int cxusb_probe(struct usb_interface *intf,
1245 const struct usb_device_id *id) 1314 const struct usb_device_id *id)
@@ -1268,6 +1337,8 @@ static int cxusb_probe(struct usb_interface *intf,
1268 THIS_MODULE, NULL, adapter_nr) || 1337 THIS_MODULE, NULL, adapter_nr) ||
1269 0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties, 1338 0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
1270 THIS_MODULE, NULL, adapter_nr) || 1339 THIS_MODULE, NULL, adapter_nr) ||
1340 0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
1341 THIS_MODULE, NULL, adapter_nr) ||
1271 0) 1342 0)
1272 return 0; 1343 return 0;
1273 1344
@@ -1294,6 +1365,7 @@ static struct usb_device_id cxusb_table [] = {
1294 { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R) }, 1365 { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R) },
1295 { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2) }, 1366 { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2) },
1296 { USB_DEVICE(USB_VID_CONEXANT, USB_PID_CONEXANT_D680_DMB) }, 1367 { USB_DEVICE(USB_VID_CONEXANT, USB_PID_CONEXANT_D680_DMB) },
1368 { USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689) },
1297 {} /* Terminating entry */ 1369 {} /* Terminating entry */
1298}; 1370};
1299MODULE_DEVICE_TABLE (usb, cxusb_table); 1371MODULE_DEVICE_TABLE (usb, cxusb_table);
@@ -1837,6 +1909,55 @@ static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
1837 } 1909 }
1838}; 1910};
1839 1911
1912static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
1913 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1914
1915 .usb_ctrl = CYPRESS_FX2,
1916
1917 .size_of_priv = sizeof(struct cxusb_state),
1918
1919 .num_adapters = 1,
1920 .adapter = {
1921 {
1922 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1923 .frontend_attach = cxusb_mygica_d689_frontend_attach,
1924 .tuner_attach = cxusb_mygica_d689_tuner_attach,
1925
1926 /* parameter for the MPEG2-data transfer */
1927 .stream = {
1928 .type = USB_BULK,
1929 .count = 5,
1930 .endpoint = 0x02,
1931 .u = {
1932 .bulk = {
1933 .buffersize = 8192,
1934 }
1935 }
1936 },
1937 },
1938 },
1939
1940 .power_ctrl = cxusb_d680_dmb_power_ctrl,
1941
1942 .i2c_algo = &cxusb_i2c_algo,
1943
1944 .generic_bulk_ctrl_endpoint = 0x01,
1945
1946 .rc_interval = 100,
1947 .rc_key_map = d680_dmb_rc_keys,
1948 .rc_key_map_size = ARRAY_SIZE(d680_dmb_rc_keys),
1949 .rc_query = cxusb_d680_dmb_rc_query,
1950
1951 .num_device_descs = 1,
1952 .devices = {
1953 {
1954 "Mygica D689 DMB-TH",
1955 { NULL },
1956 { &cxusb_table[19], NULL },
1957 },
1958 }
1959};
1960
1840static struct usb_driver cxusb_driver = { 1961static struct usb_driver cxusb_driver = {
1841 .name = "dvb_usb_cxusb", 1962 .name = "dvb_usb_cxusb",
1842 .probe = cxusb_probe, 1963 .probe = cxusb_probe,
diff --git a/drivers/media/dvb/dvb-usb/dib0700.h b/drivers/media/dvb/dvb-usb/dib0700.h
index 8b544fe79b0d..83fc24a6c31a 100644
--- a/drivers/media/dvb/dvb-usb/dib0700.h
+++ b/drivers/media/dvb/dvb-usb/dib0700.h
@@ -20,30 +20,33 @@ extern int dvb_usb_dib0700_debug;
20#define deb_fwdata(args...) dprintk(dvb_usb_dib0700_debug,0x04,args) 20#define deb_fwdata(args...) dprintk(dvb_usb_dib0700_debug,0x04,args)
21#define deb_data(args...) dprintk(dvb_usb_dib0700_debug,0x08,args) 21#define deb_data(args...) dprintk(dvb_usb_dib0700_debug,0x08,args)
22 22
23#define REQUEST_I2C_READ 0x2 23#define REQUEST_SET_USB_XFER_LEN 0x0 /* valid only for firmware version */
24#define REQUEST_I2C_WRITE 0x3 24 /* higher than 1.21 */
25#define REQUEST_POLL_RC 0x4 /* deprecated in firmware v1.20 */ 25#define REQUEST_I2C_READ 0x2
26#define REQUEST_JUMPRAM 0x8 26#define REQUEST_I2C_WRITE 0x3
27#define REQUEST_SET_CLOCK 0xB 27#define REQUEST_POLL_RC 0x4 /* deprecated in firmware v1.20 */
28#define REQUEST_SET_GPIO 0xC 28#define REQUEST_JUMPRAM 0x8
29#define REQUEST_ENABLE_VIDEO 0xF 29#define REQUEST_SET_CLOCK 0xB
30#define REQUEST_SET_GPIO 0xC
31#define REQUEST_ENABLE_VIDEO 0xF
30 // 1 Byte: 4MSB(1 = enable streaming, 0 = disable streaming) 4LSB(Video Mode: 0 = MPEG2 188Bytes, 1 = Analog) 32 // 1 Byte: 4MSB(1 = enable streaming, 0 = disable streaming) 4LSB(Video Mode: 0 = MPEG2 188Bytes, 1 = Analog)
31 // 2 Byte: MPEG2 mode: 4MSB(1 = Master Mode, 0 = Slave Mode) 4LSB(Channel 1 = bit0, Channel 2 = bit1) 33 // 2 Byte: MPEG2 mode: 4MSB(1 = Master Mode, 0 = Slave Mode) 4LSB(Channel 1 = bit0, Channel 2 = bit1)
32 // 2 Byte: Analog mode: 4MSB(0 = 625 lines, 1 = 525 lines) 4LSB( " " ) 34 // 2 Byte: Analog mode: 4MSB(0 = 625 lines, 1 = 525 lines) 4LSB( " " )
33#define REQUEST_SET_RC 0x11 35#define REQUEST_SET_RC 0x11
34#define REQUEST_NEW_I2C_READ 0x12 36#define REQUEST_NEW_I2C_READ 0x12
35#define REQUEST_NEW_I2C_WRITE 0x13 37#define REQUEST_NEW_I2C_WRITE 0x13
36#define REQUEST_GET_VERSION 0x15 38#define REQUEST_GET_VERSION 0x15
37 39
38struct dib0700_state { 40struct dib0700_state {
39 u8 channel_state; 41 u8 channel_state;
40 u16 mt2060_if1[2]; 42 u16 mt2060_if1[2];
41 u8 rc_toggle; 43 u8 rc_toggle;
42 u8 rc_counter; 44 u8 rc_counter;
43 u8 rc_func_version;
44 u8 is_dib7000pc; 45 u8 is_dib7000pc;
45 u8 fw_use_new_i2c_api; 46 u8 fw_use_new_i2c_api;
46 u8 disable_streaming_master_mode; 47 u8 disable_streaming_master_mode;
48 u32 fw_version;
49 u32 nb_packet_buffer_size;
47}; 50};
48 51
49extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, 52extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c
index db7f7f79a66c..4f961d2d1817 100644
--- a/drivers/media/dvb/dvb-usb/dib0700_core.c
+++ b/drivers/media/dvb/dvb-usb/dib0700_core.c
@@ -17,6 +17,14 @@ int dvb_usb_dib0700_ir_proto = 1;
17module_param(dvb_usb_dib0700_ir_proto, int, 0644); 17module_param(dvb_usb_dib0700_ir_proto, int, 0644);
18MODULE_PARM_DESC(dvb_usb_dib0700_ir_proto, "set ir protocol (0=NEC, 1=RC5 (default), 2=RC6)."); 18MODULE_PARM_DESC(dvb_usb_dib0700_ir_proto, "set ir protocol (0=NEC, 1=RC5 (default), 2=RC6).");
19 19
20static int nb_packet_buffer_size = 21;
21module_param(nb_packet_buffer_size, int, 0644);
22MODULE_PARM_DESC(nb_packet_buffer_size,
23 "Set the dib0700 driver data buffer size. This parameter "
24 "corresponds to the number of TS packets. The actual size of "
25 "the data buffer corresponds to this parameter "
26 "multiplied by 188 (default: 21)");
27
20DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 28DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
21 29
22 30
@@ -28,10 +36,14 @@ int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
28 REQUEST_GET_VERSION, 36 REQUEST_GET_VERSION,
29 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, 37 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
30 b, sizeof(b), USB_CTRL_GET_TIMEOUT); 38 b, sizeof(b), USB_CTRL_GET_TIMEOUT);
31 *hwversion = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; 39 if (hwversion != NULL)
32 *romversion = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | b[7]; 40 *hwversion = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
33 *ramversion = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11]; 41 if (romversion != NULL)
34 *fwtype = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15]; 42 *romversion = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | b[7];
43 if (ramversion != NULL)
44 *ramversion = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11];
45 if (fwtype != NULL)
46 *fwtype = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15];
35 return ret; 47 return ret;
36} 48}
37 49
@@ -97,6 +109,27 @@ int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_
97 return dib0700_ctrl_wr(d,buf,3); 109 return dib0700_ctrl_wr(d,buf,3);
98} 110}
99 111
112static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets)
113{
114 struct dib0700_state *st = d->priv;
115 u8 b[3];
116 int ret;
117
118 if (st->fw_version >= 0x10201) {
119 b[0] = REQUEST_SET_USB_XFER_LEN;
120 b[1] = (nb_ts_packets >> 8)&0xff;
121 b[2] = nb_ts_packets & 0xff;
122
123 deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets);
124
125 ret = dib0700_ctrl_wr(d, b, 3);
126 } else {
127 deb_info("this firmware does not allow to change the USB xfer len\n");
128 ret = -EIO;
129 }
130 return ret;
131}
132
100/* 133/*
101 * I2C master xfer function (supported in 1.20 firmware) 134 * I2C master xfer function (supported in 1.20 firmware)
102 */ 135 */
@@ -328,7 +361,9 @@ static int dib0700_jumpram(struct usb_device *udev, u32 address)
328int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw) 361int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
329{ 362{
330 struct hexline hx; 363 struct hexline hx;
331 int pos = 0, ret, act_len; 364 int pos = 0, ret, act_len, i, adap_num;
365 u8 b[16];
366 u32 fw_version;
332 367
333 u8 buf[260]; 368 u8 buf[260];
334 369
@@ -364,6 +399,34 @@ int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw
364 } else 399 } else
365 ret = -EIO; 400 ret = -EIO;
366 401
402 /* the number of ts packet has to be at least 1 */
403 if (nb_packet_buffer_size < 1)
404 nb_packet_buffer_size = 1;
405
406 /* get the fimware version */
407 usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
408 REQUEST_GET_VERSION,
409 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
410 b, sizeof(b), USB_CTRL_GET_TIMEOUT);
411 fw_version = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11];
412
413 /* set the buffer size - DVB-USB is allocating URB buffers
414 * only after the firwmare download was successful */
415 for (i = 0; i < dib0700_device_count; i++) {
416 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
417 adap_num++) {
418 if (fw_version >= 0x10201)
419 dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
420 else {
421 /* for fw version older than 1.20.1,
422 * the buffersize has to be n times 512 */
423 dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
424 if (dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize < 512)
425 dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 512;
426 }
427 }
428 }
429
367 return ret; 430 return ret;
368} 431}
369 432
@@ -371,6 +434,18 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
371{ 434{
372 struct dib0700_state *st = adap->dev->priv; 435 struct dib0700_state *st = adap->dev->priv;
373 u8 b[4]; 436 u8 b[4];
437 int ret;
438
439 if ((onoff != 0) && (st->fw_version >= 0x10201)) {
440 /* for firmware later than 1.20.1,
441 * the USB xfer length can be set */
442 ret = dib0700_set_usb_xfer_len(adap->dev,
443 st->nb_packet_buffer_size);
444 if (ret < 0) {
445 deb_info("can not set the USB xfer len\n");
446 return ret;
447 }
448 }
374 449
375 b[0] = REQUEST_ENABLE_VIDEO; 450 b[0] = REQUEST_ENABLE_VIDEO;
376 b[1] = (onoff << 4) | 0x00; /* this bit gives a kind of command, rather than enabling something or not */ 451 b[1] = (onoff << 4) | 0x00; /* this bit gives a kind of command, rather than enabling something or not */
@@ -396,14 +471,209 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
396 return dib0700_ctrl_wr(adap->dev, b, 4); 471 return dib0700_ctrl_wr(adap->dev, b, 4);
397} 472}
398 473
474/* Number of keypresses to ignore before start repeating */
475#define RC_REPEAT_DELAY_V1_20 10
476
477/* This is the structure of the RC response packet starting in firmware 1.20 */
478struct dib0700_rc_response {
479 u8 report_id;
480 u8 data_state;
481 u16 system;
482 u8 data;
483 u8 not_data;
484};
485#define RC_MSG_SIZE_V1_20 6
486
487static void dib0700_rc_urb_completion(struct urb *purb)
488{
489 struct dvb_usb_device *d = purb->context;
490 struct dvb_usb_rc_key *keymap;
491 struct dib0700_state *st;
492 struct dib0700_rc_response poll_reply;
493 u8 *buf;
494 int found = 0;
495 u32 event;
496 int state;
497 int i;
498
499 deb_info("%s()\n", __func__);
500 if (d == NULL)
501 return;
502
503 if (d->rc_input_dev == NULL) {
504 /* This will occur if disable_rc_polling=1 */
505 usb_free_urb(purb);
506 return;
507 }
508
509 keymap = d->props.rc_key_map;
510 st = d->priv;
511 buf = (u8 *)purb->transfer_buffer;
512
513 if (purb->status < 0) {
514 deb_info("discontinuing polling\n");
515 usb_free_urb(purb);
516 return;
517 }
518
519 if (purb->actual_length != RC_MSG_SIZE_V1_20) {
520 deb_info("malformed rc msg size=%d\n", purb->actual_length);
521 goto resubmit;
522 }
523
524 /* Set initial results in case we exit the function early */
525 event = 0;
526 state = REMOTE_NO_KEY_PRESSED;
527
528 deb_data("IR raw %02X %02X %02X %02X %02X %02X (len %d)\n", buf[0],
529 buf[1], buf[2], buf[3], buf[4], buf[5], purb->actual_length);
530
531 switch (dvb_usb_dib0700_ir_proto) {
532 case 0:
533 /* NEC Protocol */
534 poll_reply.report_id = 0;
535 poll_reply.data_state = 1;
536 poll_reply.system = buf[2];
537 poll_reply.data = buf[4];
538 poll_reply.not_data = buf[5];
539
540 /* NEC protocol sends repeat code as 0 0 0 FF */
541 if ((poll_reply.system == 0x00) && (poll_reply.data == 0x00)
542 && (poll_reply.not_data == 0xff)) {
543 poll_reply.data_state = 2;
544 break;
545 }
546 break;
547 default:
548 /* RC5 Protocol */
549 poll_reply.report_id = buf[0];
550 poll_reply.data_state = buf[1];
551 poll_reply.system = (buf[2] << 8) | buf[3];
552 poll_reply.data = buf[4];
553 poll_reply.not_data = buf[5];
554 break;
555 }
556
557 if ((poll_reply.data + poll_reply.not_data) != 0xff) {
558 /* Key failed integrity check */
559 err("key failed integrity check: %04x %02x %02x",
560 poll_reply.system,
561 poll_reply.data, poll_reply.not_data);
562 goto resubmit;
563 }
564
565 deb_data("rid=%02x ds=%02x sm=%04x d=%02x nd=%02x\n",
566 poll_reply.report_id, poll_reply.data_state,
567 poll_reply.system, poll_reply.data, poll_reply.not_data);
568
569 /* Find the key in the map */
570 for (i = 0; i < d->props.rc_key_map_size; i++) {
571 if (rc5_custom(&keymap[i]) == (poll_reply.system & 0xff) &&
572 rc5_data(&keymap[i]) == poll_reply.data) {
573 event = keymap[i].event;
574 found = 1;
575 break;
576 }
577 }
578
579 if (found == 0) {
580 err("Unknown remote controller key: %04x %02x %02x",
581 poll_reply.system, poll_reply.data, poll_reply.not_data);
582 d->last_event = 0;
583 goto resubmit;
584 }
585
586 if (poll_reply.data_state == 1) {
587 /* New key hit */
588 st->rc_counter = 0;
589 event = keymap[i].event;
590 state = REMOTE_KEY_PRESSED;
591 d->last_event = keymap[i].event;
592 } else if (poll_reply.data_state == 2) {
593 /* Key repeated */
594 st->rc_counter++;
595
596 /* prevents unwanted double hits */
597 if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
598 event = d->last_event;
599 state = REMOTE_KEY_PRESSED;
600 st->rc_counter = RC_REPEAT_DELAY_V1_20;
601 }
602 } else {
603 err("Unknown data state [%d]", poll_reply.data_state);
604 }
605
606 switch (state) {
607 case REMOTE_NO_KEY_PRESSED:
608 break;
609 case REMOTE_KEY_PRESSED:
610 deb_info("key pressed\n");
611 d->last_event = event;
612 case REMOTE_KEY_REPEAT:
613 deb_info("key repeated\n");
614 input_event(d->rc_input_dev, EV_KEY, event, 1);
615 input_sync(d->rc_input_dev);
616 input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
617 input_sync(d->rc_input_dev);
618 break;
619 default:
620 break;
621 }
622
623resubmit:
624 /* Clean the buffer before we requeue */
625 memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);
626
627 /* Requeue URB */
628 usb_submit_urb(purb, GFP_ATOMIC);
629}
630
399int dib0700_rc_setup(struct dvb_usb_device *d) 631int dib0700_rc_setup(struct dvb_usb_device *d)
400{ 632{
633 struct dib0700_state *st = d->priv;
401 u8 rc_setup[3] = {REQUEST_SET_RC, dvb_usb_dib0700_ir_proto, 0}; 634 u8 rc_setup[3] = {REQUEST_SET_RC, dvb_usb_dib0700_ir_proto, 0};
402 int i = dib0700_ctrl_wr(d, rc_setup, 3); 635 struct urb *purb;
636 int ret;
637 int i;
638
639 if (d->props.rc_key_map == NULL)
640 return 0;
641
642 /* Set the IR mode */
643 i = dib0700_ctrl_wr(d, rc_setup, 3);
403 if (i<0) { 644 if (i<0) {
404 err("ir protocol setup failed"); 645 err("ir protocol setup failed");
405 return -1; 646 return -1;
406 } 647 }
648
649 if (st->fw_version < 0x10200)
650 return 0;
651
652 /* Starting in firmware 1.20, the RC info is provided on a bulk pipe */
653 purb = usb_alloc_urb(0, GFP_KERNEL);
654 if (purb == NULL) {
655 err("rc usb alloc urb failed\n");
656 return -1;
657 }
658
659 purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
660 if (purb->transfer_buffer == NULL) {
661 err("rc kzalloc failed\n");
662 usb_free_urb(purb);
663 return -1;
664 }
665
666 purb->status = -EINPROGRESS;
667 usb_fill_bulk_urb(purb, d->udev, usb_rcvbulkpipe(d->udev, 1),
668 purb->transfer_buffer, RC_MSG_SIZE_V1_20,
669 dib0700_rc_urb_completion, d);
670
671 ret = usb_submit_urb(purb, GFP_ATOMIC);
672 if (ret != 0) {
673 err("rc submit urb failed\n");
674 return -1;
675 }
676
407 return 0; 677 return 0;
408} 678}
409 679
@@ -415,9 +685,21 @@ static int dib0700_probe(struct usb_interface *intf,
415 685
416 for (i = 0; i < dib0700_device_count; i++) 686 for (i = 0; i < dib0700_device_count; i++)
417 if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE, 687 if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
418 &dev, adapter_nr) == 0) 688 &dev, adapter_nr) == 0) {
419 { 689 struct dib0700_state *st = dev->priv;
690 u32 hwversion, romversion, fw_version, fwtype;
691
692 dib0700_get_version(dev, &hwversion, &romversion,
693 &fw_version, &fwtype);
694
695 deb_info("Firmware version: %x, %d, 0x%x, %d\n",
696 hwversion, romversion, fw_version, fwtype);
697
698 st->fw_version = fw_version;
699 st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;
700
420 dib0700_rc_setup(dev); 701 dib0700_rc_setup(dev);
702
421 return 0; 703 return 0;
422 } 704 }
423 705
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
index 6bd8951ea02b..34eab05afc6c 100644
--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
+++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
@@ -18,6 +18,7 @@
18#include "xc5000.h" 18#include "xc5000.h"
19#include "s5h1411.h" 19#include "s5h1411.h"
20#include "dib0070.h" 20#include "dib0070.h"
21#include "dib0090.h"
21#include "lgdt3305.h" 22#include "lgdt3305.h"
22#include "mxl5007t.h" 23#include "mxl5007t.h"
23 24
@@ -130,93 +131,95 @@ static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
130/* MT226x */ 131/* MT226x */
131static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = { 132static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
132 { 133 {
133 BAND_UHF, // band_caps 134 BAND_UHF,
134 135
135 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1, 136 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
136 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 137 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
137 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup 138 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
138 139 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
139 1130, // inv_gain 140
140 21, // time_stabiliz 141 1130,
141 142 21,
142 0, // alpha_level 143
143 118, // thlock 144 0,
144 145 118,
145 0, // wbd_inv 146
146 3530, // wbd_ref 147 0,
147 1, // wbd_sel 148 3530,
148 0, // wbd_alpha 149 1,
149 150 0,
150 65535, // agc1_max 151
151 33770, // agc1_min 152 65535,
152 65535, // agc2_max 153 33770,
153 23592, // agc2_min 154 65535,
154 155 23592,
155 0, // agc1_pt1 156
156 62, // agc1_pt2 157 0,
157 255, // agc1_pt3 158 62,
158 64, // agc1_slope1 159 255,
159 64, // agc1_slope2 160 64,
160 132, // agc2_pt1 161 64,
161 192, // agc2_pt2 162 132,
162 80, // agc2_slope1 163 192,
163 80, // agc2_slope2 164 80,
164 165 80,
165 17, // alpha_mant 166
166 27, // alpha_exp 167 17,
167 23, // beta_mant 168 27,
168 51, // beta_exp 169 23,
169 170 51,
170 1, // perform_agc_softsplit 171
172 1,
171 }, { 173 }, {
172 BAND_VHF | BAND_LBAND, // band_caps 174 BAND_VHF | BAND_LBAND,
173 175
174 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1, 176 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
175 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 177 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
176 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup 178 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
177 179 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
178 2372, // inv_gain 180
179 21, // time_stabiliz 181 2372,
180 182 21,
181 0, // alpha_level 183
182 118, // thlock 184 0,
183 185 118,
184 0, // wbd_inv 186
185 3530, // wbd_ref 187 0,
186 1, // wbd_sel 188 3530,
187 0, // wbd_alpha 189 1,
188 190 0,
189 65535, // agc1_max 191
190 0, // agc1_min 192 65535,
191 65535, // agc2_max 193 0,
192 23592, // agc2_min 194 65535,
193 195 23592,
194 0, // agc1_pt1 196
195 128, // agc1_pt2 197 0,
196 128, // agc1_pt3 198 128,
197 128, // agc1_slope1 199 128,
198 0, // agc1_slope2 200 128,
199 128, // agc2_pt1 201 0,
200 253, // agc2_pt2 202 128,
201 81, // agc2_slope1 203 253,
202 0, // agc2_slope2 204 81,
203 205 0,
204 17, // alpha_mant 206
205 27, // alpha_exp 207 17,
206 23, // beta_mant 208 27,
207 51, // beta_exp 209 23,
208 210 51,
209 1, // perform_agc_softsplit 211
212 1,
210 } 213 }
211}; 214};
212 215
213static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = { 216static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
214 60000, 30000, // internal, sampling 217 60000, 30000,
215 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass 218 1, 8, 3, 1, 0,
216 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo 219 0, 0, 1, 1, 2,
217 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k 220 (3 << 14) | (1 << 12) | (524 << 0),
218 0, // ifreq 221 0,
219 20452225, // timf 222 20452225,
220}; 223};
221 224
222static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = { 225static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
@@ -469,20 +472,25 @@ static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
469 472
470/* Number of keypresses to ignore before start repeating */ 473/* Number of keypresses to ignore before start repeating */
471#define RC_REPEAT_DELAY 6 474#define RC_REPEAT_DELAY 6
472#define RC_REPEAT_DELAY_V1_20 10
473
474
475 475
476/* Used by firmware versions < 1.20 (deprecated) */ 476static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
477static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
478 int *state)
479{ 477{
480 u8 key[4]; 478 u8 key[4];
481 int i; 479 int i;
482 struct dvb_usb_rc_key *keymap = d->props.rc_key_map; 480 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
483 struct dib0700_state *st = d->priv; 481 struct dib0700_state *st = d->priv;
482
484 *event = 0; 483 *event = 0;
485 *state = REMOTE_NO_KEY_PRESSED; 484 *state = REMOTE_NO_KEY_PRESSED;
485
486 if (st->fw_version >= 0x10200) {
487 /* For 1.20 firmware , We need to keep the RC polling
488 callback so we can reuse the input device setup in
489 dvb-usb-remote.c. However, the actual work is being done
490 in the bulk URB completion handler. */
491 return 0;
492 }
493
486 i=dib0700_ctrl_rd(d,rc_request,2,key,4); 494 i=dib0700_ctrl_rd(d,rc_request,2,key,4);
487 if (i<=0) { 495 if (i<=0) {
488 err("RC Query Failed"); 496 err("RC Query Failed");
@@ -554,137 +562,6 @@ static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
554 return 0; 562 return 0;
555} 563}
556 564
557/* This is the structure of the RC response packet starting in firmware 1.20 */
558struct dib0700_rc_response {
559 u8 report_id;
560 u8 data_state;
561 u8 system_msb;
562 u8 system_lsb;
563 u8 data;
564 u8 not_data;
565};
566
567/* This supports the new IR response format for firmware v1.20 */
568static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
569 int *state)
570{
571 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
572 struct dib0700_state *st = d->priv;
573 struct dib0700_rc_response poll_reply;
574 u8 buf[6];
575 int i;
576 int status;
577 int actlen;
578 int found = 0;
579
580 /* Set initial results in case we exit the function early */
581 *event = 0;
582 *state = REMOTE_NO_KEY_PRESSED;
583
584 /* Firmware v1.20 provides RC data via bulk endpoint 1 */
585 status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
586 sizeof(buf), &actlen, 50);
587 if (status < 0) {
588 /* No data available (meaning no key press) */
589 return 0;
590 }
591
592 if (actlen != sizeof(buf)) {
593 /* We didn't get back the 6 byte message we expected */
594 err("Unexpected RC response size [%d]", actlen);
595 return -1;
596 }
597
598 poll_reply.report_id = buf[0];
599 poll_reply.data_state = buf[1];
600 poll_reply.system_msb = buf[2];
601 poll_reply.system_lsb = buf[3];
602 poll_reply.data = buf[4];
603 poll_reply.not_data = buf[5];
604
605 /*
606 info("rid=%02x ds=%02x sm=%02x sl=%02x d=%02x nd=%02x\n",
607 poll_reply.report_id, poll_reply.data_state,
608 poll_reply.system_msb, poll_reply.system_lsb,
609 poll_reply.data, poll_reply.not_data);
610 */
611
612 if ((poll_reply.data + poll_reply.not_data) != 0xff) {
613 /* Key failed integrity check */
614 err("key failed integrity check: %02x %02x %02x %02x",
615 poll_reply.system_msb, poll_reply.system_lsb,
616 poll_reply.data, poll_reply.not_data);
617 return -1;
618 }
619
620 /* Find the key in the map */
621 for (i = 0; i < d->props.rc_key_map_size; i++) {
622 if (rc5_custom(&keymap[i]) == poll_reply.system_lsb &&
623 rc5_data(&keymap[i]) == poll_reply.data) {
624 *event = keymap[i].event;
625 found = 1;
626 break;
627 }
628 }
629
630 if (found == 0) {
631 err("Unknown remote controller key: %02x %02x %02x %02x",
632 poll_reply.system_msb, poll_reply.system_lsb,
633 poll_reply.data, poll_reply.not_data);
634 d->last_event = 0;
635 return 0;
636 }
637
638 if (poll_reply.data_state == 1) {
639 /* New key hit */
640 st->rc_counter = 0;
641 *event = keymap[i].event;
642 *state = REMOTE_KEY_PRESSED;
643 d->last_event = keymap[i].event;
644 } else if (poll_reply.data_state == 2) {
645 /* Key repeated */
646 st->rc_counter++;
647
648 /* prevents unwanted double hits */
649 if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
650 *event = d->last_event;
651 *state = REMOTE_KEY_PRESSED;
652 st->rc_counter = RC_REPEAT_DELAY_V1_20;
653 }
654 } else {
655 err("Unknown data state [%d]", poll_reply.data_state);
656 }
657
658 return 0;
659}
660
661static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
662{
663 struct dib0700_state *st = d->priv;
664
665 /* Because some people may have improperly named firmware files,
666 let's figure out whether to use the new firmware call or the legacy
667 call based on the firmware version embedded in the file */
668 if (st->rc_func_version == 0) {
669 u32 hwver, romver, ramver, fwtype;
670 int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
671 &fwtype);
672 if (ret < 0) {
673 err("Could not determine version info");
674 return -1;
675 }
676 if (ramver < 0x10200)
677 st->rc_func_version = 1;
678 else
679 st->rc_func_version = 2;
680 }
681
682 if (st->rc_func_version == 2)
683 return dib0700_rc_query_v1_20(d, event, state);
684 else
685 return dib0700_rc_query_legacy(d, event, state);
686}
687
688static struct dvb_usb_rc_key dib0700_rc_keys[] = { 565static struct dvb_usb_rc_key dib0700_rc_keys[] = {
689 /* Key codes for the tiny Pinnacle remote*/ 566 /* Key codes for the tiny Pinnacle remote*/
690 { 0x0700, KEY_MUTE }, 567 { 0x0700, KEY_MUTE },
@@ -874,51 +751,95 @@ static struct dvb_usb_rc_key dib0700_rc_keys[] = {
874 { 0x1d37, KEY_RECORD }, 751 { 0x1d37, KEY_RECORD },
875 { 0x1d3b, KEY_GOTO }, 752 { 0x1d3b, KEY_GOTO },
876 { 0x1d3d, KEY_POWER }, 753 { 0x1d3d, KEY_POWER },
754
755 /* Key codes for the Pixelview SBTVD remote (proto NEC) */
756 { 0x8613, KEY_MUTE },
757 { 0x8612, KEY_POWER },
758 { 0x8601, KEY_1 },
759 { 0x8602, KEY_2 },
760 { 0x8603, KEY_3 },
761 { 0x8604, KEY_4 },
762 { 0x8605, KEY_5 },
763 { 0x8606, KEY_6 },
764 { 0x8607, KEY_7 },
765 { 0x8608, KEY_8 },
766 { 0x8609, KEY_9 },
767 { 0x8600, KEY_0 },
768 { 0x860d, KEY_CHANNELUP },
769 { 0x8619, KEY_CHANNELDOWN },
770 { 0x8610, KEY_VOLUMEUP },
771 { 0x860c, KEY_VOLUMEDOWN },
772
773 { 0x860a, KEY_CAMERA },
774 { 0x860b, KEY_ZOOM },
775 { 0x861b, KEY_BACKSPACE },
776 { 0x8615, KEY_ENTER },
777
778 { 0x861d, KEY_UP },
779 { 0x861e, KEY_DOWN },
780 { 0x860e, KEY_LEFT },
781 { 0x860f, KEY_RIGHT },
782
783 { 0x8618, KEY_RECORD },
784 { 0x861a, KEY_STOP },
785
786 /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
787 { 0x7a00, KEY_MENU },
788 { 0x7a01, KEY_RECORD },
789 { 0x7a02, KEY_PLAY },
790 { 0x7a03, KEY_STOP },
791 { 0x7a10, KEY_CHANNELUP },
792 { 0x7a11, KEY_CHANNELDOWN },
793 { 0x7a12, KEY_VOLUMEUP },
794 { 0x7a13, KEY_VOLUMEDOWN },
795 { 0x7a40, KEY_POWER },
796 { 0x7a41, KEY_MUTE },
877}; 797};
878 798
879/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */ 799/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
880static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = { 800static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
881 BAND_UHF | BAND_VHF, // band_caps 801 BAND_UHF | BAND_VHF,
882 802
883 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 803 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
884 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 804 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
885 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup 805 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
886 806 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
887 712, // inv_gain 807
888 41, // time_stabiliz 808 712,
889 809 41,
890 0, // alpha_level 810
891 118, // thlock 811 0,
892 812 118,
893 0, // wbd_inv 813
894 4095, // wbd_ref 814 0,
895 0, // wbd_sel 815 4095,
896 0, // wbd_alpha 816 0,
897 817 0,
898 42598, // agc1_max 818
899 17694, // agc1_min 819 42598,
900 45875, // agc2_max 820 17694,
901 2621, // agc2_min 821 45875,
902 0, // agc1_pt1 822 2621,
903 76, // agc1_pt2 823 0,
904 139, // agc1_pt3 824 76,
905 52, // agc1_slope1 825 139,
906 59, // agc1_slope2 826 52,
907 107, // agc2_pt1 827 59,
908 172, // agc2_pt2 828 107,
909 57, // agc2_slope1 829 172,
910 70, // agc2_slope2 830 57,
911 831 70,
912 21, // alpha_mant 832
913 25, // alpha_exp 833 21,
914 28, // beta_mant 834 25,
915 48, // beta_exp 835 28,
916 836 48,
917 1, // perform_agc_softsplit 837
918 { 0, // split_min 838 1,
919 107, // split_max 839 { 0,
920 51800, // global_split_min 840 107,
921 24700 // global_split_max 841 51800,
842 24700
922 }, 843 },
923}; 844};
924 845
@@ -927,54 +848,55 @@ static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
927 848
928 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 849 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
929 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ 850 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
930 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup 851 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
852 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
931 853
932 712, // inv_gain 854 712,
933 41, // time_stabiliz 855 41,
934 856
935 0, // alpha_level 857 0,
936 118, // thlock 858 118,
937 859
938 0, // wbd_inv 860 0,
939 4095, // wbd_ref 861 4095,
940 0, // wbd_sel 862 0,
941 0, // wbd_alpha 863 0,
942 864
943 42598, // agc1_max 865 42598,
944 16384, // agc1_min 866 16384,
945 42598, // agc2_max 867 42598,
946 0, // agc2_min 868 0,
947 869
948 0, // agc1_pt1 870 0,
949 137, // agc1_pt2 871 137,
950 255, // agc1_pt3 872 255,
951 873
952 0, // agc1_slope1 874 0,
953 255, // agc1_slope2 875 255,
954 876
955 0, // agc2_pt1 877 0,
956 0, // agc2_pt2 878 0,
957 879
958 0, // agc2_slope1 880 0,
959 41, // agc2_slope2 881 41,
960 882
961 15, // alpha_mant 883 15,
962 25, // alpha_exp 884 25,
963 885
964 28, // beta_mant 886 28,
965 48, // beta_exp 887 48,
966 888
967 0, // perform_agc_softsplit 889 0,
968}; 890};
969 891
970static struct dibx000_bandwidth_config stk7700p_pll_config = { 892static struct dibx000_bandwidth_config stk7700p_pll_config = {
971 60000, 30000, // internal, sampling 893 60000, 30000,
972 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass 894 1, 8, 3, 1, 0,
973 0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo 895 0, 0, 1, 1, 0,
974 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k 896 (3 << 14) | (1 << 12) | (524 << 0),
975 60258167, // ifreq 897 60258167,
976 20452225, // timf 898 20452225,
977 30000000, // xtal 899 30000000,
978}; 900};
979 901
980static struct dib7000m_config stk7700p_dib7000m_config = { 902static struct dib7000m_config stk7700p_dib7000m_config = {
@@ -1060,41 +982,42 @@ static struct dibx000_agc_config dib7070_agc_config = {
1060 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND, 982 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1061 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 983 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
1062 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */ 984 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1063 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup 985 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1064 986 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1065 600, // inv_gain 987
1066 10, // time_stabiliz 988 600,
1067 989 10,
1068 0, // alpha_level 990
1069 118, // thlock 991 0,
1070 992 118,
1071 0, // wbd_inv 993
1072 3530, // wbd_ref 994 0,
1073 1, // wbd_sel 995 3530,
1074 5, // wbd_alpha 996 1,
1075 997 5,
1076 65535, // agc1_max 998
1077 0, // agc1_min 999 65535,
1078 1000 0,
1079 65535, // agc2_max 1001
1080 0, // agc2_min 1002 65535,
1081 1003 0,
1082 0, // agc1_pt1 1004
1083 40, // agc1_pt2 1005 0,
1084 183, // agc1_pt3 1006 40,
1085 206, // agc1_slope1 1007 183,
1086 255, // agc1_slope2 1008 206,
1087 72, // agc2_pt1 1009 255,
1088 152, // agc2_pt2 1010 72,
1089 88, // agc2_slope1 1011 152,
1090 90, // agc2_slope2 1012 88,
1091 1013 90,
1092 17, // alpha_mant 1014
1093 27, // alpha_exp 1015 17,
1094 23, // beta_mant 1016 27,
1095 51, // beta_exp 1017 23,
1096 1018 51,
1097 0, // perform_agc_softsplit 1019
1020 0,
1098}; 1021};
1099 1022
1100static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff) 1023static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
@@ -1133,6 +1056,7 @@ static struct dib0070_config dib7770p_dib0070_config = {
1133 .clock_khz = 12000, 1056 .clock_khz = 12000,
1134 .clock_pad_drive = 0, 1057 .clock_pad_drive = 0,
1135 .flip_chip = 1, 1058 .flip_chip = 1,
1059 .charge_pump = 2,
1136}; 1060};
1137 1061
1138static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) 1062static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
@@ -1209,14 +1133,24 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1209 return 0; 1133 return 0;
1210} 1134}
1211 1135
1136static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1137{
1138 return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1139}
1140
1141static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1142{
1143 return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1144}
1145
1212static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = { 1146static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
1213 60000, 15000, // internal, sampling 1147 60000, 15000,
1214 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass 1148 1, 20, 3, 1, 0,
1215 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo 1149 0, 0, 1, 1, 2,
1216 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k 1150 (3 << 14) | (1 << 12) | (524 << 0),
1217 (0 << 25) | 0, // ifreq = 0.000000 MHz 1151 (0 << 25) | 0,
1218 20452225, // timf 1152 20452225,
1219 12000000, // xtal_hz 1153 12000000,
1220}; 1154};
1221 1155
1222static struct dib7000p_config dib7070p_dib7000p_config = { 1156static struct dib7000p_config dib7070p_dib7000p_config = {
@@ -1410,12 +1344,12 @@ static struct dib8000_config dib807x_dib8000_config[2] = {
1410 } 1344 }
1411}; 1345};
1412 1346
1413static int dib807x_tuner_reset(struct dvb_frontend *fe, int onoff) 1347static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1414{ 1348{
1415 return dib8000_set_gpio(fe, 5, 0, !onoff); 1349 return dib8000_set_gpio(fe, 5, 0, !onoff);
1416} 1350}
1417 1351
1418static int dib807x_tuner_sleep(struct dvb_frontend *fe, int onoff) 1352static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1419{ 1353{
1420 return dib8000_set_gpio(fe, 0, 0, onoff); 1354 return dib8000_set_gpio(fe, 0, 0, onoff);
1421} 1355}
@@ -1428,8 +1362,8 @@ static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1428static struct dib0070_config dib807x_dib0070_config[2] = { 1362static struct dib0070_config dib807x_dib0070_config[2] = {
1429 { 1363 {
1430 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 1364 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1431 .reset = dib807x_tuner_reset, 1365 .reset = dib80xx_tuner_reset,
1432 .sleep = dib807x_tuner_sleep, 1366 .sleep = dib80xx_tuner_sleep,
1433 .clock_khz = 12000, 1367 .clock_khz = 12000,
1434 .clock_pad_drive = 4, 1368 .clock_pad_drive = 4,
1435 .vga_filter = 1, 1369 .vga_filter = 1,
@@ -1442,8 +1376,8 @@ static struct dib0070_config dib807x_dib0070_config[2] = {
1442 .freq_offset_khz_vhf = -100, 1376 .freq_offset_khz_vhf = -100,
1443 }, { 1377 }, {
1444 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS, 1378 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1445 .reset = dib807x_tuner_reset, 1379 .reset = dib80xx_tuner_reset,
1446 .sleep = dib807x_tuner_sleep, 1380 .sleep = dib80xx_tuner_sleep,
1447 .clock_khz = 12000, 1381 .clock_khz = 12000,
1448 .clock_pad_drive = 2, 1382 .clock_pad_drive = 2,
1449 .vga_filter = 1, 1383 .vga_filter = 1,
@@ -1500,6 +1434,17 @@ static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1500 return 0; 1434 return 0;
1501} 1435}
1502 1436
1437static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1438 u16 pid, int onoff)
1439{
1440 return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1441}
1442
1443static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1444 int onoff)
1445{
1446 return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1447}
1503 1448
1504/* STK807x */ 1449/* STK807x */
1505static int stk807x_frontend_attach(struct dvb_usb_adapter *adap) 1450static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
@@ -1549,7 +1494,7 @@ static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1549 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 1494 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1550 1495
1551 /* initialize IC 0 */ 1496 /* initialize IC 0 */
1552 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80); 1497 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80);
1553 1498
1554 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, 1499 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1555 &dib807x_dib8000_config[0]); 1500 &dib807x_dib8000_config[0]);
@@ -1560,7 +1505,7 @@ static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1560static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap) 1505static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1561{ 1506{
1562 /* initialize IC 1 */ 1507 /* initialize IC 1 */
1563 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82); 1508 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82);
1564 1509
1565 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, 1510 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1566 &dib807x_dib8000_config[1]); 1511 &dib807x_dib8000_config[1]);
@@ -1568,6 +1513,245 @@ static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1568 return adap->fe == NULL ? -ENODEV : 0; 1513 return adap->fe == NULL ? -ENODEV : 0;
1569} 1514}
1570 1515
1516/* STK8096GP */
1517struct dibx000_agc_config dib8090_agc_config[2] = {
1518 {
1519 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1520 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1521 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1522 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1523 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1524 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1525
1526 787,
1527 10,
1528
1529 0,
1530 118,
1531
1532 0,
1533 3530,
1534 1,
1535 5,
1536
1537 65535,
1538 0,
1539
1540 65535,
1541 0,
1542
1543 0,
1544 32,
1545 114,
1546 143,
1547 144,
1548 114,
1549 227,
1550 116,
1551 117,
1552
1553 28,
1554 26,
1555 31,
1556 51,
1557
1558 0,
1559 },
1560 {
1561 BAND_CBAND,
1562 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1563 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1564 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1565 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1566 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1567
1568 787,
1569 10,
1570
1571 0,
1572 118,
1573
1574 0,
1575 3530,
1576 1,
1577 5,
1578
1579 0,
1580 0,
1581
1582 65535,
1583 0,
1584
1585 0,
1586 32,
1587 114,
1588 143,
1589 144,
1590 114,
1591 227,
1592 116,
1593 117,
1594
1595 28,
1596 26,
1597 31,
1598 51,
1599
1600 0,
1601 }
1602};
1603
1604static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1605 54000, 13500,
1606 1, 18, 3, 1, 0,
1607 0, 0, 1, 1, 2,
1608 (3 << 14) | (1 << 12) | (599 << 0),
1609 (0 << 25) | 0,
1610 20199727,
1611 12000000,
1612};
1613
1614static int dib8090_get_adc_power(struct dvb_frontend *fe)
1615{
1616 return dib8000_get_adc_power(fe, 1);
1617}
1618
1619static struct dib8000_config dib809x_dib8000_config = {
1620 .output_mpeg2_in_188_bytes = 1,
1621
1622 .agc_config_count = 2,
1623 .agc = dib8090_agc_config,
1624 .agc_control = dib0090_dcc_freq,
1625 .pll = &dib8090_pll_config_12mhz,
1626 .tuner_is_baseband = 1,
1627
1628 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1629 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1630 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1631
1632 .hostbus_diversity = 1,
1633 .div_cfg = 0x31,
1634 .output_mode = OUTMODE_MPEG2_FIFO,
1635 .drives = 0x2d98,
1636 .diversity_delay = 144,
1637 .refclksel = 3,
1638};
1639
1640static struct dib0090_config dib809x_dib0090_config = {
1641 .io.pll_bypass = 1,
1642 .io.pll_range = 1,
1643 .io.pll_prediv = 1,
1644 .io.pll_loopdiv = 20,
1645 .io.adc_clock_ratio = 8,
1646 .io.pll_int_loop_filt = 0,
1647 .io.clock_khz = 12000,
1648 .reset = dib80xx_tuner_reset,
1649 .sleep = dib80xx_tuner_sleep,
1650 .clkouttobamse = 1,
1651 .analog_output = 1,
1652 .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1653 .wbd_vhf_offset = 100,
1654 .wbd_cband_offset = 450,
1655 .use_pwm_agc = 1,
1656 .clkoutdrive = 1,
1657 .get_adc_power = dib8090_get_adc_power,
1658 .freq_offset_khz_uhf = 0,
1659 .freq_offset_khz_vhf = -143,
1660};
1661
1662static int dib8096_set_param_override(struct dvb_frontend *fe,
1663 struct dvb_frontend_parameters *fep)
1664{
1665 struct dvb_usb_adapter *adap = fe->dvb->priv;
1666 struct dib0700_adapter_state *state = adap->priv;
1667 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1668 u16 offset;
1669 int ret = 0;
1670 enum frontend_tune_state tune_state = CT_SHUTDOWN;
1671 u16 ltgain, rf_gain_limit;
1672
1673 ret = state->set_param_save(fe, fep);
1674 if (ret < 0)
1675 return ret;
1676
1677 switch (band) {
1678 case BAND_VHF:
1679 offset = 100;
1680 break;
1681 case BAND_UHF:
1682 offset = 550;
1683 break;
1684 default:
1685 offset = 0;
1686 break;
1687 }
1688 offset += (dib0090_get_wbd_offset(fe) * 8 * 18 / 33 + 1) / 2;
1689 dib8000_set_wbd_ref(fe, offset);
1690
1691
1692 if (band == BAND_CBAND) {
1693 deb_info("tuning in CBAND - soft-AGC startup\n");
1694 /* TODO specific wbd target for dib0090 - needed for startup ? */
1695 dib0090_set_tune_state(fe, CT_AGC_START);
1696 do {
1697 ret = dib0090_gain_control(fe);
1698 msleep(ret);
1699 tune_state = dib0090_get_tune_state(fe);
1700 if (tune_state == CT_AGC_STEP_0)
1701 dib8000_set_gpio(fe, 6, 0, 1);
1702 else if (tune_state == CT_AGC_STEP_1) {
1703 dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1704 if (rf_gain_limit == 0)
1705 dib8000_set_gpio(fe, 6, 0, 0);
1706 }
1707 } while (tune_state < CT_AGC_STOP);
1708 dib0090_pwm_gain_reset(fe);
1709 dib8000_pwm_agc_reset(fe);
1710 dib8000_set_tune_state(fe, CT_DEMOD_START);
1711 } else {
1712 deb_info("not tuning in CBAND - standard AGC startup\n");
1713 dib0090_pwm_gain_reset(fe);
1714 }
1715
1716 return 0;
1717}
1718
1719static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1720{
1721 struct dib0700_adapter_state *st = adap->priv;
1722 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1723
1724 if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1725 return -ENODEV;
1726
1727 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1728 adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1729 return 0;
1730}
1731
1732static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1733{
1734 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1735 msleep(10);
1736 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1737 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1738 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1739
1740 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1741
1742 dib0700_ctrl_clock(adap->dev, 72, 1);
1743
1744 msleep(10);
1745 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1746 msleep(10);
1747 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1748
1749 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1750
1751 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config);
1752
1753 return adap->fe == NULL ? -ENODEV : 0;
1754}
1571 1755
1572/* STK7070PD */ 1756/* STK7070PD */
1573static struct dib7000p_config stk7070pd_dib7000p_config[2] = { 1757static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
@@ -1854,13 +2038,17 @@ struct usb_device_id dib0700_usb_id_table[] = {
1854 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) }, 2038 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
1855/* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) }, 2039/* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
1856 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) }, 2040 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
1857 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) }, 2041 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV73ESE) },
1858 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) }, 2042 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV282E) },
1859 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) }, 2043 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
1860/* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) }, 2044/* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
1861 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) }, 2045 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
1862 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) }, 2046 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
1863 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) }, 2047 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
2048 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
2049/* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
2050 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
2051 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096GP) },
1864 { 0 } /* Terminating entry */ 2052 { 0 } /* Terminating entry */
1865}; 2053};
1866MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); 2054MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
@@ -1895,6 +2083,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1895 .num_adapters = 1, 2083 .num_adapters = 1,
1896 .adapter = { 2084 .adapter = {
1897 { 2085 {
2086 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2087 .pid_filter_count = 32,
2088 .pid_filter = stk70x0p_pid_filter,
2089 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
1898 .frontend_attach = stk7700p_frontend_attach, 2090 .frontend_attach = stk7700p_frontend_attach,
1899 .tuner_attach = stk7700p_tuner_attach, 2091 .tuner_attach = stk7700p_tuner_attach,
1900 2092
@@ -1976,11 +2168,19 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1976 .num_adapters = 2, 2168 .num_adapters = 2,
1977 .adapter = { 2169 .adapter = {
1978 { 2170 {
2171 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2172 .pid_filter_count = 32,
2173 .pid_filter = stk70x0p_pid_filter,
2174 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
1979 .frontend_attach = stk7700d_frontend_attach, 2175 .frontend_attach = stk7700d_frontend_attach,
1980 .tuner_attach = stk7700d_tuner_attach, 2176 .tuner_attach = stk7700d_tuner_attach,
1981 2177
1982 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 2178 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
1983 }, { 2179 }, {
2180 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2181 .pid_filter_count = 32,
2182 .pid_filter = stk70x0p_pid_filter,
2183 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
1984 .frontend_attach = stk7700d_frontend_attach, 2184 .frontend_attach = stk7700d_frontend_attach,
1985 .tuner_attach = stk7700d_tuner_attach, 2185 .tuner_attach = stk7700d_tuner_attach,
1986 2186
@@ -2023,6 +2223,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2023 .num_adapters = 1, 2223 .num_adapters = 1,
2024 .adapter = { 2224 .adapter = {
2025 { 2225 {
2226 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2227 .pid_filter_count = 32,
2228 .pid_filter = stk70x0p_pid_filter,
2229 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2026 .frontend_attach = stk7700P2_frontend_attach, 2230 .frontend_attach = stk7700P2_frontend_attach,
2027 .tuner_attach = stk7700d_tuner_attach, 2231 .tuner_attach = stk7700d_tuner_attach,
2028 2232
@@ -2055,6 +2259,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2055 .num_adapters = 1, 2259 .num_adapters = 1,
2056 .adapter = { 2260 .adapter = {
2057 { 2261 {
2262 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2263 .pid_filter_count = 32,
2264 .pid_filter = stk70x0p_pid_filter,
2265 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2058 .frontend_attach = stk7070p_frontend_attach, 2266 .frontend_attach = stk7070p_frontend_attach,
2059 .tuner_attach = dib7070p_tuner_attach, 2267 .tuner_attach = dib7070p_tuner_attach,
2060 2268
@@ -2122,6 +2330,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2122 .num_adapters = 1, 2330 .num_adapters = 1,
2123 .adapter = { 2331 .adapter = {
2124 { 2332 {
2333 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2334 .pid_filter_count = 32,
2335 .pid_filter = stk70x0p_pid_filter,
2336 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2125 .frontend_attach = stk7070p_frontend_attach, 2337 .frontend_attach = stk7070p_frontend_attach,
2126 .tuner_attach = dib7070p_tuner_attach, 2338 .tuner_attach = dib7070p_tuner_attach,
2127 2339
@@ -2138,11 +2350,11 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2138 { NULL }, 2350 { NULL },
2139 }, 2351 },
2140 { "Pinnacle PCTV 73e SE", 2352 { "Pinnacle PCTV 73e SE",
2141 { &dib0700_usb_id_table[57], NULL }, 2353 { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
2142 { NULL }, 2354 { NULL },
2143 }, 2355 },
2144 { "Pinnacle PCTV 282e", 2356 { "Pinnacle PCTV 282e",
2145 { &dib0700_usb_id_table[58], NULL }, 2357 { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
2146 { NULL }, 2358 { NULL },
2147 }, 2359 },
2148 }, 2360 },
@@ -2157,6 +2369,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2157 .num_adapters = 2, 2369 .num_adapters = 2,
2158 .adapter = { 2370 .adapter = {
2159 { 2371 {
2372 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2373 .pid_filter_count = 32,
2374 .pid_filter = stk70x0p_pid_filter,
2375 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2160 .frontend_attach = stk7070pd_frontend_attach0, 2376 .frontend_attach = stk7070pd_frontend_attach0,
2161 .tuner_attach = dib7070p_tuner_attach, 2377 .tuner_attach = dib7070p_tuner_attach,
2162 2378
@@ -2164,6 +2380,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2164 2380
2165 .size_of_priv = sizeof(struct dib0700_adapter_state), 2381 .size_of_priv = sizeof(struct dib0700_adapter_state),
2166 }, { 2382 }, {
2383 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2384 .pid_filter_count = 32,
2385 .pid_filter = stk70x0p_pid_filter,
2386 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2167 .frontend_attach = stk7070pd_frontend_attach1, 2387 .frontend_attach = stk7070pd_frontend_attach1,
2168 .tuner_attach = dib7070p_tuner_attach, 2388 .tuner_attach = dib7070p_tuner_attach,
2169 2389
@@ -2210,6 +2430,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2210 .num_adapters = 1, 2430 .num_adapters = 1,
2211 .adapter = { 2431 .adapter = {
2212 { 2432 {
2433 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2434 .pid_filter_count = 32,
2435 .pid_filter = stk70x0p_pid_filter,
2436 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2213 .frontend_attach = stk7700ph_frontend_attach, 2437 .frontend_attach = stk7700ph_frontend_attach,
2214 .tuner_attach = stk7700ph_tuner_attach, 2438 .tuner_attach = stk7700ph_tuner_attach,
2215 2439
@@ -2322,6 +2546,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2322 .num_adapters = 1, 2546 .num_adapters = 1,
2323 .adapter = { 2547 .adapter = {
2324 { 2548 {
2549 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2550 .pid_filter_count = 32,
2551 .pid_filter = stk70x0p_pid_filter,
2552 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2325 .frontend_attach = stk7070p_frontend_attach, 2553 .frontend_attach = stk7070p_frontend_attach,
2326 .tuner_attach = dib7770p_tuner_attach, 2554 .tuner_attach = dib7770p_tuner_attach,
2327 2555
@@ -2353,6 +2581,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2353 .num_adapters = 1, 2581 .num_adapters = 1,
2354 .adapter = { 2582 .adapter = {
2355 { 2583 {
2584 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2585 .pid_filter_count = 32,
2586 .pid_filter = stk80xx_pid_filter,
2587 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2356 .frontend_attach = stk807x_frontend_attach, 2588 .frontend_attach = stk807x_frontend_attach,
2357 .tuner_attach = dib807x_tuner_attach, 2589 .tuner_attach = dib807x_tuner_attach,
2358 2590
@@ -2363,7 +2595,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2363 }, 2595 },
2364 }, 2596 },
2365 2597
2366 .num_device_descs = 2, 2598 .num_device_descs = 3,
2367 .devices = { 2599 .devices = {
2368 { "DiBcom STK807xP reference design", 2600 { "DiBcom STK807xP reference design",
2369 { &dib0700_usb_id_table[62], NULL }, 2601 { &dib0700_usb_id_table[62], NULL },
@@ -2373,6 +2605,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2373 { &dib0700_usb_id_table[63], NULL }, 2605 { &dib0700_usb_id_table[63], NULL },
2374 { NULL }, 2606 { NULL },
2375 }, 2607 },
2608 { "EvolutePC TVWay+",
2609 { &dib0700_usb_id_table[64], NULL },
2610 { NULL },
2611 },
2376 }, 2612 },
2377 2613
2378 .rc_interval = DEFAULT_RC_INTERVAL, 2614 .rc_interval = DEFAULT_RC_INTERVAL,
@@ -2384,6 +2620,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2384 .num_adapters = 2, 2620 .num_adapters = 2,
2385 .adapter = { 2621 .adapter = {
2386 { 2622 {
2623 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2624 .pid_filter_count = 32,
2625 .pid_filter = stk80xx_pid_filter,
2626 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2387 .frontend_attach = stk807xpvr_frontend_attach0, 2627 .frontend_attach = stk807xpvr_frontend_attach0,
2388 .tuner_attach = dib807x_tuner_attach, 2628 .tuner_attach = dib807x_tuner_attach,
2389 2629
@@ -2393,6 +2633,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2393 sizeof(struct dib0700_adapter_state), 2633 sizeof(struct dib0700_adapter_state),
2394 }, 2634 },
2395 { 2635 {
2636 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2637 .pid_filter_count = 32,
2638 .pid_filter = stk80xx_pid_filter,
2639 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2396 .frontend_attach = stk807xpvr_frontend_attach1, 2640 .frontend_attach = stk807xpvr_frontend_attach1,
2397 .tuner_attach = dib807x_tuner_attach, 2641 .tuner_attach = dib807x_tuner_attach,
2398 2642
@@ -2415,6 +2659,37 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2415 .rc_key_map = dib0700_rc_keys, 2659 .rc_key_map = dib0700_rc_keys,
2416 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys), 2660 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2417 .rc_query = dib0700_rc_query 2661 .rc_query = dib0700_rc_query
2662 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2663 .num_adapters = 1,
2664 .adapter = {
2665 {
2666 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
2667 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2668 .pid_filter_count = 32,
2669 .pid_filter = stk80xx_pid_filter,
2670 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2671 .frontend_attach = stk809x_frontend_attach,
2672 .tuner_attach = dib809x_tuner_attach,
2673
2674 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2675
2676 .size_of_priv =
2677 sizeof(struct dib0700_adapter_state),
2678 },
2679 },
2680
2681 .num_device_descs = 1,
2682 .devices = {
2683 { "DiBcom STK8096GP reference design",
2684 { &dib0700_usb_id_table[67], NULL },
2685 { NULL },
2686 },
2687 },
2688
2689 .rc_interval = DEFAULT_RC_INTERVAL,
2690 .rc_key_map = dib0700_rc_keys,
2691 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2692 .rc_query = dib0700_rc_query
2418 }, 2693 },
2419}; 2694};
2420 2695
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c
index da34979b5337..9143b5631e88 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-common.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-common.c
@@ -142,8 +142,13 @@ static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num
142 } else if ((msg[i].flags & I2C_M_RD) == 0) { 142 } else if ((msg[i].flags & I2C_M_RD) == 0) {
143 if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0) 143 if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0)
144 break; 144 break;
145 } else 145 } else if (msg[i].addr != 0x50) {
146 break; 146 /* 0x50 is the address of the eeprom - we need to protect it
147 * from dibusb's bad i2c implementation: reads without
148 * writing the offset before are forbidden */
149 if (dibusb_i2c_msg(d, msg[i].addr, NULL, 0, msg[i].buf, msg[i].len) < 0)
150 break;
151 }
147 } 152 }
148 153
149 mutex_unlock(&d->i2c_mutex); 154 mutex_unlock(&d->i2c_mutex);
@@ -243,6 +248,12 @@ static struct dib3000mc_config mod3000p_dib3000p_config = {
243 248
244int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap) 249int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
245{ 250{
251 if (adap->dev->udev->descriptor.idVendor == USB_VID_LITEON &&
252 adap->dev->udev->descriptor.idProduct ==
253 USB_PID_LITEON_DVB_T_WARM) {
254 msleep(1000);
255 }
256
246 if ((adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL || 257 if ((adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL ||
247 (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) { 258 (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) {
248 if (adap->priv != NULL) { 259 if (adap->priv != NULL) {
diff --git a/drivers/media/dvb/dvb-usb/dibusb-mb.c b/drivers/media/dvb/dvb-usb/dibusb-mb.c
index eeef50bff4f9..5c0126dc1ff9 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-mb.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-mb.c
@@ -242,7 +242,7 @@ static struct dvb_usb_device_properties dibusb1_1_properties = {
242 { &dibusb_dib3000mb_table[9], &dibusb_dib3000mb_table[11], NULL }, 242 { &dibusb_dib3000mb_table[9], &dibusb_dib3000mb_table[11], NULL },
243 { &dibusb_dib3000mb_table[10], &dibusb_dib3000mb_table[12], NULL }, 243 { &dibusb_dib3000mb_table[10], &dibusb_dib3000mb_table[12], NULL },
244 }, 244 },
245 { "Unkown USB1.1 DVB-T device ???? please report the name to the author", 245 { "Unknown USB1.1 DVB-T device ???? please report the name to the author",
246 { &dibusb_dib3000mb_table[13], NULL }, 246 { &dibusb_dib3000mb_table[13], NULL },
247 { &dibusb_dib3000mb_table[14], NULL }, 247 { &dibusb_dib3000mb_table[14], NULL },
248 }, 248 },
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
index 8a7d87bcd1d9..df1ec3e69f4a 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
@@ -88,6 +88,7 @@ int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
88 goto err; 88 goto err;
89 } 89 }
90 adap->dvb_adap.priv = adap; 90 adap->dvb_adap.priv = adap;
91 adap->dvb_adap.fe_ioctl_override = adap->props.fe_ioctl_override;
91 92
92 if (adap->dev->props.read_mac_address) { 93 if (adap->dev->props.read_mac_address) {
93 if (adap->dev->props.read_mac_address(adap->dev,adap->dvb_adap.proposed_mac) == 0) 94 if (adap->dev->props.read_mac_address(adap->dev,adap->dvb_adap.proposed_mac) == 0)
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index a548c14c1944..ae8b57acfe05 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -27,6 +27,7 @@
27#define USB_VID_DIBCOM 0x10b8 27#define USB_VID_DIBCOM 0x10b8
28#define USB_VID_DPOSH 0x1498 28#define USB_VID_DPOSH 0x1498
29#define USB_VID_DVICO 0x0fe9 29#define USB_VID_DVICO 0x0fe9
30#define USB_VID_E3C 0x18b4
30#define USB_VID_ELGATO 0x0fd9 31#define USB_VID_ELGATO 0x0fd9
31#define USB_VID_EMPIA 0xeb1a 32#define USB_VID_EMPIA 0xeb1a
32#define USB_VID_GENPIX 0x09c0 33#define USB_VID_GENPIX 0x09c0
@@ -46,6 +47,7 @@
46#define USB_VID_MSI_2 0x1462 47#define USB_VID_MSI_2 0x1462
47#define USB_VID_OPERA1 0x695c 48#define USB_VID_OPERA1 0x695c
48#define USB_VID_PINNACLE 0x2304 49#define USB_VID_PINNACLE 0x2304
50#define USB_VID_PCTV 0x2013
49#define USB_VID_PIXELVIEW 0x1554 51#define USB_VID_PIXELVIEW 0x1554
50#define USB_VID_TECHNOTREND 0x0b48 52#define USB_VID_TECHNOTREND 0x0b48
51#define USB_VID_TERRATEC 0x0ccd 53#define USB_VID_TERRATEC 0x0ccd
@@ -61,6 +63,9 @@
61#define USB_VID_XTENSIONS 0x1ae7 63#define USB_VID_XTENSIONS 0x1ae7
62#define USB_VID_HUMAX_COEX 0x10b9 64#define USB_VID_HUMAX_COEX 0x10b9
63#define USB_VID_774 0x7a69 65#define USB_VID_774 0x7a69
66#define USB_VID_EVOLUTEPC 0x1e59
67#define USB_VID_AZUREWAVE 0x13d3
68#define USB_VID_TECHNISAT 0x14f7
64 69
65/* Product IDs */ 70/* Product IDs */
66#define USB_PID_ADSTECH_USB2_COLD 0xa333 71#define USB_PID_ADSTECH_USB2_COLD 0xa333
@@ -99,10 +104,16 @@
99#define USB_PID_DIBCOM_STK7070PD 0x1ebe 104#define USB_PID_DIBCOM_STK7070PD 0x1ebe
100#define USB_PID_DIBCOM_STK807XP 0x1f90 105#define USB_PID_DIBCOM_STK807XP 0x1f90
101#define USB_PID_DIBCOM_STK807XPVR 0x1f98 106#define USB_PID_DIBCOM_STK807XPVR 0x1f98
107#define USB_PID_DIBCOM_STK8096GP 0x1fa0
102#define USB_PID_DIBCOM_ANCHOR_2135_COLD 0x2131 108#define USB_PID_DIBCOM_ANCHOR_2135_COLD 0x2131
103#define USB_PID_DIBCOM_STK7770P 0x1e80 109#define USB_PID_DIBCOM_STK7770P 0x1e80
104#define USB_PID_DPOSH_M9206_COLD 0x9206 110#define USB_PID_DPOSH_M9206_COLD 0x9206
105#define USB_PID_DPOSH_M9206_WARM 0xa090 111#define USB_PID_DPOSH_M9206_WARM 0xa090
112#define USB_PID_E3C_EC168 0x1689
113#define USB_PID_E3C_EC168_2 0xfffa
114#define USB_PID_E3C_EC168_3 0xfffb
115#define USB_PID_E3C_EC168_4 0x1001
116#define USB_PID_E3C_EC168_5 0x1002
106#define USB_PID_UNIWILL_STK7700P 0x6003 117#define USB_PID_UNIWILL_STK7700P 0x6003
107#define USB_PID_GENIUS_TVGO_DVB_T03 0x4012 118#define USB_PID_GENIUS_TVGO_DVB_T03 0x4012
108#define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 119#define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0
@@ -115,6 +126,7 @@
115#define USB_PID_KWORLD_395U_3 0xe395 126#define USB_PID_KWORLD_395U_3 0xe395
116#define USB_PID_KWORLD_MC810 0xc810 127#define USB_PID_KWORLD_MC810 0xc810
117#define USB_PID_KWORLD_PC160_2T 0xc160 128#define USB_PID_KWORLD_PC160_2T 0xc160
129#define USB_PID_KWORLD_PC160_T 0xc161
118#define USB_PID_KWORLD_VSTREAM_COLD 0x17de 130#define USB_PID_KWORLD_VSTREAM_COLD 0x17de
119#define USB_PID_KWORLD_VSTREAM_WARM 0x17df 131#define USB_PID_KWORLD_VSTREAM_WARM 0x17df
120#define USB_PID_TERRATEC_CINERGY_T_USB_XE 0x0055 132#define USB_PID_TERRATEC_CINERGY_T_USB_XE 0x0055
@@ -128,6 +140,7 @@
128#define USB_PID_TWINHAN_VP7021_COLD 0x3207 140#define USB_PID_TWINHAN_VP7021_COLD 0x3207
129#define USB_PID_TWINHAN_VP7021_WARM 0x3208 141#define USB_PID_TWINHAN_VP7021_WARM 0x3208
130#define USB_PID_TINYTWIN 0x3226 142#define USB_PID_TINYTWIN 0x3226
143#define USB_PID_TINYTWIN_2 0xe402
131#define USB_PID_DNTV_TINYUSB2_COLD 0x3223 144#define USB_PID_DNTV_TINYUSB2_COLD 0x3223
132#define USB_PID_DNTV_TINYUSB2_WARM 0x3224 145#define USB_PID_DNTV_TINYUSB2_WARM 0x3224
133#define USB_PID_ULTIMA_TVBOX_COLD 0x8105 146#define USB_PID_ULTIMA_TVBOX_COLD 0x8105
@@ -199,10 +212,12 @@
199#define USB_PID_PINNACLE_PCTV71E 0x022b 212#define USB_PID_PINNACLE_PCTV71E 0x022b
200#define USB_PID_PINNACLE_PCTV72E 0x0236 213#define USB_PID_PINNACLE_PCTV72E 0x0236
201#define USB_PID_PINNACLE_PCTV73E 0x0237 214#define USB_PID_PINNACLE_PCTV73E 0x0237
215#define USB_PID_PINNACLE_PCTV310E 0x3211
202#define USB_PID_PINNACLE_PCTV801E 0x023a 216#define USB_PID_PINNACLE_PCTV801E 0x023a
203#define USB_PID_PINNACLE_PCTV801E_SE 0x023b 217#define USB_PID_PINNACLE_PCTV801E_SE 0x023b
204#define USB_PID_PINNACLE_PCTV73A 0x0243 218#define USB_PID_PINNACLE_PCTV73A 0x0243
205#define USB_PID_PINNACLE_PCTV73ESE 0x0245 219#define USB_PID_PINNACLE_PCTV73ESE 0x0245
220#define USB_PID_PINNACLE_PCTV74E 0x0246
206#define USB_PID_PINNACLE_PCTV282E 0x0248 221#define USB_PID_PINNACLE_PCTV282E 0x0248
207#define USB_PID_PIXELVIEW_SBTVD 0x5010 222#define USB_PID_PIXELVIEW_SBTVD 0x5010
208#define USB_PID_PCTV_200E 0x020e 223#define USB_PID_PCTV_200E 0x020e
@@ -237,6 +252,7 @@
237#define USB_PID_DIGIVOX_MINI_SL_WARM 0xe361 252#define USB_PID_DIGIVOX_MINI_SL_WARM 0xe361
238#define USB_PID_GRANDTEC_DVBT_USB2_COLD 0x0bc6 253#define USB_PID_GRANDTEC_DVBT_USB2_COLD 0x0bc6
239#define USB_PID_GRANDTEC_DVBT_USB2_WARM 0x0bc7 254#define USB_PID_GRANDTEC_DVBT_USB2_WARM 0x0bc7
255#define USB_PID_WINFAST_DTV2000DS 0x6a04
240#define USB_PID_WINFAST_DTV_DONGLE_COLD 0x6025 256#define USB_PID_WINFAST_DTV_DONGLE_COLD 0x6025
241#define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026 257#define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026
242#define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00 258#define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00
@@ -271,10 +287,15 @@
271#define USB_PID_TELESTAR_STARSTICK_2 0x8000 287#define USB_PID_TELESTAR_STARSTICK_2 0x8000
272#define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807 288#define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807
273#define USB_PID_SONY_PLAYTV 0x0003 289#define USB_PID_SONY_PLAYTV 0x0003
290#define USB_PID_MYGICA_D689 0xd811
274#define USB_PID_ELGATO_EYETV_DTT 0x0021 291#define USB_PID_ELGATO_EYETV_DTT 0x0021
275#define USB_PID_ELGATO_EYETV_DTT_Dlx 0x0020 292#define USB_PID_ELGATO_EYETV_DTT_Dlx 0x0020
276#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_COLD 0x5000 293#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_COLD 0x5000
277#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_WARM 0x5001 294#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_WARM 0x5001
278#define USB_PID_FRIIO_WHITE 0x0001 295#define USB_PID_FRIIO_WHITE 0x0001
279 296#define USB_PID_TVWAY_PLUS 0x0002
297#define USB_PID_SVEON_STV20 0xe39d
298#define USB_PID_AZUREWAVE_AZ6027 0x3275
299#define USB_PID_TERRATEC_DVBS2CI 0x3275
300#define USB_PID_TECHNISAT_USB2_HDCI 0x0002
280#endif 301#endif
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-init.c b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
index e331db8c77b2..5d91f70d2d2d 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
@@ -243,7 +243,7 @@ int dvb_usb_device_init(struct usb_interface *intf,
243 d = kzalloc(sizeof(struct dvb_usb_device),GFP_KERNEL); 243 d = kzalloc(sizeof(struct dvb_usb_device),GFP_KERNEL);
244 if (d == NULL) { 244 if (d == NULL) {
245 err("no memory for 'struct dvb_usb_device'"); 245 err("no memory for 'struct dvb_usb_device'");
246 return ret; 246 return -ENOMEM;
247 } 247 }
248 248
249 d->udev = udev; 249 d->udev = udev;
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
index edde87c6aa3a..852fe89539cf 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
@@ -9,7 +9,7 @@
9#include <linux/usb/input.h> 9#include <linux/usb/input.h>
10 10
11static int dvb_usb_getkeycode(struct input_dev *dev, 11static int dvb_usb_getkeycode(struct input_dev *dev,
12 int scancode, int *keycode) 12 unsigned int scancode, unsigned int *keycode)
13{ 13{
14 struct dvb_usb_device *d = input_get_drvdata(dev); 14 struct dvb_usb_device *d = input_get_drvdata(dev);
15 15
@@ -39,7 +39,7 @@ static int dvb_usb_getkeycode(struct input_dev *dev,
39} 39}
40 40
41static int dvb_usb_setkeycode(struct input_dev *dev, 41static int dvb_usb_setkeycode(struct input_dev *dev,
42 int scancode, int keycode) 42 unsigned int scancode, unsigned int keycode)
43{ 43{
44 struct dvb_usb_device *d = input_get_drvdata(dev); 44 struct dvb_usb_device *d = input_get_drvdata(dev);
45 45
@@ -107,6 +107,7 @@ static void dvb_usb_read_remote_control(struct work_struct *work)
107 case REMOTE_KEY_REPEAT: 107 case REMOTE_KEY_REPEAT:
108 deb_rc("key repeated\n"); 108 deb_rc("key repeated\n");
109 input_event(d->rc_input_dev, EV_KEY, event, 1); 109 input_event(d->rc_input_dev, EV_KEY, event, 1);
110 input_sync(d->rc_input_dev);
110 input_event(d->rc_input_dev, EV_KEY, d->last_event, 0); 111 input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
111 input_sync(d->rc_input_dev); 112 input_sync(d->rc_input_dev);
112 break; 113 break;
@@ -259,7 +260,7 @@ int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d,
259 *state = REMOTE_KEY_REPEAT; 260 *state = REMOTE_KEY_REPEAT;
260 break; 261 break;
261 default: 262 default:
262 deb_err("unkown type of remote status: %d\n",keybuf[0]); 263 deb_err("unknown type of remote status: %d\n",keybuf[0]);
263 break; 264 break;
264 } 265 }
265 return 0; 266 return 0;
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h
index fe2b87efb3f1..0143aef19ecd 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb.h
@@ -162,6 +162,9 @@ struct dvb_usb_adapter_properties {
162 struct usb_data_stream_properties stream; 162 struct usb_data_stream_properties stream;
163 163
164 int size_of_priv; 164 int size_of_priv;
165
166 int (*fe_ioctl_override) (struct dvb_frontend *,
167 unsigned int, void *, unsigned int);
165}; 168};
166 169
167/** 170/**
diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c
index 5bb9479d154e..accc65509b07 100644
--- a/drivers/media/dvb/dvb-usb/dw2102.c
+++ b/drivers/media/dvb/dvb-usb/dw2102.c
@@ -1,6 +1,7 @@
1/* DVB USB framework compliant Linux driver for the 1/* DVB USB framework compliant Linux driver for the
2* DVBWorld DVB-S 2101, 2102, DVB-S2 2104, DVB-C 3101, 2* DVBWorld DVB-S 2101, 2102, DVB-S2 2104, DVB-C 3101,
3* TeVii S600, S630, S650 Cards 3* TeVii S600, S630, S650,
4* Prof 1100, 7500 Cards
4* Copyright (C) 2008,2009 Igor M. Liplianin (liplianin@me.by) 5* Copyright (C) 2008,2009 Igor M. Liplianin (liplianin@me.by)
5* 6*
6* This program is free software; you can redistribute it and/or modify it 7* This program is free software; you can redistribute it and/or modify it
@@ -20,6 +21,11 @@
20#include "tda1002x.h" 21#include "tda1002x.h"
21#include "mt312.h" 22#include "mt312.h"
22#include "zl10039.h" 23#include "zl10039.h"
24#include "ds3000.h"
25#include "stv0900.h"
26#include "stv6110.h"
27#include "stb6100.h"
28#include "stb6100_proc.h"
23 29
24#ifndef USB_PID_DW2102 30#ifndef USB_PID_DW2102
25#define USB_PID_DW2102 0x2102 31#define USB_PID_DW2102 0x2102
@@ -37,12 +43,20 @@
37#define USB_PID_CINERGY_S 0x0064 43#define USB_PID_CINERGY_S 0x0064
38#endif 44#endif
39 45
46#ifndef USB_PID_TEVII_S630
47#define USB_PID_TEVII_S630 0xd630
48#endif
49
40#ifndef USB_PID_TEVII_S650 50#ifndef USB_PID_TEVII_S650
41#define USB_PID_TEVII_S650 0xd650 51#define USB_PID_TEVII_S650 0xd650
42#endif 52#endif
43 53
44#ifndef USB_PID_TEVII_S630 54#ifndef USB_PID_TEVII_S660
45#define USB_PID_TEVII_S630 0xd630 55#define USB_PID_TEVII_S660 0xd660
56#endif
57
58#ifndef USB_PID_PROF_1100
59#define USB_PID_PROF_1100 0xb012
46#endif 60#endif
47 61
48#define DW210X_READ_MSG 0 62#define DW210X_READ_MSG 0
@@ -55,6 +69,10 @@
55#define DW2102_VOLTAGE_CTRL (0x1800) 69#define DW2102_VOLTAGE_CTRL (0x1800)
56#define DW2102_RC_QUERY (0x1a00) 70#define DW2102_RC_QUERY (0x1a00)
57 71
72#define err_str "did not find the firmware file. (%s) " \
73 "Please see linux/Documentation/dvb/ for more details " \
74 "on firmware-problems."
75
58struct dvb_usb_rc_keys_table { 76struct dvb_usb_rc_keys_table {
59 struct dvb_usb_rc_key *rc_keys; 77 struct dvb_usb_rc_key *rc_keys;
60 int rc_keys_size; 78 int rc_keys_size;
@@ -71,6 +89,12 @@ static int ir_keymap;
71module_param_named(keymap, ir_keymap, int, 0644); 89module_param_named(keymap, ir_keymap, int, 0644);
72MODULE_PARM_DESC(keymap, "set keymap 0=default 1=dvbworld 2=tevii 3=tbs ..."); 90MODULE_PARM_DESC(keymap, "set keymap 0=default 1=dvbworld 2=tevii 3=tbs ...");
73 91
92/* demod probe */
93static int demod_probe = 1;
94module_param_named(demod, demod_probe, int, 0644);
95MODULE_PARM_DESC(demod, "demod to probe (1=cx24116 2=stv0903+stv6110 "
96 "4=stv0903+stb6100(or-able)).");
97
74DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 98DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
75 99
76static int dw210x_op_rw(struct usb_device *dev, u8 request, u16 value, 100static int dw210x_op_rw(struct usb_device *dev, u8 request, u16 value,
@@ -183,7 +207,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap,
183 switch (num) { 207 switch (num) {
184 case 2: 208 case 2:
185 /* read si2109 register by number */ 209 /* read si2109 register by number */
186 buf6[0] = 0xd0; 210 buf6[0] = msg[0].addr << 1;
187 buf6[1] = msg[0].len; 211 buf6[1] = msg[0].len;
188 buf6[2] = msg[0].buf[0]; 212 buf6[2] = msg[0].buf[0];
189 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, 213 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
@@ -198,7 +222,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap,
198 switch (msg[0].addr) { 222 switch (msg[0].addr) {
199 case 0x68: 223 case 0x68:
200 /* write to si2109 register */ 224 /* write to si2109 register */
201 buf6[0] = 0xd0; 225 buf6[0] = msg[0].addr << 1;
202 buf6[1] = msg[0].len; 226 buf6[1] = msg[0].len;
203 memcpy(buf6 + 2, msg[0].buf, msg[0].len); 227 memcpy(buf6 + 2, msg[0].buf, msg[0].len);
204 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, buf6, 228 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, buf6,
@@ -239,7 +263,7 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
239 /* read */ 263 /* read */
240 /* first write first register number */ 264 /* first write first register number */
241 u8 ibuf[msg[1].len + 2], obuf[3]; 265 u8 ibuf[msg[1].len + 2], obuf[3];
242 obuf[0] = 0xd0; 266 obuf[0] = msg[0].addr << 1;
243 obuf[1] = msg[0].len; 267 obuf[1] = msg[0].len;
244 obuf[2] = msg[0].buf[0]; 268 obuf[2] = msg[0].buf[0];
245 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, 269 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
@@ -256,7 +280,7 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
256 case 0x68: { 280 case 0x68: {
257 /* write to register */ 281 /* write to register */
258 u8 obuf[msg[0].len + 2]; 282 u8 obuf[msg[0].len + 2];
259 obuf[0] = 0xd0; 283 obuf[0] = msg[0].addr << 1;
260 obuf[1] = msg[0].len; 284 obuf[1] = msg[0].len;
261 memcpy(obuf + 2, msg[0].buf, msg[0].len); 285 memcpy(obuf + 2, msg[0].buf, msg[0].len);
262 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, 286 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
@@ -266,7 +290,7 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
266 case 0x61: { 290 case 0x61: {
267 /* write to tuner */ 291 /* write to tuner */
268 u8 obuf[msg[0].len + 2]; 292 u8 obuf[msg[0].len + 2];
269 obuf[0] = 0xc2; 293 obuf[0] = msg[0].addr << 1;
270 obuf[1] = msg[0].len; 294 obuf[1] = msg[0].len;
271 memcpy(obuf + 2, msg[0].buf, msg[0].len); 295 memcpy(obuf + 2, msg[0].buf, msg[0].len);
272 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, 296 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
@@ -301,78 +325,78 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i
301{ 325{
302 struct dvb_usb_device *d = i2c_get_adapdata(adap); 326 struct dvb_usb_device *d = i2c_get_adapdata(adap);
303 int ret = 0; 327 int ret = 0;
304 int len, i; 328 int len, i, j;
305 329
306 if (!d) 330 if (!d)
307 return -ENODEV; 331 return -ENODEV;
308 if (mutex_lock_interruptible(&d->i2c_mutex) < 0) 332 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
309 return -EAGAIN; 333 return -EAGAIN;
310 334
311 switch (num) { 335 for (j = 0; j < num; j++) {
312 case 2: { 336 switch (msg[j].addr) {
313 /* read */
314 /* first write first register number */
315 u8 ibuf[msg[1].len + 2], obuf[3];
316 obuf[0] = 0xaa;
317 obuf[1] = msg[0].len;
318 obuf[2] = msg[0].buf[0];
319 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
320 obuf, msg[0].len + 2, DW210X_WRITE_MSG);
321 /* second read registers */
322 ret = dw210x_op_rw(d->udev, 0xc3, 0xab , 0,
323 ibuf, msg[1].len + 2, DW210X_READ_MSG);
324 memcpy(msg[1].buf, ibuf + 2, msg[1].len);
325
326 break;
327 }
328 case 1:
329 switch (msg[0].addr) {
330 case 0x55: {
331 if (msg[0].buf[0] == 0xf7) {
332 /* firmware */
333 /* Write in small blocks */
334 u8 obuf[19];
335 obuf[0] = 0xaa;
336 obuf[1] = 0x11;
337 obuf[2] = 0xf7;
338 len = msg[0].len - 1;
339 i = 1;
340 do {
341 memcpy(obuf + 3, msg[0].buf + i, (len > 16 ? 16 : len));
342 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
343 obuf, (len > 16 ? 16 : len) + 3, DW210X_WRITE_MSG);
344 i += 16;
345 len -= 16;
346 } while (len > 0);
347 } else {
348 /* write to register */
349 u8 obuf[msg[0].len + 2];
350 obuf[0] = 0xaa;
351 obuf[1] = msg[0].len;
352 memcpy(obuf + 2, msg[0].buf, msg[0].len);
353 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
354 obuf, msg[0].len + 2, DW210X_WRITE_MSG);
355 }
356 break;
357 }
358 case(DW2102_RC_QUERY): { 337 case(DW2102_RC_QUERY): {
359 u8 ibuf[2]; 338 u8 ibuf[2];
360 ret = dw210x_op_rw(d->udev, 0xb8, 0, 0, 339 ret = dw210x_op_rw(d->udev, 0xb8, 0, 0,
361 ibuf, 2, DW210X_READ_MSG); 340 ibuf, 2, DW210X_READ_MSG);
362 memcpy(msg[0].buf, ibuf , 2); 341 memcpy(msg[j].buf, ibuf , 2);
363 break; 342 break;
364 } 343 }
365 case(DW2102_VOLTAGE_CTRL): { 344 case(DW2102_VOLTAGE_CTRL): {
366 u8 obuf[2]; 345 u8 obuf[2];
367 obuf[0] = 0x30; 346 obuf[0] = 0x30;
368 obuf[1] = msg[0].buf[0]; 347 obuf[1] = msg[j].buf[0];
369 ret = dw210x_op_rw(d->udev, 0xb2, 0, 0, 348 ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
370 obuf, 2, DW210X_WRITE_MSG); 349 obuf, 2, DW210X_WRITE_MSG);
371 break; 350 break;
372 } 351 }
352 /*case 0x55: cx24116
353 case 0x6a: stv0903
354 case 0x68: ds3000, stv0903
355 case 0x60: ts2020, stv6110, stb6100 */
356 default: {
357 if (msg[j].flags == I2C_M_RD) {
358 /* read registers */
359 u8 ibuf[msg[j].len + 2];
360 ret = dw210x_op_rw(d->udev, 0xc3,
361 (msg[j].addr << 1) + 1, 0,
362 ibuf, msg[j].len + 2,
363 DW210X_READ_MSG);
364 memcpy(msg[j].buf, ibuf + 2, msg[j].len);
365 mdelay(10);
366 } else if (((msg[j].buf[0] == 0xb0) &&
367 (msg[j].addr == 0x68)) ||
368 ((msg[j].buf[0] == 0xf7) &&
369 (msg[j].addr == 0x55))) {
370 /* write firmware */
371 u8 obuf[19];
372 obuf[0] = msg[j].addr << 1;
373 obuf[1] = (msg[j].len > 15 ? 17 : msg[j].len);
374 obuf[2] = msg[j].buf[0];
375 len = msg[j].len - 1;
376 i = 1;
377 do {
378 memcpy(obuf + 3, msg[j].buf + i,
379 (len > 16 ? 16 : len));
380 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
381 obuf, (len > 16 ? 16 : len) + 3,
382 DW210X_WRITE_MSG);
383 i += 16;
384 len -= 16;
385 } while (len > 0);
386 } else {
387 /* write registers */
388 u8 obuf[msg[j].len + 2];
389 obuf[0] = msg[j].addr << 1;
390 obuf[1] = msg[j].len;
391 memcpy(obuf + 2, msg[j].buf, msg[j].len);
392 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
393 obuf, msg[j].len + 2,
394 DW210X_WRITE_MSG);
395 }
396 break;
397 }
373 } 398 }
374 399
375 break;
376 } 400 }
377 401
378 mutex_unlock(&d->i2c_mutex); 402 mutex_unlock(&d->i2c_mutex);
@@ -442,63 +466,103 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
442 return num; 466 return num;
443} 467}
444 468
445static int s630_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], 469static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
446 int num) 470 int num)
447{ 471{
448 struct dvb_usb_device *d = i2c_get_adapdata(adap); 472 struct dvb_usb_device *d = i2c_get_adapdata(adap);
473 struct usb_device *udev;
449 int ret = 0; 474 int ret = 0;
475 int len, i, j;
450 476
451 if (!d) 477 if (!d)
452 return -ENODEV; 478 return -ENODEV;
479 udev = d->udev;
453 if (mutex_lock_interruptible(&d->i2c_mutex) < 0) 480 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
454 return -EAGAIN; 481 return -EAGAIN;
455 482
456 switch (num) { 483 for (j = 0; j < num; j++) {
457 case 2: { /* read */ 484 switch (msg[j].addr) {
458 u8 ibuf[msg[1].len], obuf[3];
459 obuf[0] = msg[1].len;
460 obuf[1] = (msg[0].addr << 1);
461 obuf[2] = msg[0].buf[0];
462
463 ret = dw210x_op_rw(d->udev, 0x90, 0, 0,
464 obuf, 3, DW210X_WRITE_MSG);
465 msleep(5);
466 ret = dw210x_op_rw(d->udev, 0x91, 0, 0,
467 ibuf, msg[1].len, DW210X_READ_MSG);
468 memcpy(msg[1].buf, ibuf, msg[1].len);
469 break;
470 }
471 case 1:
472 switch (msg[0].addr) {
473 case 0x60:
474 case 0x0e: {
475 /* write to zl10313, zl10039 register, */
476 u8 obuf[msg[0].len + 2];
477 obuf[0] = msg[0].len + 1;
478 obuf[1] = (msg[0].addr << 1);
479 memcpy(obuf + 2, msg[0].buf, msg[0].len);
480 ret = dw210x_op_rw(d->udev, 0x80, 0, 0,
481 obuf, msg[0].len + 2, DW210X_WRITE_MSG);
482 break;
483 }
484 case (DW2102_RC_QUERY): { 485 case (DW2102_RC_QUERY): {
485 u8 ibuf[4]; 486 u8 ibuf[4];
486 ret = dw210x_op_rw(d->udev, 0xb8, 0, 0, 487 ret = dw210x_op_rw(d->udev, 0xb8, 0, 0,
487 ibuf, 4, DW210X_READ_MSG); 488 ibuf, 4, DW210X_READ_MSG);
488 msg[0].buf[0] = ibuf[3]; 489 memcpy(msg[j].buf, ibuf + 1, 2);
489 break; 490 break;
490 } 491 }
491 case (DW2102_VOLTAGE_CTRL): { 492 case (DW2102_VOLTAGE_CTRL): {
492 u8 obuf[2]; 493 u8 obuf[2];
493 obuf[0] = 0x03; 494
494 obuf[1] = msg[0].buf[0]; 495 obuf[0] = 1;
496 obuf[1] = msg[j].buf[1];/* off-on */
497 ret = dw210x_op_rw(d->udev, 0x8a, 0, 0,
498 obuf, 2, DW210X_WRITE_MSG);
499 obuf[0] = 3;
500 obuf[1] = msg[j].buf[0];/* 13v-18v */
495 ret = dw210x_op_rw(d->udev, 0x8a, 0, 0, 501 ret = dw210x_op_rw(d->udev, 0x8a, 0, 0,
496 obuf, 2, DW210X_WRITE_MSG); 502 obuf, 2, DW210X_WRITE_MSG);
497 break; 503 break;
498 } 504 }
505 /*case 0x55: cx24116
506 case 0x6a: stv0903
507 case 0x68: ds3000, stv0903
508 case 0x60: ts2020, stv6110, stb6100
509 case 0xa0: eeprom */
510 default: {
511 if (msg[j].flags == I2C_M_RD) {
512 /* read registers */
513 u8 ibuf[msg[j].len];
514 ret = dw210x_op_rw(d->udev, 0x91, 0, 0,
515 ibuf, msg[j].len,
516 DW210X_READ_MSG);
517 memcpy(msg[j].buf, ibuf, msg[j].len);
518 break;
519 } else if ((msg[j].buf[0] == 0xb0) &&
520 (msg[j].addr == 0x68)) {
521 /* write firmware */
522 u8 obuf[19];
523 obuf[0] = (msg[j].len > 16 ?
524 18 : msg[j].len + 1);
525 obuf[1] = msg[j].addr << 1;
526 obuf[2] = msg[j].buf[0];
527 len = msg[j].len - 1;
528 i = 1;
529 do {
530 memcpy(obuf + 3, msg[j].buf + i,
531 (len > 16 ? 16 : len));
532 ret = dw210x_op_rw(d->udev, 0x80, 0, 0,
533 obuf, (len > 16 ? 16 : len) + 3,
534 DW210X_WRITE_MSG);
535 i += 16;
536 len -= 16;
537 } while (len > 0);
538 } else if ((udev->descriptor.idProduct == 0x7500)
539 && (j < (num - 1))) {
540 /* write register addr before read */
541 u8 obuf[msg[j].len + 2];
542 obuf[0] = msg[j + 1].len;
543 obuf[1] = (msg[j].addr << 1);
544 memcpy(obuf + 2, msg[j].buf, msg[j].len);
545 ret = dw210x_op_rw(d->udev, 0x92, 0, 0,
546 obuf, msg[j].len + 2,
547 DW210X_WRITE_MSG);
548 break;
549 } else {
550 /* write registers */
551 u8 obuf[msg[j].len + 2];
552 obuf[0] = msg[j].len + 1;
553 obuf[1] = (msg[j].addr << 1);
554 memcpy(obuf + 2, msg[j].buf, msg[j].len);
555 ret = dw210x_op_rw(d->udev,
556 (num > 1 ? 0x90 : 0x80), 0, 0,
557 obuf, msg[j].len + 2,
558 DW210X_WRITE_MSG);
559 break;
560 }
561 break;
562 }
499 } 563 }
500 564
501 break; 565 msleep(3);
502 } 566 }
503 567
504 mutex_unlock(&d->i2c_mutex); 568 mutex_unlock(&d->i2c_mutex);
@@ -535,8 +599,8 @@ static struct i2c_algorithm dw3101_i2c_algo = {
535 .functionality = dw210x_i2c_func, 599 .functionality = dw210x_i2c_func,
536}; 600};
537 601
538static struct i2c_algorithm s630_i2c_algo = { 602static struct i2c_algorithm s6x0_i2c_algo = {
539 .master_xfer = s630_i2c_transfer, 603 .master_xfer = s6x0_i2c_transfer,
540 .functionality = dw210x_i2c_func, 604 .functionality = dw210x_i2c_func,
541}; 605};
542 606
@@ -564,25 +628,34 @@ static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
564 return 0; 628 return 0;
565}; 629};
566 630
567static int s630_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) 631static int s6x0_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
568{ 632{
569 int i, ret; 633 int i, ret;
570 u8 buf[3], eeprom[256], eepromline[16]; 634 u8 ibuf[] = { 0 }, obuf[] = { 0 };
635 u8 eeprom[256], eepromline[16];
636 struct i2c_msg msg[] = {
637 {
638 .addr = 0xa0 >> 1,
639 .flags = 0,
640 .buf = obuf,
641 .len = 1,
642 }, {
643 .addr = 0xa0 >> 1,
644 .flags = I2C_M_RD,
645 .buf = ibuf,
646 .len = 1,
647 }
648 };
571 649
572 for (i = 0; i < 256; i++) { 650 for (i = 0; i < 256; i++) {
573 buf[0] = 1; 651 obuf[0] = i;
574 buf[1] = 0xa0; 652 ret = s6x0_i2c_transfer(&d->i2c_adap, msg, 2);
575 buf[2] = i; 653 if (ret != 2) {
576 ret = dw210x_op_rw(d->udev, 0x90, 0, 0,
577 buf, 3, DW210X_WRITE_MSG);
578 ret = dw210x_op_rw(d->udev, 0x91, 0, 0,
579 buf, 1, DW210X_READ_MSG);
580 if (ret < 0) {
581 err("read eeprom failed."); 654 err("read eeprom failed.");
582 return -1; 655 return -1;
583 } else { 656 } else {
584 eepromline[i % 16] = buf[0]; 657 eepromline[i % 16] = ibuf[0];
585 eeprom[i] = buf[0]; 658 eeprom[i] = ibuf[0];
586 } 659 }
587 660
588 if ((i % 16) == 15) { 661 if ((i % 16) == 15) {
@@ -597,18 +670,25 @@ static int s630_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
597 670
598static int dw210x_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 671static int dw210x_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
599{ 672{
600 static u8 command_13v[1] = {0x00}; 673 static u8 command_13v[] = {0x00, 0x01};
601 static u8 command_18v[1] = {0x01}; 674 static u8 command_18v[] = {0x01, 0x01};
602 struct i2c_msg msg[] = { 675 static u8 command_off[] = {0x00, 0x00};
603 {.addr = DW2102_VOLTAGE_CTRL, .flags = 0, 676 struct i2c_msg msg = {
604 .buf = command_13v, .len = 1}, 677 .addr = DW2102_VOLTAGE_CTRL,
678 .flags = 0,
679 .buf = command_off,
680 .len = 2,
605 }; 681 };
606 682
607 struct dvb_usb_adapter *udev_adap = 683 struct dvb_usb_adapter *udev_adap =
608 (struct dvb_usb_adapter *)(fe->dvb->priv); 684 (struct dvb_usb_adapter *)(fe->dvb->priv);
609 if (voltage == SEC_VOLTAGE_18) 685 if (voltage == SEC_VOLTAGE_18)
610 msg[0].buf = command_18v; 686 msg.buf = command_18v;
611 i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1); 687 else if (voltage == SEC_VOLTAGE_13)
688 msg.buf = command_13v;
689
690 i2c_transfer(&udev_adap->dev->i2c_adap, &msg, 1);
691
612 return 0; 692 return 0;
613} 693}
614 694
@@ -644,19 +724,116 @@ static struct mt312_config zl313_config = {
644 .demod_address = 0x0e, 724 .demod_address = 0x0e,
645}; 725};
646 726
727static struct ds3000_config dw2104_ds3000_config = {
728 .demod_address = 0x68,
729};
730
731static struct stv0900_config dw2104a_stv0900_config = {
732 .demod_address = 0x6a,
733 .demod_mode = 0,
734 .xtal = 27000000,
735 .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
736 .diseqc_mode = 2,/* 2/3 PWM */
737 .tun1_maddress = 0,/* 0x60 */
738 .tun1_adc = 0,/* 2 Vpp */
739 .path1_mode = 3,
740};
741
742static struct stb6100_config dw2104a_stb6100_config = {
743 .tuner_address = 0x60,
744 .refclock = 27000000,
745};
746
747static struct stv0900_config dw2104_stv0900_config = {
748 .demod_address = 0x68,
749 .demod_mode = 0,
750 .xtal = 8000000,
751 .clkmode = 3,
752 .diseqc_mode = 2,
753 .tun1_maddress = 0,
754 .tun1_adc = 1,/* 1 Vpp */
755 .path1_mode = 3,
756};
757
758static struct stv6110_config dw2104_stv6110_config = {
759 .i2c_address = 0x60,
760 .mclk = 16000000,
761 .clk_div = 1,
762};
763
764static struct stv0900_config prof_7500_stv0900_config = {
765 .demod_address = 0x6a,
766 .demod_mode = 0,
767 .xtal = 27000000,
768 .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
769 .diseqc_mode = 2,/* 2/3 PWM */
770 .tun1_maddress = 0,/* 0x60 */
771 .tun1_adc = 0,/* 2 Vpp */
772 .path1_mode = 3,
773 .tun1_type = 3,
774};
775
647static int dw2104_frontend_attach(struct dvb_usb_adapter *d) 776static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
648{ 777{
649 if ((d->fe = dvb_attach(cx24116_attach, &dw2104_config, 778 struct dvb_tuner_ops *tuner_ops = NULL;
650 &d->dev->i2c_adap)) != NULL) { 779
780 if (demod_probe & 4) {
781 d->fe = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
782 &d->dev->i2c_adap, 0);
783 if (d->fe != NULL) {
784 if (dvb_attach(stb6100_attach, d->fe,
785 &dw2104a_stb6100_config,
786 &d->dev->i2c_adap)) {
787 tuner_ops = &d->fe->ops.tuner_ops;
788 tuner_ops->set_frequency = stb6100_set_freq;
789 tuner_ops->get_frequency = stb6100_get_freq;
790 tuner_ops->set_bandwidth = stb6100_set_bandw;
791 tuner_ops->get_bandwidth = stb6100_get_bandw;
792 d->fe->ops.set_voltage = dw210x_set_voltage;
793 info("Attached STV0900+STB6100!\n");
794 return 0;
795 }
796 }
797 }
798
799 if (demod_probe & 2) {
800 d->fe = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
801 &d->dev->i2c_adap, 0);
802 if (d->fe != NULL) {
803 if (dvb_attach(stv6110_attach, d->fe,
804 &dw2104_stv6110_config,
805 &d->dev->i2c_adap)) {
806 d->fe->ops.set_voltage = dw210x_set_voltage;
807 info("Attached STV0900+STV6110A!\n");
808 return 0;
809 }
810 }
811 }
812
813 if (demod_probe & 1) {
814 d->fe = dvb_attach(cx24116_attach, &dw2104_config,
815 &d->dev->i2c_adap);
816 if (d->fe != NULL) {
817 d->fe->ops.set_voltage = dw210x_set_voltage;
818 info("Attached cx24116!\n");
819 return 0;
820 }
821 }
822
823 d->fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
824 &d->dev->i2c_adap);
825 if (d->fe != NULL) {
651 d->fe->ops.set_voltage = dw210x_set_voltage; 826 d->fe->ops.set_voltage = dw210x_set_voltage;
652 info("Attached cx24116!\n"); 827 info("Attached DS3000!\n");
653 return 0; 828 return 0;
654 } 829 }
830
655 return -EIO; 831 return -EIO;
656} 832}
657 833
658static struct dvb_usb_device_properties dw2102_properties; 834static struct dvb_usb_device_properties dw2102_properties;
659static struct dvb_usb_device_properties dw2104_properties; 835static struct dvb_usb_device_properties dw2104_properties;
836static struct dvb_usb_device_properties s6x0_properties;
660 837
661static int dw2102_frontend_attach(struct dvb_usb_adapter *d) 838static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
662{ 839{
@@ -670,14 +847,17 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
670 return 0; 847 return 0;
671 } 848 }
672 } 849 }
850
673 if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) { 851 if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) {
674 /*dw2102_properties.adapter->tuner_attach = dw2102_tuner_attach;*/
675 d->fe = dvb_attach(stv0288_attach, &earda_config, 852 d->fe = dvb_attach(stv0288_attach, &earda_config,
676 &d->dev->i2c_adap); 853 &d->dev->i2c_adap);
677 if (d->fe != NULL) { 854 if (d->fe != NULL) {
678 d->fe->ops.set_voltage = dw210x_set_voltage; 855 if (dvb_attach(stb6000_attach, d->fe, 0x61,
679 info("Attached stv0288!\n"); 856 &d->dev->i2c_adap)) {
680 return 0; 857 d->fe->ops.set_voltage = dw210x_set_voltage;
858 info("Attached stv0288!\n");
859 return 0;
860 }
681 } 861 }
682 } 862 }
683 863
@@ -705,45 +885,65 @@ static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
705 return -EIO; 885 return -EIO;
706} 886}
707 887
708static int s630_frontend_attach(struct dvb_usb_adapter *d) 888static int s6x0_frontend_attach(struct dvb_usb_adapter *d)
709{ 889{
710 d->fe = dvb_attach(mt312_attach, &zl313_config, 890 d->fe = dvb_attach(mt312_attach, &zl313_config,
711 &d->dev->i2c_adap); 891 &d->dev->i2c_adap);
892 if (d->fe != NULL) {
893 if (dvb_attach(zl10039_attach, d->fe, 0x60,
894 &d->dev->i2c_adap)) {
895 d->fe->ops.set_voltage = dw210x_set_voltage;
896 info("Attached zl100313+zl10039!\n");
897 return 0;
898 }
899 }
900
901 d->fe = dvb_attach(stv0288_attach, &earda_config,
902 &d->dev->i2c_adap);
903 if (d->fe != NULL) {
904 if (dvb_attach(stb6000_attach, d->fe, 0x61,
905 &d->dev->i2c_adap)) {
906 d->fe->ops.set_voltage = dw210x_set_voltage;
907 info("Attached stv0288+stb6000!\n");
908 return 0;
909 }
910 }
911
912 d->fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
913 &d->dev->i2c_adap);
712 if (d->fe != NULL) { 914 if (d->fe != NULL) {
713 d->fe->ops.set_voltage = dw210x_set_voltage; 915 d->fe->ops.set_voltage = dw210x_set_voltage;
714 info("Attached zl10313!\n"); 916 info("Attached ds3000+ds2020!\n");
715 return 0; 917 return 0;
716 } 918 }
919
717 return -EIO; 920 return -EIO;
718} 921}
719 922
720static int dw2102_tuner_attach(struct dvb_usb_adapter *adap) 923static int prof_7500_frontend_attach(struct dvb_usb_adapter *d)
721{ 924{
722 dvb_attach(dvb_pll_attach, adap->fe, 0x60, 925 d->fe = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
723 &adap->dev->i2c_adap, DVB_PLL_OPERA1); 926 &d->dev->i2c_adap, 0);
724 return 0; 927 if (d->fe == NULL)
725} 928 return -EIO;
929 d->fe->ops.set_voltage = dw210x_set_voltage;
726 930
727static int dw2102_earda_tuner_attach(struct dvb_usb_adapter *adap) 931 info("Attached STV0900+STB6100A!\n");
728{
729 dvb_attach(stb6000_attach, adap->fe, 0x61,
730 &adap->dev->i2c_adap);
731 932
732 return 0; 933 return 0;
733} 934}
734 935
735static int dw3101_tuner_attach(struct dvb_usb_adapter *adap) 936static int dw2102_tuner_attach(struct dvb_usb_adapter *adap)
736{ 937{
737 dvb_attach(dvb_pll_attach, adap->fe, 0x60, 938 dvb_attach(dvb_pll_attach, adap->fe, 0x60,
738 &adap->dev->i2c_adap, DVB_PLL_TUA6034); 939 &adap->dev->i2c_adap, DVB_PLL_OPERA1);
739
740 return 0; 940 return 0;
741} 941}
742 942
743static int s630_zl10039_tuner_attach(struct dvb_usb_adapter *adap) 943static int dw3101_tuner_attach(struct dvb_usb_adapter *adap)
744{ 944{
745 dvb_attach(zl10039_attach, adap->fe, 0x60, 945 dvb_attach(dvb_pll_attach, adap->fe, 0x60,
746 &adap->dev->i2c_adap); 946 &adap->dev->i2c_adap, DVB_PLL_TUA6034);
747 947
748 return 0; 948 return 0;
749} 949}
@@ -922,6 +1122,9 @@ static struct usb_device_id dw2102_table[] = {
922 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)}, 1122 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)},
923 {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW3101)}, 1123 {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW3101)},
924 {USB_DEVICE(0x9022, USB_PID_TEVII_S630)}, 1124 {USB_DEVICE(0x9022, USB_PID_TEVII_S630)},
1125 {USB_DEVICE(0x3011, USB_PID_PROF_1100)},
1126 {USB_DEVICE(0x9022, USB_PID_TEVII_S660)},
1127 {USB_DEVICE(0x3034, 0x7500)},
925 { } 1128 { }
926}; 1129};
927 1130
@@ -935,15 +1138,13 @@ static int dw2102_load_firmware(struct usb_device *dev,
935 u8 reset; 1138 u8 reset;
936 u8 reset16[] = {0, 0, 0, 0, 0, 0, 0}; 1139 u8 reset16[] = {0, 0, 0, 0, 0, 0, 0};
937 const struct firmware *fw; 1140 const struct firmware *fw;
938 const char *filename = "dvb-usb-dw2101.fw"; 1141 const char *fw_2101 = "dvb-usb-dw2101.fw";
939 1142
940 switch (dev->descriptor.idProduct) { 1143 switch (dev->descriptor.idProduct) {
941 case 0x2101: 1144 case 0x2101:
942 ret = request_firmware(&fw, filename, &dev->dev); 1145 ret = request_firmware(&fw, fw_2101, &dev->dev);
943 if (ret != 0) { 1146 if (ret != 0) {
944 err("did not find the firmware file. (%s) " 1147 err(err_str, fw_2101);
945 "Please see linux/Documentation/dvb/ for more details "
946 "on firmware-problems.", filename);
947 return ret; 1148 return ret;
948 } 1149 }
949 break; 1150 break;
@@ -983,6 +1184,11 @@ static int dw2102_load_firmware(struct usb_device *dev,
983 } 1184 }
984 /* init registers */ 1185 /* init registers */
985 switch (dev->descriptor.idProduct) { 1186 switch (dev->descriptor.idProduct) {
1187 case USB_PID_PROF_1100:
1188 s6x0_properties.rc_key_map = tbs_rc_keys;
1189 s6x0_properties.rc_key_map_size =
1190 ARRAY_SIZE(tbs_rc_keys);
1191 break;
986 case USB_PID_TEVII_S650: 1192 case USB_PID_TEVII_S650:
987 dw2104_properties.rc_key_map = tevii_rc_keys; 1193 dw2104_properties.rc_key_map = tevii_rc_keys;
988 dw2104_properties.rc_key_map_size = 1194 dw2104_properties.rc_key_map_size =
@@ -1021,7 +1227,6 @@ static int dw2102_load_firmware(struct usb_device *dev,
1021 DW210X_READ_MSG); 1227 DW210X_READ_MSG);
1022 if (reset16[2] == 0x11) { 1228 if (reset16[2] == 0x11) {
1023 dw2102_properties.i2c_algo = &dw2102_earda_i2c_algo; 1229 dw2102_properties.i2c_algo = &dw2102_earda_i2c_algo;
1024 dw2102_properties.adapter->tuner_attach = &dw2102_earda_tuner_attach;
1025 break; 1230 break;
1026 } 1231 }
1027 } 1232 }
@@ -1184,13 +1389,13 @@ static struct dvb_usb_device_properties dw3101_properties = {
1184 } 1389 }
1185}; 1390};
1186 1391
1187static struct dvb_usb_device_properties s630_properties = { 1392static struct dvb_usb_device_properties s6x0_properties = {
1188 .caps = DVB_USB_IS_AN_I2C_ADAPTER, 1393 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1189 .usb_ctrl = DEVICE_SPECIFIC, 1394 .usb_ctrl = DEVICE_SPECIFIC,
1190 .firmware = "dvb-usb-s630.fw", 1395 .firmware = "dvb-usb-s630.fw",
1191 .no_reconnect = 1, 1396 .no_reconnect = 1,
1192 1397
1193 .i2c_algo = &s630_i2c_algo, 1398 .i2c_algo = &s6x0_i2c_algo,
1194 .rc_key_map = tevii_rc_keys, 1399 .rc_key_map = tevii_rc_keys,
1195 .rc_key_map_size = ARRAY_SIZE(tevii_rc_keys), 1400 .rc_key_map_size = ARRAY_SIZE(tevii_rc_keys),
1196 .rc_interval = 150, 1401 .rc_interval = 150,
@@ -1199,12 +1404,12 @@ static struct dvb_usb_device_properties s630_properties = {
1199 .generic_bulk_ctrl_endpoint = 0x81, 1404 .generic_bulk_ctrl_endpoint = 0x81,
1200 .num_adapters = 1, 1405 .num_adapters = 1,
1201 .download_firmware = dw2102_load_firmware, 1406 .download_firmware = dw2102_load_firmware,
1202 .read_mac_address = s630_read_mac_address, 1407 .read_mac_address = s6x0_read_mac_address,
1203 .adapter = { 1408 .adapter = {
1204 { 1409 {
1205 .frontend_attach = s630_frontend_attach, 1410 .frontend_attach = s6x0_frontend_attach,
1206 .streaming_ctrl = NULL, 1411 .streaming_ctrl = NULL,
1207 .tuner_attach = s630_zl10039_tuner_attach, 1412 .tuner_attach = NULL,
1208 .stream = { 1413 .stream = {
1209 .type = USB_BULK, 1414 .type = USB_BULK,
1210 .count = 8, 1415 .count = 8,
@@ -1217,28 +1422,59 @@ static struct dvb_usb_device_properties s630_properties = {
1217 }, 1422 },
1218 } 1423 }
1219 }, 1424 },
1220 .num_device_descs = 1, 1425 .num_device_descs = 3,
1221 .devices = { 1426 .devices = {
1222 {"TeVii S630 USB", 1427 {"TeVii S630 USB",
1223 {&dw2102_table[6], NULL}, 1428 {&dw2102_table[6], NULL},
1224 {NULL}, 1429 {NULL},
1225 }, 1430 },
1431 {"Prof 1100 USB ",
1432 {&dw2102_table[7], NULL},
1433 {NULL},
1434 },
1435 {"TeVii S660 USB",
1436 {&dw2102_table[8], NULL},
1437 {NULL},
1438 },
1226 } 1439 }
1227}; 1440};
1228 1441
1442struct dvb_usb_device_properties *p7500;
1443static struct dvb_usb_device_description d7500 = {
1444 "Prof 7500 USB DVB-S2",
1445 {&dw2102_table[9], NULL},
1446 {NULL},
1447};
1448
1229static int dw2102_probe(struct usb_interface *intf, 1449static int dw2102_probe(struct usb_interface *intf,
1230 const struct usb_device_id *id) 1450 const struct usb_device_id *id)
1231{ 1451{
1452
1453 p7500 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
1454 if (!p7500)
1455 return -ENOMEM;
1456 /* copy default structure */
1457 memcpy(p7500, &s6x0_properties,
1458 sizeof(struct dvb_usb_device_properties));
1459 /* fill only different fields */
1460 p7500->firmware = "dvb-usb-p7500.fw";
1461 p7500->devices[0] = d7500;
1462 p7500->rc_key_map = tbs_rc_keys;
1463 p7500->rc_key_map_size = ARRAY_SIZE(tbs_rc_keys);
1464 p7500->adapter->frontend_attach = prof_7500_frontend_attach;
1465
1232 if (0 == dvb_usb_device_init(intf, &dw2102_properties, 1466 if (0 == dvb_usb_device_init(intf, &dw2102_properties,
1233 THIS_MODULE, NULL, adapter_nr) || 1467 THIS_MODULE, NULL, adapter_nr) ||
1234 0 == dvb_usb_device_init(intf, &dw2104_properties, 1468 0 == dvb_usb_device_init(intf, &dw2104_properties,
1235 THIS_MODULE, NULL, adapter_nr) || 1469 THIS_MODULE, NULL, adapter_nr) ||
1236 0 == dvb_usb_device_init(intf, &dw3101_properties, 1470 0 == dvb_usb_device_init(intf, &dw3101_properties,
1237 THIS_MODULE, NULL, adapter_nr) || 1471 THIS_MODULE, NULL, adapter_nr) ||
1238 0 == dvb_usb_device_init(intf, &s630_properties, 1472 0 == dvb_usb_device_init(intf, &s6x0_properties,
1239 THIS_MODULE, NULL, adapter_nr)) { 1473 THIS_MODULE, NULL, adapter_nr) ||
1474 0 == dvb_usb_device_init(intf, p7500,
1475 THIS_MODULE, NULL, adapter_nr))
1240 return 0; 1476 return 0;
1241 } 1477
1242 return -ENODEV; 1478 return -ENODEV;
1243} 1479}
1244 1480
@@ -1269,6 +1505,7 @@ module_exit(dw2102_module_exit);
1269MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by"); 1505MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by");
1270MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104," 1506MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104,"
1271 " DVB-C 3101 USB2.0," 1507 " DVB-C 3101 USB2.0,"
1272 " TeVii S600, S630, S650 USB2.0 devices"); 1508 " TeVii S600, S630, S650, S660 USB2.0,"
1509 " Prof 1100, 7500 USB2.0 devices");
1273MODULE_VERSION("0.1"); 1510MODULE_VERSION("0.1");
1274MODULE_LICENSE("GPL"); 1511MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/dvb-usb/ec168.c b/drivers/media/dvb/dvb-usb/ec168.c
new file mode 100644
index 000000000000..52f5d4f0f230
--- /dev/null
+++ b/drivers/media/dvb/dvb-usb/ec168.c
@@ -0,0 +1,440 @@
1/*
2 * E3C EC168 DVB USB driver
3 *
4 * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 */
21
22#include "ec168.h"
23#include "ec100.h"
24#include "mxl5005s.h"
25
26/* debug */
27static int dvb_usb_ec168_debug;
28module_param_named(debug, dvb_usb_ec168_debug, int, 0644);
29MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
30DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
31
32static struct ec100_config ec168_ec100_config;
33
34static int ec168_rw_udev(struct usb_device *udev, struct ec168_req *req)
35{
36 int ret;
37 unsigned int pipe;
38 u8 request, requesttype;
39 u8 buf[req->size];
40
41 switch (req->cmd) {
42 case DOWNLOAD_FIRMWARE:
43 case GPIO:
44 case WRITE_I2C:
45 case STREAMING_CTRL:
46 requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
47 request = req->cmd;
48 break;
49 case READ_I2C:
50 requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
51 request = req->cmd;
52 break;
53 case GET_CONFIG:
54 requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
55 request = CONFIG;
56 break;
57 case SET_CONFIG:
58 requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
59 request = CONFIG;
60 break;
61 case WRITE_DEMOD:
62 requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
63 request = DEMOD_RW;
64 break;
65 case READ_DEMOD:
66 requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
67 request = DEMOD_RW;
68 break;
69 default:
70 err("unknown command:%02x", req->cmd);
71 ret = -EPERM;
72 goto error;
73 }
74
75 if (requesttype == (USB_TYPE_VENDOR | USB_DIR_OUT)) {
76 /* write */
77 memcpy(buf, req->data, req->size);
78 pipe = usb_sndctrlpipe(udev, 0);
79 } else {
80 /* read */
81 pipe = usb_rcvctrlpipe(udev, 0);
82 }
83
84 msleep(1); /* avoid I2C errors */
85
86 ret = usb_control_msg(udev, pipe, request, requesttype, req->value,
87 req->index, buf, sizeof(buf), EC168_USB_TIMEOUT);
88
89 ec168_debug_dump(request, requesttype, req->value, req->index, buf,
90 req->size, deb_xfer);
91
92 if (ret < 0)
93 goto error;
94 else
95 ret = 0;
96
97 /* read request, copy returned data to return buf */
98 if (!ret && requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
99 memcpy(req->data, buf, req->size);
100
101 return ret;
102error:
103 deb_info("%s: failed:%d\n", __func__, ret);
104 return ret;
105}
106
107static int ec168_ctrl_msg(struct dvb_usb_device *d, struct ec168_req *req)
108{
109 return ec168_rw_udev(d->udev, req);
110}
111
112/* I2C */
113static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
114 int num)
115{
116 struct dvb_usb_device *d = i2c_get_adapdata(adap);
117 struct ec168_req req;
118 int i = 0;
119 int ret;
120
121 if (num > 2)
122 return -EINVAL;
123
124 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
125 return -EAGAIN;
126
127 while (i < num) {
128 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
129 if (msg[i].addr == ec168_ec100_config.demod_address) {
130 req.cmd = READ_DEMOD;
131 req.value = 0;
132 req.index = 0xff00 + msg[i].buf[0]; /* reg */
133 req.size = msg[i+1].len; /* bytes to read */
134 req.data = &msg[i+1].buf[0];
135 ret = ec168_ctrl_msg(d, &req);
136 i += 2;
137 } else {
138 err("I2C read not implemented");
139 ret = -ENOSYS;
140 i += 2;
141 }
142 } else {
143 if (msg[i].addr == ec168_ec100_config.demod_address) {
144 req.cmd = WRITE_DEMOD;
145 req.value = msg[i].buf[1]; /* val */
146 req.index = 0xff00 + msg[i].buf[0]; /* reg */
147 req.size = 0;
148 req.data = NULL;
149 ret = ec168_ctrl_msg(d, &req);
150 i += 1;
151 } else {
152 req.cmd = WRITE_I2C;
153 req.value = msg[i].buf[0]; /* val */
154 req.index = 0x0100 + msg[i].addr; /* I2C addr */
155 req.size = msg[i].len-1;
156 req.data = &msg[i].buf[1];
157 ret = ec168_ctrl_msg(d, &req);
158 i += 1;
159 }
160 }
161 if (ret)
162 goto error;
163
164 }
165 ret = i;
166
167error:
168 mutex_unlock(&d->i2c_mutex);
169 return i;
170}
171
172
173static u32 ec168_i2c_func(struct i2c_adapter *adapter)
174{
175 return I2C_FUNC_I2C;
176}
177
178static struct i2c_algorithm ec168_i2c_algo = {
179 .master_xfer = ec168_i2c_xfer,
180 .functionality = ec168_i2c_func,
181};
182
183/* Callbacks for DVB USB */
184static struct ec100_config ec168_ec100_config = {
185 .demod_address = 0xff, /* not real address, demod is integrated */
186};
187
188static int ec168_ec100_frontend_attach(struct dvb_usb_adapter *adap)
189{
190 deb_info("%s:\n", __func__);
191 adap->fe = dvb_attach(ec100_attach, &ec168_ec100_config,
192 &adap->dev->i2c_adap);
193 if (adap->fe == NULL)
194 return -ENODEV;
195
196 return 0;
197}
198
199static struct mxl5005s_config ec168_mxl5003s_config = {
200 .i2c_address = 0xc6,
201 .if_freq = IF_FREQ_4570000HZ,
202 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
203 .agc_mode = MXL_SINGLE_AGC,
204 .tracking_filter = MXL_TF_OFF,
205 .rssi_enable = MXL_RSSI_ENABLE,
206 .cap_select = MXL_CAP_SEL_ENABLE,
207 .div_out = MXL_DIV_OUT_4,
208 .clock_out = MXL_CLOCK_OUT_DISABLE,
209 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
210 .top = MXL5005S_TOP_25P2,
211 .mod_mode = MXL_DIGITAL_MODE,
212 .if_mode = MXL_ZERO_IF,
213 .AgcMasterByte = 0x00,
214};
215
216static int ec168_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
217{
218 deb_info("%s:\n", __func__);
219 return dvb_attach(mxl5005s_attach, adap->fe, &adap->dev->i2c_adap,
220 &ec168_mxl5003s_config) == NULL ? -ENODEV : 0;
221}
222
223static int ec168_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
224{
225 struct ec168_req req = {STREAMING_CTRL, 0x7f01, 0x0202, 0, NULL};
226 deb_info("%s: onoff:%d\n", __func__, onoff);
227 if (onoff)
228 req.index = 0x0102;
229 return ec168_ctrl_msg(adap->dev, &req);
230}
231
232static int ec168_download_firmware(struct usb_device *udev,
233 const struct firmware *fw)
234{
235 int i, len, packets, remainder, ret;
236 u16 addr = 0x0000; /* firmware start address */
237 struct ec168_req req = {DOWNLOAD_FIRMWARE, 0, 0, 0, NULL};
238 deb_info("%s:\n", __func__);
239
240 #define FW_PACKET_MAX_DATA 2048
241 packets = fw->size / FW_PACKET_MAX_DATA;
242 remainder = fw->size % FW_PACKET_MAX_DATA;
243 len = FW_PACKET_MAX_DATA;
244 for (i = 0; i <= packets; i++) {
245 if (i == packets) /* set size of the last packet */
246 len = remainder;
247
248 req.size = len;
249 req.data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA);
250 req.index = addr;
251 addr += FW_PACKET_MAX_DATA;
252
253 ret = ec168_rw_udev(udev, &req);
254 if (ret) {
255 err("firmware download failed:%d packet:%d", ret, i);
256 goto error;
257 }
258 }
259 req.size = 0;
260
261 /* set "warm"? */
262 req.cmd = SET_CONFIG;
263 req.value = 0;
264 req.index = 0x0001;
265 ret = ec168_rw_udev(udev, &req);
266 if (ret)
267 goto error;
268
269 /* really needed - no idea what does */
270 req.cmd = GPIO;
271 req.value = 0;
272 req.index = 0x0206;
273 ret = ec168_rw_udev(udev, &req);
274 if (ret)
275 goto error;
276
277 /* activate tuner I2C? */
278 req.cmd = WRITE_I2C;
279 req.value = 0;
280 req.index = 0x00c6;
281 ret = ec168_rw_udev(udev, &req);
282 if (ret)
283 goto error;
284
285 return ret;
286error:
287 deb_info("%s: failed:%d\n", __func__, ret);
288 return ret;
289}
290
291static int ec168_identify_state(struct usb_device *udev,
292 struct dvb_usb_device_properties *props,
293 struct dvb_usb_device_description **desc, int *cold)
294{
295 int ret;
296 u8 reply;
297 struct ec168_req req = {GET_CONFIG, 0, 1, sizeof(reply), &reply};
298 deb_info("%s:\n", __func__);
299
300 ret = ec168_rw_udev(udev, &req);
301 if (ret)
302 goto error;
303
304 deb_info("%s: reply:%02x\n", __func__, reply);
305
306 if (reply == 0x01)
307 *cold = 0;
308 else
309 *cold = 1;
310
311 return ret;
312error:
313 deb_info("%s: failed:%d\n", __func__, ret);
314 return ret;
315}
316
317/* DVB USB Driver stuff */
318static struct dvb_usb_device_properties ec168_properties;
319
320static int ec168_probe(struct usb_interface *intf,
321 const struct usb_device_id *id)
322{
323 int ret;
324 deb_info("%s: interface:%d\n", __func__,
325 intf->cur_altsetting->desc.bInterfaceNumber);
326
327 ret = dvb_usb_device_init(intf, &ec168_properties, THIS_MODULE, NULL,
328 adapter_nr);
329 if (ret)
330 goto error;
331
332 return ret;
333error:
334 deb_info("%s: failed:%d\n", __func__, ret);
335 return ret;
336}
337
338#define E3C_EC168_1689 0
339#define E3C_EC168_FFFA 1
340#define E3C_EC168_FFFB 2
341#define E3C_EC168_1001 3
342#define E3C_EC168_1002 4
343
344static struct usb_device_id ec168_id[] = {
345 [E3C_EC168_1689] =
346 {USB_DEVICE(USB_VID_E3C, USB_PID_E3C_EC168)},
347 [E3C_EC168_FFFA] =
348 {USB_DEVICE(USB_VID_E3C, USB_PID_E3C_EC168_2)},
349 [E3C_EC168_FFFB] =
350 {USB_DEVICE(USB_VID_E3C, USB_PID_E3C_EC168_3)},
351 [E3C_EC168_1001] =
352 {USB_DEVICE(USB_VID_E3C, USB_PID_E3C_EC168_4)},
353 [E3C_EC168_1002] =
354 {USB_DEVICE(USB_VID_E3C, USB_PID_E3C_EC168_5)},
355 {} /* terminating entry */
356};
357
358MODULE_DEVICE_TABLE(usb, ec168_id);
359
360static struct dvb_usb_device_properties ec168_properties = {
361 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
362
363 .usb_ctrl = DEVICE_SPECIFIC,
364 .download_firmware = ec168_download_firmware,
365 .firmware = "dvb-usb-ec168.fw",
366 .no_reconnect = 1,
367
368 .size_of_priv = 0,
369
370 .num_adapters = 1,
371 .adapter = {
372 {
373 .streaming_ctrl = ec168_streaming_ctrl,
374 .frontend_attach = ec168_ec100_frontend_attach,
375 .tuner_attach = ec168_mxl5003s_tuner_attach,
376 .stream = {
377 .type = USB_BULK,
378 .count = 6,
379 .endpoint = 0x82,
380 .u = {
381 .bulk = {
382 .buffersize = (32*512),
383 }
384 }
385 },
386 }
387 },
388
389 .identify_state = ec168_identify_state,
390
391 .i2c_algo = &ec168_i2c_algo,
392
393 .num_device_descs = 1,
394 .devices = {
395 {
396 .name = "E3C EC168 DVB-T USB2.0 reference design",
397 .cold_ids = {
398 &ec168_id[E3C_EC168_1689],
399 &ec168_id[E3C_EC168_FFFA],
400 &ec168_id[E3C_EC168_FFFB],
401 &ec168_id[E3C_EC168_1001],
402 &ec168_id[E3C_EC168_1002],
403 NULL},
404 .warm_ids = {NULL},
405 },
406 }
407};
408
409static struct usb_driver ec168_driver = {
410 .name = "dvb_usb_ec168",
411 .probe = ec168_probe,
412 .disconnect = dvb_usb_device_exit,
413 .id_table = ec168_id,
414};
415
416/* module stuff */
417static int __init ec168_module_init(void)
418{
419 int ret;
420 deb_info("%s:\n", __func__);
421 ret = usb_register(&ec168_driver);
422 if (ret)
423 err("module init failed:%d", ret);
424
425 return ret;
426}
427
428static void __exit ec168_module_exit(void)
429{
430 deb_info("%s:\n", __func__);
431 /* deregister this driver from the USB subsystem */
432 usb_deregister(&ec168_driver);
433}
434
435module_init(ec168_module_init);
436module_exit(ec168_module_exit);
437
438MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
439MODULE_DESCRIPTION("E3C EC168 DVB-T USB2.0 driver");
440MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/dvb-usb/ec168.h b/drivers/media/dvb/dvb-usb/ec168.h
new file mode 100644
index 000000000000..e7e0b831314e
--- /dev/null
+++ b/drivers/media/dvb/dvb-usb/ec168.h
@@ -0,0 +1,73 @@
1/*
2 * E3C EC168 DVB USB driver
3 *
4 * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 */
21
22#ifndef EC168_H
23#define EC168_H
24
25#define DVB_USB_LOG_PREFIX "ec168"
26#include "dvb-usb.h"
27
28#define deb_info(args...) dprintk(dvb_usb_ec168_debug, 0x01, args)
29#define deb_rc(args...) dprintk(dvb_usb_ec168_debug, 0x02, args)
30#define deb_xfer(args...) dprintk(dvb_usb_ec168_debug, 0x04, args)
31#define deb_reg(args...) dprintk(dvb_usb_ec168_debug, 0x08, args)
32#define deb_i2c(args...) dprintk(dvb_usb_ec168_debug, 0x10, args)
33#define deb_fw(args...) dprintk(dvb_usb_ec168_debug, 0x20, args)
34
35#define ec168_debug_dump(r, t, v, i, b, l, func) { \
36 int loop_; \
37 func("%02x %02x %02x %02x %02x %02x %02x %02x", \
38 t, r, v & 0xff, v >> 8, i & 0xff, i >> 8, l & 0xff, l >> 8); \
39 if (t == (USB_TYPE_VENDOR | USB_DIR_OUT)) \
40 func(" >>> "); \
41 else \
42 func(" <<< "); \
43 for (loop_ = 0; loop_ < l; loop_++) \
44 func("%02x ", b[loop_]); \
45 func("\n");\
46}
47
48#define EC168_USB_TIMEOUT 1000
49
50struct ec168_req {
51 u8 cmd; /* [1] */
52 u16 value; /* [2|3] */
53 u16 index; /* [4|5] */
54 u16 size; /* [6|7] */
55 u8 *data;
56};
57
58enum ec168_cmd {
59 DOWNLOAD_FIRMWARE = 0x00,
60 CONFIG = 0x01,
61 DEMOD_RW = 0x03,
62 GPIO = 0x04,
63 STREAMING_CTRL = 0x10,
64 READ_I2C = 0x20,
65 WRITE_I2C = 0x21,
66 HID_DOWNLOAD = 0x30,
67 GET_CONFIG,
68 SET_CONFIG,
69 READ_DEMOD,
70 WRITE_DEMOD,
71};
72
73#endif
diff --git a/drivers/media/dvb/dvb-usb/friio-fe.c b/drivers/media/dvb/dvb-usb/friio-fe.c
index c4dfe25cf60d..d14bd227b502 100644
--- a/drivers/media/dvb/dvb-usb/friio-fe.c
+++ b/drivers/media/dvb/dvb-usb/friio-fe.c
@@ -134,11 +134,13 @@ static int jdvbt90502_pll_set_freq(struct jdvbt90502_state *state, u32 freq)
134 deb_fe("%s: freq=%d, step=%d\n", __func__, freq, 134 deb_fe("%s: freq=%d, step=%d\n", __func__, freq,
135 state->frontend.ops.info.frequency_stepsize); 135 state->frontend.ops.info.frequency_stepsize);
136 /* freq -> oscilator frequency conversion. */ 136 /* freq -> oscilator frequency conversion. */
137 /* freq: 473,000,000 + n*6,000,000 (no 1/7MHz shift to center freq) */ 137 /* freq: 473,000,000 + n*6,000,000 [+ 142857 (center freq. shift)] */
138 /* add 400[1/7 MHZ] = 57.142857MHz. 57MHz for the IF, */
139 /* 1/7MHz for center freq shift */
140 f = freq / state->frontend.ops.info.frequency_stepsize; 138 f = freq / state->frontend.ops.info.frequency_stepsize;
141 f += 400; 139 /* add 399[1/7 MHZ] = 57MHz for the IF */
140 f += 399;
141 /* add center frequency shift if necessary */
142 if (f % 7 == 0)
143 f++;
142 pll_freq_cmd[DEMOD_REDIRECT_REG] = JDVBT90502_2ND_I2C_REG; /* 0xFE */ 144 pll_freq_cmd[DEMOD_REDIRECT_REG] = JDVBT90502_2ND_I2C_REG; /* 0xFE */
143 pll_freq_cmd[ADDRESS_BYTE] = state->config.pll_address << 1; 145 pll_freq_cmd[ADDRESS_BYTE] = state->config.pll_address << 1;
144 pll_freq_cmd[DIVIDER_BYTE1] = (f >> 8) & 0x7F; 146 pll_freq_cmd[DIVIDER_BYTE1] = (f >> 8) & 0x7F;
@@ -232,12 +234,6 @@ static int jdvbt90502_read_status(struct dvb_frontend *fe, fe_status_t *state)
232 return 0; 234 return 0;
233} 235}
234 236
235static int jdvbt90502_read_ber(struct dvb_frontend *fe, u32 *ber)
236{
237 *ber = 0;
238 return 0;
239}
240
241static int jdvbt90502_read_signal_strength(struct dvb_frontend *fe, 237static int jdvbt90502_read_signal_strength(struct dvb_frontend *fe,
242 u16 *strength) 238 u16 *strength)
243{ 239{
@@ -264,26 +260,26 @@ static int jdvbt90502_read_signal_strength(struct dvb_frontend *fe,
264 return 0; 260 return 0;
265} 261}
266 262
267static int jdvbt90502_read_snr(struct dvb_frontend *fe, u16 *snr)
268{
269 *snr = 0x0101;
270 return 0;
271}
272
273static int jdvbt90502_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
274{
275 *ucblocks = 0;
276 return 0;
277}
278 263
279static int jdvbt90502_get_tune_settings(struct dvb_frontend *fe, 264/* filter out un-supported properties to notify users */
280 struct dvb_frontend_tune_settings *fs) 265static int jdvbt90502_set_property(struct dvb_frontend *fe,
266 struct dtv_property *tvp)
281{ 267{
282 fs->min_delay_ms = 500; 268 int r = 0;
283 fs->step_size = 0; 269
284 fs->max_drift = 0; 270 switch (tvp->cmd) {
285 271 case DTV_DELIVERY_SYSTEM:
286 return 0; 272 if (tvp->u.data != SYS_ISDBT)
273 r = -EINVAL;
274 break;
275 case DTV_CLEAR:
276 case DTV_TUNE:
277 case DTV_FREQUENCY:
278 break;
279 default:
280 r = -EINVAL;
281 }
282 return r;
287} 283}
288 284
289static int jdvbt90502_get_frontend(struct dvb_frontend *fe, 285static int jdvbt90502_get_frontend(struct dvb_frontend *fe,
@@ -314,6 +310,9 @@ static int jdvbt90502_set_frontend(struct dvb_frontend *fe,
314 310
315 deb_fe("%s: Freq:%d\n", __func__, p->frequency); 311 deb_fe("%s: Freq:%d\n", __func__, p->frequency);
316 312
313 /* for recovery from DTV_CLEAN */
314 fe->dtv_property_cache.delivery_system = SYS_ISDBT;
315
317 ret = jdvbt90502_pll_set_freq(state, p->frequency); 316 ret = jdvbt90502_pll_set_freq(state, p->frequency);
318 if (ret) { 317 if (ret) {
319 deb_fe("%s:ret == %d\n", __func__, ret); 318 deb_fe("%s:ret == %d\n", __func__, ret);
@@ -323,12 +322,6 @@ static int jdvbt90502_set_frontend(struct dvb_frontend *fe,
323 return 0; 322 return 0;
324} 323}
325 324
326static int jdvbt90502_sleep(struct dvb_frontend *fe)
327{
328 deb_fe("%s called.\n", __func__);
329 return 0;
330}
331
332 325
333/** 326/**
334 * (reg, val) commad list to initialize this module. 327 * (reg, val) commad list to initialize this module.
@@ -373,7 +366,7 @@ static u8 init_code[][2] = {
373 {0x76, 0x0C}, 366 {0x76, 0x0C},
374}; 367};
375 368
376const static int init_code_len = sizeof(init_code) / sizeof(u8[2]); 369static const int init_code_len = sizeof(init_code) / sizeof(u8[2]);
377 370
378static int jdvbt90502_init(struct dvb_frontend *fe) 371static int jdvbt90502_init(struct dvb_frontend *fe)
379{ 372{
@@ -394,6 +387,7 @@ static int jdvbt90502_init(struct dvb_frontend *fe)
394 if (ret != 1) 387 if (ret != 1)
395 goto error; 388 goto error;
396 } 389 }
390 fe->dtv_property_cache.delivery_system = SYS_ISDBT;
397 msleep(100); 391 msleep(100);
398 392
399 return 0; 393 return 0;
@@ -468,16 +462,13 @@ static struct dvb_frontend_ops jdvbt90502_ops = {
468 .release = jdvbt90502_release, 462 .release = jdvbt90502_release,
469 463
470 .init = jdvbt90502_init, 464 .init = jdvbt90502_init,
471 .sleep = jdvbt90502_sleep,
472 .write = _jdvbt90502_write, 465 .write = _jdvbt90502_write,
473 466
467 .set_property = jdvbt90502_set_property,
468
474 .set_frontend = jdvbt90502_set_frontend, 469 .set_frontend = jdvbt90502_set_frontend,
475 .get_frontend = jdvbt90502_get_frontend, 470 .get_frontend = jdvbt90502_get_frontend,
476 .get_tune_settings = jdvbt90502_get_tune_settings,
477 471
478 .read_status = jdvbt90502_read_status, 472 .read_status = jdvbt90502_read_status,
479 .read_ber = jdvbt90502_read_ber,
480 .read_signal_strength = jdvbt90502_read_signal_strength, 473 .read_signal_strength = jdvbt90502_read_signal_strength,
481 .read_snr = jdvbt90502_read_snr,
482 .read_ucblocks = jdvbt90502_read_ucblocks,
483}; 474};
diff --git a/drivers/media/dvb/dvb-usb/gp8psk-fe.c b/drivers/media/dvb/dvb-usb/gp8psk-fe.c
index 20eadf9318e0..7a7f1b2b681c 100644
--- a/drivers/media/dvb/dvb-usb/gp8psk-fe.c
+++ b/drivers/media/dvb/dvb-usb/gp8psk-fe.c
@@ -146,8 +146,8 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend* fe,
146 146
147 switch (c->delivery_system) { 147 switch (c->delivery_system) {
148 case SYS_DVBS: 148 case SYS_DVBS:
149 /* Only QPSK is supported for DVB-S */ 149 /* Allow QPSK and 8PSK (even for DVB-S) */
150 if (c->modulation != QPSK) { 150 if (c->modulation != QPSK && c->modulation != PSK_8) {
151 deb_fe("%s: unsupported modulation selected (%d)\n", 151 deb_fe("%s: unsupported modulation selected (%d)\n",
152 __func__, c->modulation); 152 __func__, c->modulation);
153 return -EOPNOTSUPP; 153 return -EOPNOTSUPP;
diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c
index ef9b7bed13ff..737ffa36ac9c 100644
--- a/drivers/media/dvb/dvb-usb/m920x.c
+++ b/drivers/media/dvb/dvb-usb/m920x.c
@@ -16,6 +16,9 @@
16#include "qt1010.h" 16#include "qt1010.h"
17#include "tda1004x.h" 17#include "tda1004x.h"
18#include "tda827x.h" 18#include "tda827x.h"
19
20#include <media/tuner.h>
21#include "tuner-simple.h"
19#include <asm/unaligned.h> 22#include <asm/unaligned.h>
20 23
21/* debug */ 24/* debug */
@@ -158,11 +161,14 @@ static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
158 161
159 case 0x93: 162 case 0x93:
160 case 0x92: 163 case 0x92:
164 case 0x83: /* pinnacle PCTV310e */
165 case 0x82:
161 m->rep_count = 0; 166 m->rep_count = 0;
162 *state = REMOTE_KEY_PRESSED; 167 *state = REMOTE_KEY_PRESSED;
163 goto unlock; 168 goto unlock;
164 169
165 case 0x91: 170 case 0x91:
171 case 0x81: /* pinnacle PCTV310e */
166 /* prevent immediate auto-repeat */ 172 /* prevent immediate auto-repeat */
167 if (++m->rep_count > 2) 173 if (++m->rep_count > 2)
168 *state = REMOTE_KEY_REPEAT; 174 *state = REMOTE_KEY_REPEAT;
@@ -546,6 +552,14 @@ static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
546 return 0; 552 return 0;
547} 553}
548 554
555static int m920x_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
556{
557 dvb_attach(simple_tuner_attach, adap->fe,
558 &adap->dev->i2c_adap, 0x61,
559 TUNER_PHILIPS_FMD1216ME_MK3);
560 return 0;
561}
562
549/* device-specific initialization */ 563/* device-specific initialization */
550static struct m920x_inits megasky_rc_init [] = { 564static struct m920x_inits megasky_rc_init [] = {
551 { M9206_RC_INIT2, 0xa8 }, 565 { M9206_RC_INIT2, 0xa8 },
@@ -562,6 +576,18 @@ static struct m920x_inits tvwalkertwin_rc_init [] = {
562 { } /* terminating entry */ 576 { } /* terminating entry */
563}; 577};
564 578
579static struct m920x_inits pinnacle310e_init[] = {
580 /* without these the tuner don't work */
581 { 0xff20, 0x9b },
582 { 0xff22, 0x70 },
583
584 /* rc settings */
585 { 0xff50, 0x80 },
586 { M9206_RC_INIT1, 0x00 },
587 { M9206_RC_INIT2, 0xff },
588 { } /* terminating entry */
589};
590
565/* ir keymaps */ 591/* ir keymaps */
566static struct dvb_usb_rc_key megasky_rc_keys [] = { 592static struct dvb_usb_rc_key megasky_rc_keys [] = {
567 { 0x0012, KEY_POWER }, 593 { 0x0012, KEY_POWER },
@@ -602,11 +628,68 @@ static struct dvb_usb_rc_key tvwalkertwin_rc_keys [] = {
602 { 0x001e, KEY_VOLUMEUP }, 628 { 0x001e, KEY_VOLUMEUP },
603}; 629};
604 630
631static struct dvb_usb_rc_key pinnacle310e_rc_keys[] = {
632 { 0x16, KEY_POWER },
633 { 0x17, KEY_FAVORITES },
634 { 0x0f, KEY_TEXT },
635 { 0x48, KEY_MEDIA }, /* preview */
636 { 0x1c, KEY_EPG },
637 { 0x04, KEY_LIST }, /* record list */
638 { 0x03, KEY_1 },
639 { 0x01, KEY_2 },
640 { 0x06, KEY_3 },
641 { 0x09, KEY_4 },
642 { 0x1d, KEY_5 },
643 { 0x1f, KEY_6 },
644 { 0x0d, KEY_7 },
645 { 0x19, KEY_8 },
646 { 0x1b, KEY_9 },
647 { 0x15, KEY_0 },
648 { 0x0c, KEY_CANCEL },
649 { 0x4a, KEY_CLEAR },
650 { 0x13, KEY_BACK },
651 { 0x00, KEY_TAB },
652 { 0x4b, KEY_UP },
653 { 0x4e, KEY_LEFT },
654 { 0x52, KEY_RIGHT },
655 { 0x51, KEY_DOWN },
656 { 0x4f, KEY_ENTER }, /* could also be KEY_OK */
657 { 0x1e, KEY_VOLUMEUP },
658 { 0x0a, KEY_VOLUMEDOWN },
659 { 0x05, KEY_CHANNELUP },
660 { 0x02, KEY_CHANNELDOWN },
661 { 0x11, KEY_RECORD },
662 { 0x14, KEY_PLAY },
663 { 0x4c, KEY_PAUSE },
664 { 0x1a, KEY_STOP },
665 { 0x40, KEY_REWIND },
666 { 0x12, KEY_FASTFORWARD },
667 { 0x41, KEY_PREVIOUSSONG }, /* Replay */
668 { 0x42, KEY_NEXTSONG }, /* Skip */
669 { 0x54, KEY_CAMERA }, /* Capture */
670/* { 0x50, KEY_SAP }, */ /* Sap */
671 { 0x47, KEY_CYCLEWINDOWS }, /* Pip */
672 { 0x4d, KEY_SCREEN }, /* FullScreen */
673 { 0x08, KEY_SUBTITLE },
674 { 0x0e, KEY_MUTE },
675/* { 0x49, KEY_LR }, */ /* L/R */
676 { 0x07, KEY_SLEEP }, /* Hibernate */
677 { 0x08, KEY_MEDIA }, /* A/V */
678 { 0x0e, KEY_MENU }, /* Recall */
679 { 0x45, KEY_ZOOMIN },
680 { 0x46, KEY_ZOOMOUT },
681 { 0x18, KEY_TV }, /* Red */
682 { 0x53, KEY_VCR }, /* Green */
683 { 0x5e, KEY_SAT }, /* Yellow */
684 { 0x5f, KEY_PLAYER }, /* Blue */
685};
686
605/* DVB USB Driver stuff */ 687/* DVB USB Driver stuff */
606static struct dvb_usb_device_properties megasky_properties; 688static struct dvb_usb_device_properties megasky_properties;
607static struct dvb_usb_device_properties digivox_mini_ii_properties; 689static struct dvb_usb_device_properties digivox_mini_ii_properties;
608static struct dvb_usb_device_properties tvwalkertwin_properties; 690static struct dvb_usb_device_properties tvwalkertwin_properties;
609static struct dvb_usb_device_properties dposh_properties; 691static struct dvb_usb_device_properties dposh_properties;
692static struct dvb_usb_device_properties pinnacle_pctv310e_properties;
610 693
611static int m920x_probe(struct usb_interface *intf, 694static int m920x_probe(struct usb_interface *intf,
612 const struct usb_device_id *id) 695 const struct usb_device_id *id)
@@ -652,6 +735,13 @@ static int m920x_probe(struct usb_interface *intf,
652 goto found; 735 goto found;
653 } 736 }
654 737
738 ret = dvb_usb_device_init(intf, &pinnacle_pctv310e_properties,
739 THIS_MODULE, &d, adapter_nr);
740 if (ret == 0) {
741 rc_init_seq = pinnacle310e_init;
742 goto found;
743 }
744
655 return ret; 745 return ret;
656 } else { 746 } else {
657 /* Another interface on a multi-tuner device */ 747 /* Another interface on a multi-tuner device */
@@ -682,6 +772,7 @@ static struct usb_device_id m920x_table [] = {
682 USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) }, 772 USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) },
683 { USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) }, 773 { USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) },
684 { USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) }, 774 { USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) },
775 { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_PINNACLE_PCTV310E) },
685 { } /* Terminating entry */ 776 { } /* Terminating entry */
686}; 777};
687MODULE_DEVICE_TABLE (usb, m920x_table); 778MODULE_DEVICE_TABLE (usb, m920x_table);
@@ -895,6 +986,56 @@ static struct dvb_usb_device_properties dposh_properties = {
895 } 986 }
896}; 987};
897 988
989static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
990 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
991
992 .usb_ctrl = DEVICE_SPECIFIC,
993 .download_firmware = NULL,
994
995 .rc_interval = 100,
996 .rc_key_map = pinnacle310e_rc_keys,
997 .rc_key_map_size = ARRAY_SIZE(pinnacle310e_rc_keys),
998 .rc_query = m920x_rc_query,
999
1000 .size_of_priv = sizeof(struct m920x_state),
1001
1002 .identify_state = m920x_identify_state,
1003 .num_adapters = 1,
1004 .adapter = {{
1005 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1006 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1007
1008 .pid_filter_count = 8,
1009 .pid_filter = m920x_pid_filter,
1010 .pid_filter_ctrl = m920x_pid_filter_ctrl,
1011
1012 .frontend_attach = m920x_mt352_frontend_attach,
1013 .tuner_attach = m920x_fmd1216me_tuner_attach,
1014
1015 .stream = {
1016 .type = USB_ISOC,
1017 .count = 5,
1018 .endpoint = 0x84,
1019 .u = {
1020 .isoc = {
1021 .framesperurb = 128,
1022 .framesize = 564,
1023 .interval = 1,
1024 }
1025 }
1026 },
1027 } },
1028 .i2c_algo = &m920x_i2c_algo,
1029
1030 .num_device_descs = 1,
1031 .devices = {
1032 { "Pinnacle PCTV 310e",
1033 { &m920x_table[6], NULL },
1034 { NULL },
1035 }
1036 }
1037};
1038
898static struct usb_driver m920x_driver = { 1039static struct usb_driver m920x_driver = {
899 .name = "dvb_usb_m920x", 1040 .name = "dvb_usb_m920x",
900 .probe = m920x_probe, 1041 .probe = m920x_probe,
diff --git a/drivers/media/dvb/dvb-usb/m920x.h b/drivers/media/dvb/dvb-usb/m920x.h
index 37532890accd..3c061518ffc1 100644
--- a/drivers/media/dvb/dvb-usb/m920x.h
+++ b/drivers/media/dvb/dvb-usb/m920x.h
@@ -18,7 +18,7 @@
18#define M9206_FW 0x30 18#define M9206_FW 0x30
19 19
20#define M9206_MAX_FILTERS 8 20#define M9206_MAX_FILTERS 8
21#define M9206_MAX_ADAPTERS 2 21#define M9206_MAX_ADAPTERS 4
22 22
23/* 23/*
24sequences found in logs: 24sequences found in logs:
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c
index d4e230941679..830557696ae6 100644
--- a/drivers/media/dvb/dvb-usb/opera1.c
+++ b/drivers/media/dvb/dvb-usb/opera1.c
@@ -138,7 +138,7 @@ static int opera1_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
138 (msg[i].addr<<1)|(msg[i].flags&I2C_M_RD?0x01:0), 138 (msg[i].addr<<1)|(msg[i].flags&I2C_M_RD?0x01:0),
139 msg[i].buf, 139 msg[i].buf,
140 msg[i].len 140 msg[i].len
141 )!= msg[i].len)) { 141 )) != msg[i].len) {
142 break; 142 break;
143 } 143 }
144 if (dvb_usb_opera1_debug & 0x10) 144 if (dvb_usb_opera1_debug & 0x10)
diff --git a/drivers/media/dvb/dvb-usb/usb-urb.c b/drivers/media/dvb/dvb-usb/usb-urb.c
index 9da2cc95ca13..f9702e3756b6 100644
--- a/drivers/media/dvb/dvb-usb/usb-urb.c
+++ b/drivers/media/dvb/dvb-usb/usb-urb.c
@@ -56,7 +56,7 @@ static void usb_urb_complete(struct urb *urb)
56 stream->complete(stream, b, urb->actual_length); 56 stream->complete(stream, b, urb->actual_length);
57 break; 57 break;
58 default: 58 default:
59 err("unkown endpoint type in completition handler."); 59 err("unknown endpoint type in completition handler.");
60 return; 60 return;
61 } 61 }
62 usb_submit_urb(urb,GFP_ATOMIC); 62 usb_submit_urb(urb,GFP_ATOMIC);
@@ -228,7 +228,7 @@ int usb_urb_init(struct usb_data_stream *stream, struct usb_data_stream_properti
228 case USB_ISOC: 228 case USB_ISOC:
229 return usb_isoc_urb_init(stream); 229 return usb_isoc_urb_init(stream);
230 default: 230 default:
231 err("unkown URB-type for data transfer."); 231 err("unknown URB-type for data transfer.");
232 return -EINVAL; 232 return -EINVAL;
233 } 233 }
234} 234}
diff --git a/drivers/media/dvb/firewire/Kconfig b/drivers/media/dvb/firewire/Kconfig
index 69028253e984..4afa29256df1 100644
--- a/drivers/media/dvb/firewire/Kconfig
+++ b/drivers/media/dvb/firewire/Kconfig
@@ -1,6 +1,6 @@
1config DVB_FIREDTV 1config DVB_FIREDTV
2 tristate "FireDTV and FloppyDTV" 2 tristate "FireDTV and FloppyDTV"
3 depends on DVB_CORE && IEEE1394 3 depends on DVB_CORE && (FIREWIRE || IEEE1394)
4 help 4 help
5 Support for DVB receivers from Digital Everywhere 5 Support for DVB receivers from Digital Everywhere
6 which are connected via IEEE 1394 (FireWire). 6 which are connected via IEEE 1394 (FireWire).
@@ -13,8 +13,11 @@ config DVB_FIREDTV
13 13
14if DVB_FIREDTV 14if DVB_FIREDTV
15 15
16config DVB_FIREDTV_FIREWIRE
17 def_bool FIREWIRE = y || (FIREWIRE = m && DVB_FIREDTV = m)
18
16config DVB_FIREDTV_IEEE1394 19config DVB_FIREDTV_IEEE1394
17 def_bool IEEE1394 20 def_bool IEEE1394 = y || (IEEE1394 = m && DVB_FIREDTV = m)
18 21
19config DVB_FIREDTV_INPUT 22config DVB_FIREDTV_INPUT
20 def_bool INPUT = y || (INPUT = m && DVB_FIREDTV = m) 23 def_bool INPUT = y || (INPUT = m && DVB_FIREDTV = m)
diff --git a/drivers/media/dvb/firewire/Makefile b/drivers/media/dvb/firewire/Makefile
index 2034695ba194..da84203d51c6 100644
--- a/drivers/media/dvb/firewire/Makefile
+++ b/drivers/media/dvb/firewire/Makefile
@@ -1,6 +1,7 @@
1obj-$(CONFIG_DVB_FIREDTV) += firedtv.o 1obj-$(CONFIG_DVB_FIREDTV) += firedtv.o
2 2
3firedtv-y := firedtv-avc.o firedtv-ci.o firedtv-dvb.o firedtv-fe.o 3firedtv-y := firedtv-avc.o firedtv-ci.o firedtv-dvb.o firedtv-fe.o
4firedtv-$(CONFIG_DVB_FIREDTV_FIREWIRE) += firedtv-fw.o
4firedtv-$(CONFIG_DVB_FIREDTV_IEEE1394) += firedtv-1394.o 5firedtv-$(CONFIG_DVB_FIREDTV_IEEE1394) += firedtv-1394.o
5firedtv-$(CONFIG_DVB_FIREDTV_INPUT) += firedtv-rc.o 6firedtv-$(CONFIG_DVB_FIREDTV_INPUT) += firedtv-rc.o
6 7
diff --git a/drivers/media/dvb/firewire/firedtv-1394.c b/drivers/media/dvb/firewire/firedtv-1394.c
index 2b6eeeab5b25..26333b4f4d3e 100644
--- a/drivers/media/dvb/firewire/firedtv-1394.c
+++ b/drivers/media/dvb/firewire/firedtv-1394.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * FireDTV driver (formerly known as FireSAT) 2 * FireDTV driver -- ieee1394 I/O backend
3 * 3 *
4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com> 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (C) 2007-2008 Ben Backx <ben@bbackx.com> 5 * Copyright (C) 2007-2008 Ben Backx <ben@bbackx.com>
@@ -15,6 +15,7 @@
15#include <linux/errno.h> 15#include <linux/errno.h>
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/list.h> 17#include <linux/list.h>
18#include <linux/slab.h>
18#include <linux/spinlock.h> 19#include <linux/spinlock.h>
19#include <linux/types.h> 20#include <linux/types.h>
20 21
@@ -26,13 +27,16 @@
26#include <iso.h> 27#include <iso.h>
27#include <nodemgr.h> 28#include <nodemgr.h>
28 29
30#include <dvb_demux.h>
31
29#include "firedtv.h" 32#include "firedtv.h"
30 33
31static LIST_HEAD(node_list); 34static LIST_HEAD(node_list);
32static DEFINE_SPINLOCK(node_list_lock); 35static DEFINE_SPINLOCK(node_list_lock);
33 36
34#define FIREWIRE_HEADER_SIZE 4 37#define CIP_HEADER_SIZE 8
35#define CIP_HEADER_SIZE 8 38#define MPEG2_TS_HEADER_SIZE 4
39#define MPEG2_TS_SOURCE_PACKET_SIZE (4 + 188)
36 40
37static void rawiso_activity_cb(struct hpsb_iso *iso) 41static void rawiso_activity_cb(struct hpsb_iso *iso)
38{ 42{
@@ -62,20 +66,20 @@ static void rawiso_activity_cb(struct hpsb_iso *iso)
62 buf = dma_region_i(&iso->data_buf, unsigned char, 66 buf = dma_region_i(&iso->data_buf, unsigned char,
63 iso->infos[packet].offset + CIP_HEADER_SIZE); 67 iso->infos[packet].offset + CIP_HEADER_SIZE);
64 count = (iso->infos[packet].len - CIP_HEADER_SIZE) / 68 count = (iso->infos[packet].len - CIP_HEADER_SIZE) /
65 (188 + FIREWIRE_HEADER_SIZE); 69 MPEG2_TS_SOURCE_PACKET_SIZE;
66 70
67 /* ignore empty packet */ 71 /* ignore empty packet */
68 if (iso->infos[packet].len <= CIP_HEADER_SIZE) 72 if (iso->infos[packet].len <= CIP_HEADER_SIZE)
69 continue; 73 continue;
70 74
71 while (count--) { 75 while (count--) {
72 if (buf[FIREWIRE_HEADER_SIZE] == 0x47) 76 if (buf[MPEG2_TS_HEADER_SIZE] == 0x47)
73 dvb_dmx_swfilter_packets(&fdtv->demux, 77 dvb_dmx_swfilter_packets(&fdtv->demux,
74 &buf[FIREWIRE_HEADER_SIZE], 1); 78 &buf[MPEG2_TS_HEADER_SIZE], 1);
75 else 79 else
76 dev_err(fdtv->device, 80 dev_err(fdtv->device,
77 "skipping invalid packet\n"); 81 "skipping invalid packet\n");
78 buf += 188 + FIREWIRE_HEADER_SIZE; 82 buf += MPEG2_TS_SOURCE_PACKET_SIZE;
79 } 83 }
80 } 84 }
81out: 85out:
@@ -87,15 +91,21 @@ static inline struct node_entry *node_of(struct firedtv *fdtv)
87 return container_of(fdtv->device, struct unit_directory, device)->ne; 91 return container_of(fdtv->device, struct unit_directory, device)->ne;
88} 92}
89 93
90static int node_lock(struct firedtv *fdtv, u64 addr, void *data, __be32 arg) 94static int node_lock(struct firedtv *fdtv, u64 addr, void *data)
91{ 95{
92 return hpsb_node_lock(node_of(fdtv), addr, EXTCODE_COMPARE_SWAP, data, 96 quadlet_t *d = data;
93 (__force quadlet_t)arg); 97 int ret;
98
99 ret = hpsb_node_lock(node_of(fdtv), addr,
100 EXTCODE_COMPARE_SWAP, &d[1], d[0]);
101 d[0] = d[1];
102
103 return ret;
94} 104}
95 105
96static int node_read(struct firedtv *fdtv, u64 addr, void *data, size_t len) 106static int node_read(struct firedtv *fdtv, u64 addr, void *data)
97{ 107{
98 return hpsb_node_read(node_of(fdtv), addr, data, len); 108 return hpsb_node_read(node_of(fdtv), addr, data, 4);
99} 109}
100 110
101static int node_write(struct firedtv *fdtv, u64 addr, void *data, size_t len) 111static int node_write(struct firedtv *fdtv, u64 addr, void *data, size_t len)
@@ -184,9 +194,13 @@ static int node_probe(struct device *dev)
184 int kv_len, err; 194 int kv_len, err;
185 void *kv_str; 195 void *kv_str;
186 196
187 kv_len = (ud->model_name_kv->value.leaf.len - 2) * sizeof(quadlet_t); 197 if (ud->model_name_kv) {
188 kv_str = CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv); 198 kv_len = (ud->model_name_kv->value.leaf.len - 2) * 4;
189 199 kv_str = CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv);
200 } else {
201 kv_len = 0;
202 kv_str = NULL;
203 }
190 fdtv = fdtv_alloc(dev, &fdtv_1394_backend, kv_str, kv_len); 204 fdtv = fdtv_alloc(dev, &fdtv_1394_backend, kv_str, kv_len);
191 if (!fdtv) 205 if (!fdtv)
192 return -ENOMEM; 206 return -ENOMEM;
@@ -212,6 +226,7 @@ static int node_probe(struct device *dev)
212 goto fail; 226 goto fail;
213 227
214 avc_register_remote_control(fdtv); 228 avc_register_remote_control(fdtv);
229
215 return 0; 230 return 0;
216fail: 231fail:
217 spin_lock_irq(&node_list_lock); 232 spin_lock_irq(&node_list_lock);
@@ -220,6 +235,7 @@ fail:
220 fdtv_unregister_rc(fdtv); 235 fdtv_unregister_rc(fdtv);
221fail_free: 236fail_free:
222 kfree(fdtv); 237 kfree(fdtv);
238
223 return err; 239 return err;
224} 240}
225 241
@@ -233,10 +249,9 @@ static int node_remove(struct device *dev)
233 list_del(&fdtv->list); 249 list_del(&fdtv->list);
234 spin_unlock_irq(&node_list_lock); 250 spin_unlock_irq(&node_list_lock);
235 251
236 cancel_work_sync(&fdtv->remote_ctrl_work);
237 fdtv_unregister_rc(fdtv); 252 fdtv_unregister_rc(fdtv);
238
239 kfree(fdtv); 253 kfree(fdtv);
254
240 return 0; 255 return 0;
241} 256}
242 257
@@ -252,6 +267,7 @@ static int node_update(struct unit_directory *ud)
252 267
253static struct hpsb_protocol_driver fdtv_driver = { 268static struct hpsb_protocol_driver fdtv_driver = {
254 .name = "firedtv", 269 .name = "firedtv",
270 .id_table = fdtv_id_table,
255 .update = node_update, 271 .update = node_update,
256 .driver = { 272 .driver = {
257 .probe = node_probe, 273 .probe = node_probe,
@@ -264,12 +280,11 @@ static struct hpsb_highlevel fdtv_highlevel = {
264 .fcp_request = fcp_request, 280 .fcp_request = fcp_request,
265}; 281};
266 282
267int __init fdtv_1394_init(struct ieee1394_device_id id_table[]) 283int __init fdtv_1394_init(void)
268{ 284{
269 int ret; 285 int ret;
270 286
271 hpsb_register_highlevel(&fdtv_highlevel); 287 hpsb_register_highlevel(&fdtv_highlevel);
272 fdtv_driver.id_table = id_table;
273 ret = hpsb_register_protocol(&fdtv_driver); 288 ret = hpsb_register_protocol(&fdtv_driver);
274 if (ret) { 289 if (ret) {
275 printk(KERN_ERR "firedtv: failed to register protocol\n"); 290 printk(KERN_ERR "firedtv: failed to register protocol\n");
diff --git a/drivers/media/dvb/firewire/firedtv-avc.c b/drivers/media/dvb/firewire/firedtv-avc.c
index 485d061319ab..1b31bebc27d6 100644
--- a/drivers/media/dvb/firewire/firedtv-avc.c
+++ b/drivers/media/dvb/firewire/firedtv-avc.c
@@ -74,7 +74,6 @@
74#define EN50221_TAG_CA_INFO 0x9f8031 74#define EN50221_TAG_CA_INFO 0x9f8031
75 75
76struct avc_command_frame { 76struct avc_command_frame {
77 int length;
78 u8 ctype; 77 u8 ctype;
79 u8 subunit; 78 u8 subunit;
80 u8 opcode; 79 u8 opcode;
@@ -82,13 +81,27 @@ struct avc_command_frame {
82}; 81};
83 82
84struct avc_response_frame { 83struct avc_response_frame {
85 int length;
86 u8 response; 84 u8 response;
87 u8 subunit; 85 u8 subunit;
88 u8 opcode; 86 u8 opcode;
89 u8 operand[509]; 87 u8 operand[509];
90}; 88};
91 89
90#define LAST_OPERAND (509 - 1)
91
92static inline void clear_operands(struct avc_command_frame *c, int from, int to)
93{
94 memset(&c->operand[from], 0, to - from + 1);
95}
96
97static void pad_operands(struct avc_command_frame *c, int from)
98{
99 int to = ALIGN(from, 4);
100
101 if (from <= to && to <= LAST_OPERAND)
102 clear_operands(c, from, to);
103}
104
92#define AVC_DEBUG_READ_DESCRIPTOR 0x0001 105#define AVC_DEBUG_READ_DESCRIPTOR 0x0001
93#define AVC_DEBUG_DSIT 0x0002 106#define AVC_DEBUG_DSIT 0x0002
94#define AVC_DEBUG_DSD 0x0004 107#define AVC_DEBUG_DSD 0x0004
@@ -202,78 +215,65 @@ static void debug_pmt(char *msg, int length)
202 16, 1, msg, length, false); 215 16, 1, msg, length, false);
203} 216}
204 217
205static int __avc_write(struct firedtv *fdtv, 218static int avc_write(struct firedtv *fdtv)
206 const struct avc_command_frame *c, struct avc_response_frame *r)
207{ 219{
208 int err, retry; 220 int err, retry;
209 221
210 if (r) 222 fdtv->avc_reply_received = false;
211 fdtv->avc_reply_received = false;
212 223
213 for (retry = 0; retry < 6; retry++) { 224 for (retry = 0; retry < 6; retry++) {
214 if (unlikely(avc_debug)) 225 if (unlikely(avc_debug))
215 debug_fcp(&c->ctype, c->length); 226 debug_fcp(fdtv->avc_data, fdtv->avc_data_length);
216 227
217 err = fdtv->backend->write(fdtv, FCP_COMMAND_REGISTER, 228 err = fdtv->backend->write(fdtv, FCP_COMMAND_REGISTER,
218 (void *)&c->ctype, c->length); 229 fdtv->avc_data, fdtv->avc_data_length);
219 if (err) { 230 if (err) {
220 fdtv->avc_reply_received = true;
221 dev_err(fdtv->device, "FCP command write failed\n"); 231 dev_err(fdtv->device, "FCP command write failed\n");
232
222 return err; 233 return err;
223 } 234 }
224 235
225 if (!r)
226 return 0;
227
228 /* 236 /*
229 * AV/C specs say that answers should be sent within 150 ms. 237 * AV/C specs say that answers should be sent within 150 ms.
230 * Time out after 200 ms. 238 * Time out after 200 ms.
231 */ 239 */
232 if (wait_event_timeout(fdtv->avc_wait, 240 if (wait_event_timeout(fdtv->avc_wait,
233 fdtv->avc_reply_received, 241 fdtv->avc_reply_received,
234 msecs_to_jiffies(200)) != 0) { 242 msecs_to_jiffies(200)) != 0)
235 r->length = fdtv->response_length;
236 memcpy(&r->response, fdtv->response, r->length);
237
238 return 0; 243 return 0;
239 }
240 } 244 }
241 dev_err(fdtv->device, "FCP response timed out\n"); 245 dev_err(fdtv->device, "FCP response timed out\n");
246
242 return -ETIMEDOUT; 247 return -ETIMEDOUT;
243} 248}
244 249
245static int avc_write(struct firedtv *fdtv, 250static bool is_register_rc(struct avc_response_frame *r)
246 const struct avc_command_frame *c, struct avc_response_frame *r)
247{ 251{
248 int ret; 252 return r->opcode == AVC_OPCODE_VENDOR &&
249 253 r->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
250 if (mutex_lock_interruptible(&fdtv->avc_mutex)) 254 r->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
251 return -EINTR; 255 r->operand[2] == SFE_VENDOR_DE_COMPANYID_2 &&
252 256 r->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL;
253 ret = __avc_write(fdtv, c, r);
254
255 mutex_unlock(&fdtv->avc_mutex);
256 return ret;
257} 257}
258 258
259int avc_recv(struct firedtv *fdtv, void *data, size_t length) 259int avc_recv(struct firedtv *fdtv, void *data, size_t length)
260{ 260{
261 struct avc_response_frame *r = 261 struct avc_response_frame *r = data;
262 data - offsetof(struct avc_response_frame, response);
263 262
264 if (unlikely(avc_debug)) 263 if (unlikely(avc_debug))
265 debug_fcp(data, length); 264 debug_fcp(data, length);
266 265
267 if (length >= 8 && 266 if (length >= 8 && is_register_rc(r)) {
268 r->operand[0] == SFE_VENDOR_DE_COMPANYID_0 && 267 switch (r->response) {
269 r->operand[1] == SFE_VENDOR_DE_COMPANYID_1 && 268 case AVC_RESPONSE_CHANGED:
270 r->operand[2] == SFE_VENDOR_DE_COMPANYID_2 && 269 fdtv_handle_rc(fdtv, r->operand[4] << 8 | r->operand[5]);
271 r->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
272 if (r->response == AVC_RESPONSE_CHANGED) {
273 fdtv_handle_rc(fdtv,
274 r->operand[4] << 8 | r->operand[5]);
275 schedule_work(&fdtv->remote_ctrl_work); 270 schedule_work(&fdtv->remote_ctrl_work);
276 } else if (r->response != AVC_RESPONSE_INTERIM) { 271 break;
272 case AVC_RESPONSE_INTERIM:
273 if (is_register_rc((void *)fdtv->avc_data))
274 goto wake;
275 break;
276 default:
277 dev_info(fdtv->device, 277 dev_info(fdtv->device,
278 "remote control result = %d\n", r->response); 278 "remote control result = %d\n", r->response);
279 } 279 }
@@ -285,9 +285,9 @@ int avc_recv(struct firedtv *fdtv, void *data, size_t length)
285 return -EIO; 285 return -EIO;
286 } 286 }
287 287
288 memcpy(fdtv->response, data, length); 288 memcpy(fdtv->avc_data, data, length);
289 fdtv->response_length = length; 289 fdtv->avc_data_length = length;
290 290wake:
291 fdtv->avc_reply_received = true; 291 fdtv->avc_reply_received = true;
292 wake_up(&fdtv->avc_wait); 292 wake_up(&fdtv->avc_wait);
293 293
@@ -318,10 +318,11 @@ static int add_pid_filter(struct firedtv *fdtv, u8 *operand)
318 * tuning command for setting the relative LNB frequency 318 * tuning command for setting the relative LNB frequency
319 * (not supported by the AVC standard) 319 * (not supported by the AVC standard)
320 */ 320 */
321static void avc_tuner_tuneqpsk(struct firedtv *fdtv, 321static int avc_tuner_tuneqpsk(struct firedtv *fdtv,
322 struct dvb_frontend_parameters *params, 322 struct dvb_frontend_parameters *params)
323 struct avc_command_frame *c)
324{ 323{
324 struct avc_command_frame *c = (void *)fdtv->avc_data;
325
325 c->opcode = AVC_OPCODE_VENDOR; 326 c->opcode = AVC_OPCODE_VENDOR;
326 327
327 c->operand[0] = SFE_VENDOR_DE_COMPANYID_0; 328 c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
@@ -370,16 +371,18 @@ static void avc_tuner_tuneqpsk(struct firedtv *fdtv,
370 c->operand[13] = 0x1; 371 c->operand[13] = 0x1;
371 c->operand[14] = 0xff; 372 c->operand[14] = 0xff;
372 c->operand[15] = 0xff; 373 c->operand[15] = 0xff;
373 c->length = 20; 374
375 return 16;
374 } else { 376 } else {
375 c->length = 16; 377 return 13;
376 } 378 }
377} 379}
378 380
379static void avc_tuner_dsd_dvb_c(struct firedtv *fdtv, 381static int avc_tuner_dsd_dvb_c(struct firedtv *fdtv,
380 struct dvb_frontend_parameters *params, 382 struct dvb_frontend_parameters *params)
381 struct avc_command_frame *c)
382{ 383{
384 struct avc_command_frame *c = (void *)fdtv->avc_data;
385
383 c->opcode = AVC_OPCODE_DSD; 386 c->opcode = AVC_OPCODE_DSD;
384 387
385 c->operand[0] = 0; /* source plug */ 388 c->operand[0] = 0; /* source plug */
@@ -440,15 +443,14 @@ static void avc_tuner_dsd_dvb_c(struct firedtv *fdtv,
440 c->operand[20] = 0x00; 443 c->operand[20] = 0x00;
441 c->operand[21] = 0x00; 444 c->operand[21] = 0x00;
442 445
443 /* Add PIDs to filter */ 446 return 22 + add_pid_filter(fdtv, &c->operand[22]);
444 c->length = ALIGN(22 + add_pid_filter(fdtv, &c->operand[22]) + 3, 4);
445} 447}
446 448
447static void avc_tuner_dsd_dvb_t(struct firedtv *fdtv, 449static int avc_tuner_dsd_dvb_t(struct firedtv *fdtv,
448 struct dvb_frontend_parameters *params, 450 struct dvb_frontend_parameters *params)
449 struct avc_command_frame *c)
450{ 451{
451 struct dvb_ofdm_parameters *ofdm = &params->u.ofdm; 452 struct dvb_ofdm_parameters *ofdm = &params->u.ofdm;
453 struct avc_command_frame *c = (void *)fdtv->avc_data;
452 454
453 c->opcode = AVC_OPCODE_DSD; 455 c->opcode = AVC_OPCODE_DSD;
454 456
@@ -543,55 +545,58 @@ static void avc_tuner_dsd_dvb_t(struct firedtv *fdtv,
543 c->operand[15] = 0x00; /* network_ID[0] */ 545 c->operand[15] = 0x00; /* network_ID[0] */
544 c->operand[16] = 0x00; /* network_ID[1] */ 546 c->operand[16] = 0x00; /* network_ID[1] */
545 547
546 /* Add PIDs to filter */ 548 return 17 + add_pid_filter(fdtv, &c->operand[17]);
547 c->length = ALIGN(17 + add_pid_filter(fdtv, &c->operand[17]) + 3, 4);
548} 549}
549 550
550int avc_tuner_dsd(struct firedtv *fdtv, 551int avc_tuner_dsd(struct firedtv *fdtv,
551 struct dvb_frontend_parameters *params) 552 struct dvb_frontend_parameters *params)
552{ 553{
553 char buffer[sizeof(struct avc_command_frame)]; 554 struct avc_command_frame *c = (void *)fdtv->avc_data;
554 struct avc_command_frame *c = (void *)buffer; 555 int pos, ret;
555 struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
556 556
557 memset(c, 0, sizeof(*c)); 557 mutex_lock(&fdtv->avc_mutex);
558 558
559 c->ctype = AVC_CTYPE_CONTROL; 559 c->ctype = AVC_CTYPE_CONTROL;
560 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 560 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
561 561
562 switch (fdtv->type) { 562 switch (fdtv->type) {
563 case FIREDTV_DVB_S: 563 case FIREDTV_DVB_S:
564 case FIREDTV_DVB_S2: avc_tuner_tuneqpsk(fdtv, params, c); break; 564 case FIREDTV_DVB_S2: pos = avc_tuner_tuneqpsk(fdtv, params); break;
565 case FIREDTV_DVB_C: avc_tuner_dsd_dvb_c(fdtv, params, c); break; 565 case FIREDTV_DVB_C: pos = avc_tuner_dsd_dvb_c(fdtv, params); break;
566 case FIREDTV_DVB_T: avc_tuner_dsd_dvb_t(fdtv, params, c); break; 566 case FIREDTV_DVB_T: pos = avc_tuner_dsd_dvb_t(fdtv, params); break;
567 default: 567 default:
568 BUG(); 568 BUG();
569 } 569 }
570 pad_operands(c, pos);
570 571
571 if (avc_write(fdtv, c, r) < 0) 572 fdtv->avc_data_length = ALIGN(3 + pos, 4);
572 return -EIO; 573 ret = avc_write(fdtv);
573
574 msleep(500);
575#if 0 574#if 0
576 /* FIXME: */ 575 /*
577 /* u8 *status was an out-parameter of avc_tuner_dsd, unused by caller */ 576 * FIXME:
577 * u8 *status was an out-parameter of avc_tuner_dsd, unused by caller.
578 * Check for AVC_RESPONSE_ACCEPTED here instead?
579 */
578 if (status) 580 if (status)
579 *status = r->operand[2]; 581 *status = r->operand[2];
580#endif 582#endif
581 return 0; 583 mutex_unlock(&fdtv->avc_mutex);
584
585 if (ret == 0)
586 msleep(500);
587
588 return ret;
582} 589}
583 590
584int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[]) 591int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[])
585{ 592{
586 char buffer[sizeof(struct avc_command_frame)]; 593 struct avc_command_frame *c = (void *)fdtv->avc_data;
587 struct avc_command_frame *c = (void *)buffer; 594 int ret, pos, k;
588 struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
589 int pos, k;
590 595
591 if (pidc > 16 && pidc != 0xff) 596 if (pidc > 16 && pidc != 0xff)
592 return -EINVAL; 597 return -EINVAL;
593 598
594 memset(c, 0, sizeof(*c)); 599 mutex_lock(&fdtv->avc_mutex);
595 600
596 c->ctype = AVC_CTYPE_CONTROL; 601 c->ctype = AVC_CTYPE_CONTROL;
597 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 602 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -614,24 +619,27 @@ int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[])
614 c->operand[pos++] = 0x00; /* tableID */ 619 c->operand[pos++] = 0x00; /* tableID */
615 c->operand[pos++] = 0x00; /* filter_length */ 620 c->operand[pos++] = 0x00; /* filter_length */
616 } 621 }
622 pad_operands(c, pos);
617 623
618 c->length = ALIGN(3 + pos, 4); 624 fdtv->avc_data_length = ALIGN(3 + pos, 4);
625 ret = avc_write(fdtv);
619 626
620 if (avc_write(fdtv, c, r) < 0) 627 /* FIXME: check response code? */
621 return -EIO;
622 628
623 msleep(50); 629 mutex_unlock(&fdtv->avc_mutex);
624 return 0; 630
631 if (ret == 0)
632 msleep(50);
633
634 return ret;
625} 635}
626 636
627int avc_tuner_get_ts(struct firedtv *fdtv) 637int avc_tuner_get_ts(struct firedtv *fdtv)
628{ 638{
629 char buffer[sizeof(struct avc_command_frame)]; 639 struct avc_command_frame *c = (void *)fdtv->avc_data;
630 struct avc_command_frame *c = (void *)buffer; 640 int ret, sl;
631 struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
632 int sl;
633 641
634 memset(c, 0, sizeof(*c)); 642 mutex_lock(&fdtv->avc_mutex);
635 643
636 c->ctype = AVC_CTYPE_CONTROL; 644 c->ctype = AVC_CTYPE_CONTROL;
637 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 645 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -646,26 +654,33 @@ int avc_tuner_get_ts(struct firedtv *fdtv)
646 c->operand[4] = 0x00; /* antenna number */ 654 c->operand[4] = 0x00; /* antenna number */
647 c->operand[5] = 0x0; /* system_specific_search_flags */ 655 c->operand[5] = 0x0; /* system_specific_search_flags */
648 c->operand[6] = sl; /* system_specific_multiplex selection_length */ 656 c->operand[6] = sl; /* system_specific_multiplex selection_length */
649 c->operand[7] = 0x00; /* valid_flags [0] */ 657 /*
650 c->operand[8] = 0x00; /* valid_flags [1] */ 658 * operand[7]: valid_flags[0]
651 c->operand[7 + sl] = 0x00; /* nr_of_dsit_sel_specs (always 0) */ 659 * operand[8]: valid_flags[1]
660 * operand[7 + sl]: nr_of_dsit_sel_specs (always 0)
661 */
662 clear_operands(c, 7, 24);
652 663
653 c->length = fdtv->type == FIREDTV_DVB_T ? 24 : 28; 664 fdtv->avc_data_length = fdtv->type == FIREDTV_DVB_T ? 24 : 28;
665 ret = avc_write(fdtv);
654 666
655 if (avc_write(fdtv, c, r) < 0) 667 /* FIXME: check response code? */
656 return -EIO;
657 668
658 msleep(250); 669 mutex_unlock(&fdtv->avc_mutex);
659 return 0; 670
671 if (ret == 0)
672 msleep(250);
673
674 return ret;
660} 675}
661 676
662int avc_identify_subunit(struct firedtv *fdtv) 677int avc_identify_subunit(struct firedtv *fdtv)
663{ 678{
664 char buffer[sizeof(struct avc_command_frame)]; 679 struct avc_command_frame *c = (void *)fdtv->avc_data;
665 struct avc_command_frame *c = (void *)buffer; 680 struct avc_response_frame *r = (void *)fdtv->avc_data;
666 struct avc_response_frame *r = (void *)buffer; 681 int ret;
667 682
668 memset(c, 0, sizeof(*c)); 683 mutex_lock(&fdtv->avc_mutex);
669 684
670 c->ctype = AVC_CTYPE_CONTROL; 685 c->ctype = AVC_CTYPE_CONTROL;
671 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 686 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -678,31 +693,34 @@ int avc_identify_subunit(struct firedtv *fdtv)
678 c->operand[4] = 0x08; /* length lowbyte */ 693 c->operand[4] = 0x08; /* length lowbyte */
679 c->operand[5] = 0x00; /* offset highbyte */ 694 c->operand[5] = 0x00; /* offset highbyte */
680 c->operand[6] = 0x0d; /* offset lowbyte */ 695 c->operand[6] = 0x0d; /* offset lowbyte */
696 clear_operands(c, 7, 8); /* padding */
681 697
682 c->length = 12; 698 fdtv->avc_data_length = 12;
683 699 ret = avc_write(fdtv);
684 if (avc_write(fdtv, c, r) < 0) 700 if (ret < 0)
685 return -EIO; 701 goto out;
686 702
687 if ((r->response != AVC_RESPONSE_STABLE && 703 if ((r->response != AVC_RESPONSE_STABLE &&
688 r->response != AVC_RESPONSE_ACCEPTED) || 704 r->response != AVC_RESPONSE_ACCEPTED) ||
689 (r->operand[3] << 8) + r->operand[4] != 8) { 705 (r->operand[3] << 8) + r->operand[4] != 8) {
690 dev_err(fdtv->device, "cannot read subunit identifier\n"); 706 dev_err(fdtv->device, "cannot read subunit identifier\n");
691 return -EINVAL; 707 ret = -EINVAL;
692 } 708 }
693 return 0; 709out:
710 mutex_unlock(&fdtv->avc_mutex);
711
712 return ret;
694} 713}
695 714
696#define SIZEOF_ANTENNA_INPUT_INFO 22 715#define SIZEOF_ANTENNA_INPUT_INFO 22
697 716
698int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat) 717int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat)
699{ 718{
700 char buffer[sizeof(struct avc_command_frame)]; 719 struct avc_command_frame *c = (void *)fdtv->avc_data;
701 struct avc_command_frame *c = (void *)buffer; 720 struct avc_response_frame *r = (void *)fdtv->avc_data;
702 struct avc_response_frame *r = (void *)buffer; 721 int length, ret;
703 int length;
704 722
705 memset(c, 0, sizeof(*c)); 723 mutex_lock(&fdtv->avc_mutex);
706 724
707 c->ctype = AVC_CTYPE_CONTROL; 725 c->ctype = AVC_CTYPE_CONTROL;
708 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 726 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -710,27 +728,30 @@ int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat)
710 728
711 c->operand[0] = DESCRIPTOR_TUNER_STATUS; 729 c->operand[0] = DESCRIPTOR_TUNER_STATUS;
712 c->operand[1] = 0xff; /* read_result_status */ 730 c->operand[1] = 0xff; /* read_result_status */
713 c->operand[2] = 0x00; /* reserved */ 731 /*
714 c->operand[3] = 0; /* SIZEOF_ANTENNA_INPUT_INFO >> 8; */ 732 * operand[2]: reserved
715 c->operand[4] = 0; /* SIZEOF_ANTENNA_INPUT_INFO & 0xff; */ 733 * operand[3]: SIZEOF_ANTENNA_INPUT_INFO >> 8
716 c->operand[5] = 0x00; 734 * operand[4]: SIZEOF_ANTENNA_INPUT_INFO & 0xff
717 c->operand[6] = 0x00; 735 */
718 736 clear_operands(c, 2, 31);
719 c->length = 12; 737
720 738 fdtv->avc_data_length = 12;
721 if (avc_write(fdtv, c, r) < 0) 739 ret = avc_write(fdtv);
722 return -EIO; 740 if (ret < 0)
741 goto out;
723 742
724 if (r->response != AVC_RESPONSE_STABLE && 743 if (r->response != AVC_RESPONSE_STABLE &&
725 r->response != AVC_RESPONSE_ACCEPTED) { 744 r->response != AVC_RESPONSE_ACCEPTED) {
726 dev_err(fdtv->device, "cannot read tuner status\n"); 745 dev_err(fdtv->device, "cannot read tuner status\n");
727 return -EINVAL; 746 ret = -EINVAL;
747 goto out;
728 } 748 }
729 749
730 length = r->operand[9]; 750 length = r->operand[9];
731 if (r->operand[1] != 0x10 || length != SIZEOF_ANTENNA_INPUT_INFO) { 751 if (r->operand[1] != 0x10 || length != SIZEOF_ANTENNA_INPUT_INFO) {
732 dev_err(fdtv->device, "got invalid tuner status\n"); 752 dev_err(fdtv->device, "got invalid tuner status\n");
733 return -EINVAL; 753 ret = -EINVAL;
754 goto out;
734 } 755 }
735 756
736 stat->active_system = r->operand[10]; 757 stat->active_system = r->operand[10];
@@ -766,20 +787,21 @@ int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat)
766 stat->ca_dvb_flag = r->operand[31] >> 3 & 1; 787 stat->ca_dvb_flag = r->operand[31] >> 3 & 1;
767 stat->ca_error_flag = r->operand[31] >> 2 & 1; 788 stat->ca_error_flag = r->operand[31] >> 2 & 1;
768 stat->ca_initialization_status = r->operand[31] >> 1 & 1; 789 stat->ca_initialization_status = r->operand[31] >> 1 & 1;
790out:
791 mutex_unlock(&fdtv->avc_mutex);
769 792
770 return 0; 793 return ret;
771} 794}
772 795
773int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst, 796int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst,
774 char conttone, char nrdiseq, 797 char conttone, char nrdiseq,
775 struct dvb_diseqc_master_cmd *diseqcmd) 798 struct dvb_diseqc_master_cmd *diseqcmd)
776{ 799{
777 char buffer[sizeof(struct avc_command_frame)]; 800 struct avc_command_frame *c = (void *)fdtv->avc_data;
778 struct avc_command_frame *c = (void *)buffer; 801 struct avc_response_frame *r = (void *)fdtv->avc_data;
779 struct avc_response_frame *r = (void *)buffer; 802 int pos, j, k, ret;
780 int i, j, k;
781 803
782 memset(c, 0, sizeof(*c)); 804 mutex_lock(&fdtv->avc_mutex);
783 805
784 c->ctype = AVC_CTYPE_CONTROL; 806 c->ctype = AVC_CTYPE_CONTROL;
785 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 807 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -789,41 +811,41 @@ int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst,
789 c->operand[1] = SFE_VENDOR_DE_COMPANYID_1; 811 c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
790 c->operand[2] = SFE_VENDOR_DE_COMPANYID_2; 812 c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
791 c->operand[3] = SFE_VENDOR_OPCODE_LNB_CONTROL; 813 c->operand[3] = SFE_VENDOR_OPCODE_LNB_CONTROL;
792
793 c->operand[4] = voltage; 814 c->operand[4] = voltage;
794 c->operand[5] = nrdiseq; 815 c->operand[5] = nrdiseq;
795 816
796 i = 6; 817 pos = 6;
797
798 for (j = 0; j < nrdiseq; j++) { 818 for (j = 0; j < nrdiseq; j++) {
799 c->operand[i++] = diseqcmd[j].msg_len; 819 c->operand[pos++] = diseqcmd[j].msg_len;
800 820
801 for (k = 0; k < diseqcmd[j].msg_len; k++) 821 for (k = 0; k < diseqcmd[j].msg_len; k++)
802 c->operand[i++] = diseqcmd[j].msg[k]; 822 c->operand[pos++] = diseqcmd[j].msg[k];
803 } 823 }
824 c->operand[pos++] = burst;
825 c->operand[pos++] = conttone;
826 pad_operands(c, pos);
804 827
805 c->operand[i++] = burst; 828 fdtv->avc_data_length = ALIGN(3 + pos, 4);
806 c->operand[i++] = conttone; 829 ret = avc_write(fdtv);
807 830 if (ret < 0)
808 c->length = ALIGN(3 + i, 4); 831 goto out;
809
810 if (avc_write(fdtv, c, r) < 0)
811 return -EIO;
812 832
813 if (r->response != AVC_RESPONSE_ACCEPTED) { 833 if (r->response != AVC_RESPONSE_ACCEPTED) {
814 dev_err(fdtv->device, "LNB control failed\n"); 834 dev_err(fdtv->device, "LNB control failed\n");
815 return -EINVAL; 835 ret = -EINVAL;
816 } 836 }
837out:
838 mutex_unlock(&fdtv->avc_mutex);
817 839
818 return 0; 840 return ret;
819} 841}
820 842
821int avc_register_remote_control(struct firedtv *fdtv) 843int avc_register_remote_control(struct firedtv *fdtv)
822{ 844{
823 char buffer[sizeof(struct avc_command_frame)]; 845 struct avc_command_frame *c = (void *)fdtv->avc_data;
824 struct avc_command_frame *c = (void *)buffer; 846 int ret;
825 847
826 memset(c, 0, sizeof(*c)); 848 mutex_lock(&fdtv->avc_mutex);
827 849
828 c->ctype = AVC_CTYPE_NOTIFY; 850 c->ctype = AVC_CTYPE_NOTIFY;
829 c->subunit = AVC_SUBUNIT_TYPE_UNIT | 7; 851 c->subunit = AVC_SUBUNIT_TYPE_UNIT | 7;
@@ -833,10 +855,16 @@ int avc_register_remote_control(struct firedtv *fdtv)
833 c->operand[1] = SFE_VENDOR_DE_COMPANYID_1; 855 c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
834 c->operand[2] = SFE_VENDOR_DE_COMPANYID_2; 856 c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
835 c->operand[3] = SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL; 857 c->operand[3] = SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL;
858 c->operand[4] = 0; /* padding */
836 859
837 c->length = 8; 860 fdtv->avc_data_length = 8;
861 ret = avc_write(fdtv);
838 862
839 return avc_write(fdtv, c, NULL); 863 /* FIXME: check response code? */
864
865 mutex_unlock(&fdtv->avc_mutex);
866
867 return ret;
840} 868}
841 869
842void avc_remote_ctrl_work(struct work_struct *work) 870void avc_remote_ctrl_work(struct work_struct *work)
@@ -851,11 +879,10 @@ void avc_remote_ctrl_work(struct work_struct *work)
851#if 0 /* FIXME: unused */ 879#if 0 /* FIXME: unused */
852int avc_tuner_host2ca(struct firedtv *fdtv) 880int avc_tuner_host2ca(struct firedtv *fdtv)
853{ 881{
854 char buffer[sizeof(struct avc_command_frame)]; 882 struct avc_command_frame *c = (void *)fdtv->avc_data;
855 struct avc_command_frame *c = (void *)buffer; 883 int ret;
856 struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
857 884
858 memset(c, 0, sizeof(*c)); 885 mutex_lock(&fdtv->avc_mutex);
859 886
860 c->ctype = AVC_CTYPE_CONTROL; 887 c->ctype = AVC_CTYPE_CONTROL;
861 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 888 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -867,15 +894,16 @@ int avc_tuner_host2ca(struct firedtv *fdtv)
867 c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA; 894 c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
868 c->operand[4] = 0; /* slot */ 895 c->operand[4] = 0; /* slot */
869 c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */ 896 c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
870 c->operand[6] = 0; /* more/last */ 897 clear_operands(c, 6, 8);
871 c->operand[7] = 0; /* length */
872 898
873 c->length = 12; 899 fdtv->avc_data_length = 12;
900 ret = avc_write(fdtv);
874 901
875 if (avc_write(fdtv, c, r) < 0) 902 /* FIXME: check response code? */
876 return -EIO;
877 903
878 return 0; 904 mutex_unlock(&fdtv->avc_mutex);
905
906 return ret;
879} 907}
880#endif 908#endif
881 909
@@ -906,12 +934,11 @@ static int get_ca_object_length(struct avc_response_frame *r)
906 934
907int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len) 935int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
908{ 936{
909 char buffer[sizeof(struct avc_command_frame)]; 937 struct avc_command_frame *c = (void *)fdtv->avc_data;
910 struct avc_command_frame *c = (void *)buffer; 938 struct avc_response_frame *r = (void *)fdtv->avc_data;
911 struct avc_response_frame *r = (void *)buffer; 939 int pos, ret;
912 int pos;
913 940
914 memset(c, 0, sizeof(*c)); 941 mutex_lock(&fdtv->avc_mutex);
915 942
916 c->ctype = AVC_CTYPE_STATUS; 943 c->ctype = AVC_CTYPE_STATUS;
917 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 944 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -923,11 +950,12 @@ int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
923 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST; 950 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
924 c->operand[4] = 0; /* slot */ 951 c->operand[4] = 0; /* slot */
925 c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */ 952 c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
953 clear_operands(c, 6, LAST_OPERAND);
926 954
927 c->length = 12; 955 fdtv->avc_data_length = 12;
928 956 ret = avc_write(fdtv);
929 if (avc_write(fdtv, c, r) < 0) 957 if (ret < 0)
930 return -EIO; 958 goto out;
931 959
932 /* FIXME: check response code and validate response data */ 960 /* FIXME: check response code and validate response data */
933 961
@@ -939,18 +967,19 @@ int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
939 app_info[4] = 0x01; 967 app_info[4] = 0x01;
940 memcpy(&app_info[5], &r->operand[pos], 5 + r->operand[pos + 4]); 968 memcpy(&app_info[5], &r->operand[pos], 5 + r->operand[pos + 4]);
941 *len = app_info[3] + 4; 969 *len = app_info[3] + 4;
970out:
971 mutex_unlock(&fdtv->avc_mutex);
942 972
943 return 0; 973 return ret;
944} 974}
945 975
946int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len) 976int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
947{ 977{
948 char buffer[sizeof(struct avc_command_frame)]; 978 struct avc_command_frame *c = (void *)fdtv->avc_data;
949 struct avc_command_frame *c = (void *)buffer; 979 struct avc_response_frame *r = (void *)fdtv->avc_data;
950 struct avc_response_frame *r = (void *)buffer; 980 int pos, ret;
951 int pos;
952 981
953 memset(c, 0, sizeof(*c)); 982 mutex_lock(&fdtv->avc_mutex);
954 983
955 c->ctype = AVC_CTYPE_STATUS; 984 c->ctype = AVC_CTYPE_STATUS;
956 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 985 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -962,11 +991,14 @@ int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
962 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST; 991 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
963 c->operand[4] = 0; /* slot */ 992 c->operand[4] = 0; /* slot */
964 c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */ 993 c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
994 clear_operands(c, 6, LAST_OPERAND);
965 995
966 c->length = 12; 996 fdtv->avc_data_length = 12;
997 ret = avc_write(fdtv);
998 if (ret < 0)
999 goto out;
967 1000
968 if (avc_write(fdtv, c, r) < 0) 1001 /* FIXME: check response code and validate response data */
969 return -EIO;
970 1002
971 pos = get_ca_object_pos(r); 1003 pos = get_ca_object_pos(r);
972 app_info[0] = (EN50221_TAG_CA_INFO >> 16) & 0xff; 1004 app_info[0] = (EN50221_TAG_CA_INFO >> 16) & 0xff;
@@ -976,17 +1008,18 @@ int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
976 app_info[4] = r->operand[pos + 0]; 1008 app_info[4] = r->operand[pos + 0];
977 app_info[5] = r->operand[pos + 1]; 1009 app_info[5] = r->operand[pos + 1];
978 *len = app_info[3] + 4; 1010 *len = app_info[3] + 4;
1011out:
1012 mutex_unlock(&fdtv->avc_mutex);
979 1013
980 return 0; 1014 return ret;
981} 1015}
982 1016
983int avc_ca_reset(struct firedtv *fdtv) 1017int avc_ca_reset(struct firedtv *fdtv)
984{ 1018{
985 char buffer[sizeof(struct avc_command_frame)]; 1019 struct avc_command_frame *c = (void *)fdtv->avc_data;
986 struct avc_command_frame *c = (void *)buffer; 1020 int ret;
987 struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
988 1021
989 memset(c, 0, sizeof(*c)); 1022 mutex_lock(&fdtv->avc_mutex);
990 1023
991 c->ctype = AVC_CTYPE_CONTROL; 1024 c->ctype = AVC_CTYPE_CONTROL;
992 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 1025 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -1002,19 +1035,20 @@ int avc_ca_reset(struct firedtv *fdtv)
1002 c->operand[7] = 1; /* length */ 1035 c->operand[7] = 1; /* length */
1003 c->operand[8] = 0; /* force hardware reset */ 1036 c->operand[8] = 0; /* force hardware reset */
1004 1037
1005 c->length = 12; 1038 fdtv->avc_data_length = 12;
1039 ret = avc_write(fdtv);
1006 1040
1007 if (avc_write(fdtv, c, r) < 0) 1041 /* FIXME: check response code? */
1008 return -EIO;
1009 1042
1010 return 0; 1043 mutex_unlock(&fdtv->avc_mutex);
1044
1045 return ret;
1011} 1046}
1012 1047
1013int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length) 1048int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
1014{ 1049{
1015 char buffer[sizeof(struct avc_command_frame)]; 1050 struct avc_command_frame *c = (void *)fdtv->avc_data;
1016 struct avc_command_frame *c = (void *)buffer; 1051 struct avc_response_frame *r = (void *)fdtv->avc_data;
1017 struct avc_response_frame *r = (void *)buffer;
1018 int list_management; 1052 int list_management;
1019 int program_info_length; 1053 int program_info_length;
1020 int pmt_cmd_id; 1054 int pmt_cmd_id;
@@ -1022,11 +1056,12 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
1022 int write_pos; 1056 int write_pos;
1023 int es_info_length; 1057 int es_info_length;
1024 int crc32_csum; 1058 int crc32_csum;
1059 int ret;
1025 1060
1026 if (unlikely(avc_debug & AVC_DEBUG_APPLICATION_PMT)) 1061 if (unlikely(avc_debug & AVC_DEBUG_APPLICATION_PMT))
1027 debug_pmt(msg, length); 1062 debug_pmt(msg, length);
1028 1063
1029 memset(c, 0, sizeof(*c)); 1064 mutex_lock(&fdtv->avc_mutex);
1030 1065
1031 c->ctype = AVC_CTYPE_CONTROL; 1066 c->ctype = AVC_CTYPE_CONTROL;
1032 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 1067 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -1058,7 +1093,7 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
1058 1093
1059 c->operand[12] = 0x02; /* Table id=2 */ 1094 c->operand[12] = 0x02; /* Table id=2 */
1060 c->operand[13] = 0x80; /* Section syntax + length */ 1095 c->operand[13] = 0x80; /* Section syntax + length */
1061 /* c->operand[14] = XXXprogram_info_length + 12; */ 1096
1062 c->operand[15] = msg[1]; /* Program number */ 1097 c->operand[15] = msg[1]; /* Program number */
1063 c->operand[16] = msg[2]; 1098 c->operand[16] = msg[2];
1064 c->operand[17] = 0x01; /* Version number=0 + current/next=1 */ 1099 c->operand[17] = 0x01; /* Version number=0 + current/next=1 */
@@ -1106,12 +1141,7 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
1106 write_pos += es_info_length; 1141 write_pos += es_info_length;
1107 } 1142 }
1108 } 1143 }
1109 1144 write_pos += 4; /* CRC */
1110 /* CRC */
1111 c->operand[write_pos++] = 0x00;
1112 c->operand[write_pos++] = 0x00;
1113 c->operand[write_pos++] = 0x00;
1114 c->operand[write_pos++] = 0x00;
1115 1145
1116 c->operand[7] = 0x82; 1146 c->operand[7] = 0x82;
1117 c->operand[8] = (write_pos - 10) >> 8; 1147 c->operand[8] = (write_pos - 10) >> 8;
@@ -1123,28 +1153,31 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
1123 c->operand[write_pos - 3] = (crc32_csum >> 16) & 0xff; 1153 c->operand[write_pos - 3] = (crc32_csum >> 16) & 0xff;
1124 c->operand[write_pos - 2] = (crc32_csum >> 8) & 0xff; 1154 c->operand[write_pos - 2] = (crc32_csum >> 8) & 0xff;
1125 c->operand[write_pos - 1] = (crc32_csum >> 0) & 0xff; 1155 c->operand[write_pos - 1] = (crc32_csum >> 0) & 0xff;
1156 pad_operands(c, write_pos);
1126 1157
1127 c->length = ALIGN(3 + write_pos, 4); 1158 fdtv->avc_data_length = ALIGN(3 + write_pos, 4);
1128 1159 ret = avc_write(fdtv);
1129 if (avc_write(fdtv, c, r) < 0) 1160 if (ret < 0)
1130 return -EIO; 1161 goto out;
1131 1162
1132 if (r->response != AVC_RESPONSE_ACCEPTED) { 1163 if (r->response != AVC_RESPONSE_ACCEPTED) {
1133 dev_err(fdtv->device, 1164 dev_err(fdtv->device,
1134 "CA PMT failed with response 0x%x\n", r->response); 1165 "CA PMT failed with response 0x%x\n", r->response);
1135 return -EFAULT; 1166 ret = -EFAULT;
1136 } 1167 }
1168out:
1169 mutex_unlock(&fdtv->avc_mutex);
1137 1170
1138 return 0; 1171 return ret;
1139} 1172}
1140 1173
1141int avc_ca_get_time_date(struct firedtv *fdtv, int *interval) 1174int avc_ca_get_time_date(struct firedtv *fdtv, int *interval)
1142{ 1175{
1143 char buffer[sizeof(struct avc_command_frame)]; 1176 struct avc_command_frame *c = (void *)fdtv->avc_data;
1144 struct avc_command_frame *c = (void *)buffer; 1177 struct avc_response_frame *r = (void *)fdtv->avc_data;
1145 struct avc_response_frame *r = (void *)buffer; 1178 int ret;
1146 1179
1147 memset(c, 0, sizeof(*c)); 1180 mutex_lock(&fdtv->avc_mutex);
1148 1181
1149 c->ctype = AVC_CTYPE_STATUS; 1182 c->ctype = AVC_CTYPE_STATUS;
1150 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 1183 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -1156,28 +1189,28 @@ int avc_ca_get_time_date(struct firedtv *fdtv, int *interval)
1156 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST; 1189 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
1157 c->operand[4] = 0; /* slot */ 1190 c->operand[4] = 0; /* slot */
1158 c->operand[5] = SFE_VENDOR_TAG_CA_DATE_TIME; /* ca tag */ 1191 c->operand[5] = SFE_VENDOR_TAG_CA_DATE_TIME; /* ca tag */
1159 c->operand[6] = 0; /* more/last */ 1192 clear_operands(c, 6, LAST_OPERAND);
1160 c->operand[7] = 0; /* length */
1161
1162 c->length = 12;
1163 1193
1164 if (avc_write(fdtv, c, r) < 0) 1194 fdtv->avc_data_length = 12;
1165 return -EIO; 1195 ret = avc_write(fdtv);
1196 if (ret < 0)
1197 goto out;
1166 1198
1167 /* FIXME: check response code and validate response data */ 1199 /* FIXME: check response code and validate response data */
1168 1200
1169 *interval = r->operand[get_ca_object_pos(r)]; 1201 *interval = r->operand[get_ca_object_pos(r)];
1202out:
1203 mutex_unlock(&fdtv->avc_mutex);
1170 1204
1171 return 0; 1205 return ret;
1172} 1206}
1173 1207
1174int avc_ca_enter_menu(struct firedtv *fdtv) 1208int avc_ca_enter_menu(struct firedtv *fdtv)
1175{ 1209{
1176 char buffer[sizeof(struct avc_command_frame)]; 1210 struct avc_command_frame *c = (void *)fdtv->avc_data;
1177 struct avc_command_frame *c = (void *)buffer; 1211 int ret;
1178 struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
1179 1212
1180 memset(c, 0, sizeof(*c)); 1213 mutex_lock(&fdtv->avc_mutex);
1181 1214
1182 c->ctype = AVC_CTYPE_STATUS; 1215 c->ctype = AVC_CTYPE_STATUS;
1183 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 1216 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -1189,24 +1222,25 @@ int avc_ca_enter_menu(struct firedtv *fdtv)
1189 c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA; 1222 c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
1190 c->operand[4] = 0; /* slot */ 1223 c->operand[4] = 0; /* slot */
1191 c->operand[5] = SFE_VENDOR_TAG_CA_ENTER_MENU; 1224 c->operand[5] = SFE_VENDOR_TAG_CA_ENTER_MENU;
1192 c->operand[6] = 0; /* more/last */ 1225 clear_operands(c, 6, 8);
1193 c->operand[7] = 0; /* length */
1194 1226
1195 c->length = 12; 1227 fdtv->avc_data_length = 12;
1228 ret = avc_write(fdtv);
1196 1229
1197 if (avc_write(fdtv, c, r) < 0) 1230 /* FIXME: check response code? */
1198 return -EIO;
1199 1231
1200 return 0; 1232 mutex_unlock(&fdtv->avc_mutex);
1233
1234 return ret;
1201} 1235}
1202 1236
1203int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len) 1237int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len)
1204{ 1238{
1205 char buffer[sizeof(struct avc_command_frame)]; 1239 struct avc_command_frame *c = (void *)fdtv->avc_data;
1206 struct avc_command_frame *c = (void *)buffer; 1240 struct avc_response_frame *r = (void *)fdtv->avc_data;
1207 struct avc_response_frame *r = (void *)buffer; 1241 int ret;
1208 1242
1209 memset(c, 0, sizeof(*c)); 1243 mutex_lock(&fdtv->avc_mutex);
1210 1244
1211 c->ctype = AVC_CTYPE_STATUS; 1245 c->ctype = AVC_CTYPE_STATUS;
1212 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit; 1246 c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
@@ -1218,51 +1252,57 @@ int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len)
1218 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST; 1252 c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
1219 c->operand[4] = 0; /* slot */ 1253 c->operand[4] = 0; /* slot */
1220 c->operand[5] = SFE_VENDOR_TAG_CA_MMI; 1254 c->operand[5] = SFE_VENDOR_TAG_CA_MMI;
1221 c->operand[6] = 0; /* more/last */ 1255 clear_operands(c, 6, LAST_OPERAND);
1222 c->operand[7] = 0; /* length */
1223 1256
1224 c->length = 12; 1257 fdtv->avc_data_length = 12;
1225 1258 ret = avc_write(fdtv);
1226 if (avc_write(fdtv, c, r) < 0) 1259 if (ret < 0)
1227 return -EIO; 1260 goto out;
1228 1261
1229 /* FIXME: check response code and validate response data */ 1262 /* FIXME: check response code and validate response data */
1230 1263
1231 *len = get_ca_object_length(r); 1264 *len = get_ca_object_length(r);
1232 memcpy(mmi_object, &r->operand[get_ca_object_pos(r)], *len); 1265 memcpy(mmi_object, &r->operand[get_ca_object_pos(r)], *len);
1266out:
1267 mutex_unlock(&fdtv->avc_mutex);
1233 1268
1234 return 0; 1269 return ret;
1235} 1270}
1236 1271
1237#define CMP_OUTPUT_PLUG_CONTROL_REG_0 0xfffff0000904ULL 1272#define CMP_OUTPUT_PLUG_CONTROL_REG_0 0xfffff0000904ULL
1238 1273
1239static int cmp_read(struct firedtv *fdtv, void *buf, u64 addr, size_t len) 1274static int cmp_read(struct firedtv *fdtv, u64 addr, __be32 *data)
1240{ 1275{
1241 int ret; 1276 int ret;
1242 1277
1243 if (mutex_lock_interruptible(&fdtv->avc_mutex)) 1278 mutex_lock(&fdtv->avc_mutex);
1244 return -EINTR;
1245 1279
1246 ret = fdtv->backend->read(fdtv, addr, buf, len); 1280 ret = fdtv->backend->read(fdtv, addr, data);
1247 if (ret < 0) 1281 if (ret < 0)
1248 dev_err(fdtv->device, "CMP: read I/O error\n"); 1282 dev_err(fdtv->device, "CMP: read I/O error\n");
1249 1283
1250 mutex_unlock(&fdtv->avc_mutex); 1284 mutex_unlock(&fdtv->avc_mutex);
1285
1251 return ret; 1286 return ret;
1252} 1287}
1253 1288
1254static int cmp_lock(struct firedtv *fdtv, void *data, u64 addr, __be32 arg) 1289static int cmp_lock(struct firedtv *fdtv, u64 addr, __be32 data[])
1255{ 1290{
1256 int ret; 1291 int ret;
1257 1292
1258 if (mutex_lock_interruptible(&fdtv->avc_mutex)) 1293 mutex_lock(&fdtv->avc_mutex);
1259 return -EINTR; 1294
1295 /* data[] is stack-allocated and should not be DMA-mapped. */
1296 memcpy(fdtv->avc_data, data, 8);
1260 1297
1261 ret = fdtv->backend->lock(fdtv, addr, data, arg); 1298 ret = fdtv->backend->lock(fdtv, addr, fdtv->avc_data);
1262 if (ret < 0) 1299 if (ret < 0)
1263 dev_err(fdtv->device, "CMP: lock I/O error\n"); 1300 dev_err(fdtv->device, "CMP: lock I/O error\n");
1301 else
1302 memcpy(data, fdtv->avc_data, 8);
1264 1303
1265 mutex_unlock(&fdtv->avc_mutex); 1304 mutex_unlock(&fdtv->avc_mutex);
1305
1266 return ret; 1306 return ret;
1267} 1307}
1268 1308
@@ -1288,25 +1328,25 @@ static inline void set_opcr(__be32 *opcr, u32 value, u32 mask, u32 shift)
1288 1328
1289int cmp_establish_pp_connection(struct firedtv *fdtv, int plug, int channel) 1329int cmp_establish_pp_connection(struct firedtv *fdtv, int plug, int channel)
1290{ 1330{
1291 __be32 old_opcr, opcr; 1331 __be32 old_opcr, opcr[2];
1292 u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2); 1332 u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2);
1293 int attempts = 0; 1333 int attempts = 0;
1294 int ret; 1334 int ret;
1295 1335
1296 ret = cmp_read(fdtv, &opcr, opcr_address, 4); 1336 ret = cmp_read(fdtv, opcr_address, opcr);
1297 if (ret < 0) 1337 if (ret < 0)
1298 return ret; 1338 return ret;
1299 1339
1300repeat: 1340repeat:
1301 if (!get_opcr_online(opcr)) { 1341 if (!get_opcr_online(*opcr)) {
1302 dev_err(fdtv->device, "CMP: output offline\n"); 1342 dev_err(fdtv->device, "CMP: output offline\n");
1303 return -EBUSY; 1343 return -EBUSY;
1304 } 1344 }
1305 1345
1306 old_opcr = opcr; 1346 old_opcr = *opcr;
1307 1347
1308 if (get_opcr_p2p_connections(opcr)) { 1348 if (get_opcr_p2p_connections(*opcr)) {
1309 if (get_opcr_channel(opcr) != channel) { 1349 if (get_opcr_channel(*opcr) != channel) {
1310 dev_err(fdtv->device, "CMP: cannot change channel\n"); 1350 dev_err(fdtv->device, "CMP: cannot change channel\n");
1311 return -EBUSY; 1351 return -EBUSY;
1312 } 1352 }
@@ -1314,11 +1354,11 @@ repeat:
1314 1354
1315 /* We don't allocate isochronous resources. */ 1355 /* We don't allocate isochronous resources. */
1316 } else { 1356 } else {
1317 set_opcr_channel(&opcr, channel); 1357 set_opcr_channel(opcr, channel);
1318 set_opcr_data_rate(&opcr, 2); /* S400 */ 1358 set_opcr_data_rate(opcr, 2); /* S400 */
1319 1359
1320 /* FIXME: this is for the worst case - optimize */ 1360 /* FIXME: this is for the worst case - optimize */
1321 set_opcr_overhead_id(&opcr, 0); 1361 set_opcr_overhead_id(opcr, 0);
1322 1362
1323 /* 1363 /*
1324 * FIXME: allocate isochronous channel and bandwidth at IRM 1364 * FIXME: allocate isochronous channel and bandwidth at IRM
@@ -1326,13 +1366,16 @@ repeat:
1326 */ 1366 */
1327 } 1367 }
1328 1368
1329 set_opcr_p2p_connections(&opcr, get_opcr_p2p_connections(opcr) + 1); 1369 set_opcr_p2p_connections(opcr, get_opcr_p2p_connections(*opcr) + 1);
1330 1370
1331 ret = cmp_lock(fdtv, &opcr, opcr_address, old_opcr); 1371 opcr[1] = *opcr;
1372 opcr[0] = old_opcr;
1373
1374 ret = cmp_lock(fdtv, opcr_address, opcr);
1332 if (ret < 0) 1375 if (ret < 0)
1333 return ret; 1376 return ret;
1334 1377
1335 if (old_opcr != opcr) { 1378 if (old_opcr != *opcr) {
1336 /* 1379 /*
1337 * FIXME: if old_opcr.P2P_Connections > 0, 1380 * FIXME: if old_opcr.P2P_Connections > 0,
1338 * deallocate isochronous channel and bandwidth at IRM 1381 * deallocate isochronous channel and bandwidth at IRM
@@ -1350,27 +1393,30 @@ repeat:
1350 1393
1351void cmp_break_pp_connection(struct firedtv *fdtv, int plug, int channel) 1394void cmp_break_pp_connection(struct firedtv *fdtv, int plug, int channel)
1352{ 1395{
1353 __be32 old_opcr, opcr; 1396 __be32 old_opcr, opcr[2];
1354 u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2); 1397 u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2);
1355 int attempts = 0; 1398 int attempts = 0;
1356 1399
1357 if (cmp_read(fdtv, &opcr, opcr_address, 4) < 0) 1400 if (cmp_read(fdtv, opcr_address, opcr) < 0)
1358 return; 1401 return;
1359 1402
1360repeat: 1403repeat:
1361 if (!get_opcr_online(opcr) || !get_opcr_p2p_connections(opcr) || 1404 if (!get_opcr_online(*opcr) || !get_opcr_p2p_connections(*opcr) ||
1362 get_opcr_channel(opcr) != channel) { 1405 get_opcr_channel(*opcr) != channel) {
1363 dev_err(fdtv->device, "CMP: no connection to break\n"); 1406 dev_err(fdtv->device, "CMP: no connection to break\n");
1364 return; 1407 return;
1365 } 1408 }
1366 1409
1367 old_opcr = opcr; 1410 old_opcr = *opcr;
1368 set_opcr_p2p_connections(&opcr, get_opcr_p2p_connections(opcr) - 1); 1411 set_opcr_p2p_connections(opcr, get_opcr_p2p_connections(*opcr) - 1);
1412
1413 opcr[1] = *opcr;
1414 opcr[0] = old_opcr;
1369 1415
1370 if (cmp_lock(fdtv, &opcr, opcr_address, old_opcr) < 0) 1416 if (cmp_lock(fdtv, opcr_address, opcr) < 0)
1371 return; 1417 return;
1372 1418
1373 if (old_opcr != opcr) { 1419 if (old_opcr != *opcr) {
1374 /* 1420 /*
1375 * FIXME: if old_opcr.P2P_Connections == 1, i.e. we were last 1421 * FIXME: if old_opcr.P2P_Connections == 1, i.e. we were last
1376 * owner, deallocate isochronous channel and bandwidth at IRM 1422 * owner, deallocate isochronous channel and bandwidth at IRM
diff --git a/drivers/media/dvb/firewire/firedtv-dvb.c b/drivers/media/dvb/firewire/firedtv-dvb.c
index 5742fde79d99..079e8c5b0475 100644
--- a/drivers/media/dvb/firewire/firedtv-dvb.c
+++ b/drivers/media/dvb/firewire/firedtv-dvb.c
@@ -277,7 +277,6 @@ struct firedtv *fdtv_alloc(struct device *dev,
277 277
278 mutex_init(&fdtv->avc_mutex); 278 mutex_init(&fdtv->avc_mutex);
279 init_waitqueue_head(&fdtv->avc_wait); 279 init_waitqueue_head(&fdtv->avc_wait);
280 fdtv->avc_reply_received = true;
281 mutex_init(&fdtv->demux_mutex); 280 mutex_init(&fdtv->demux_mutex);
282 INIT_WORK(&fdtv->remote_ctrl_work, avc_remote_ctrl_work); 281 INIT_WORK(&fdtv->remote_ctrl_work, avc_remote_ctrl_work);
283 282
@@ -297,7 +296,7 @@ struct firedtv *fdtv_alloc(struct device *dev,
297#define AVC_UNIT_SPEC_ID_ENTRY 0x00a02d 296#define AVC_UNIT_SPEC_ID_ENTRY 0x00a02d
298#define AVC_SW_VERSION_ENTRY 0x010001 297#define AVC_SW_VERSION_ENTRY 0x010001
299 298
300static struct ieee1394_device_id fdtv_id_table[] = { 299const struct ieee1394_device_id fdtv_id_table[] = {
301 { 300 {
302 /* FloppyDTV S/CI and FloppyDTV S2 */ 301 /* FloppyDTV S/CI and FloppyDTV S2 */
303 .match_flags = MATCH_FLAGS, 302 .match_flags = MATCH_FLAGS,
@@ -346,12 +345,23 @@ MODULE_DEVICE_TABLE(ieee1394, fdtv_id_table);
346 345
347static int __init fdtv_init(void) 346static int __init fdtv_init(void)
348{ 347{
349 return fdtv_1394_init(fdtv_id_table); 348 int ret;
349
350 ret = fdtv_fw_init();
351 if (ret < 0)
352 return ret;
353
354 ret = fdtv_1394_init();
355 if (ret < 0)
356 fdtv_fw_exit();
357
358 return ret;
350} 359}
351 360
352static void __exit fdtv_exit(void) 361static void __exit fdtv_exit(void)
353{ 362{
354 fdtv_1394_exit(); 363 fdtv_1394_exit();
364 fdtv_fw_exit();
355} 365}
356 366
357module_init(fdtv_init); 367module_init(fdtv_init);
diff --git a/drivers/media/dvb/firewire/firedtv-fw.c b/drivers/media/dvb/firewire/firedtv-fw.c
new file mode 100644
index 000000000000..75afe4f81e33
--- /dev/null
+++ b/drivers/media/dvb/firewire/firedtv-fw.c
@@ -0,0 +1,339 @@
1/*
2 * FireDTV driver -- firewire I/O backend
3 */
4
5#include <linux/device.h>
6#include <linux/errno.h>
7#include <linux/firewire.h>
8#include <linux/firewire-constants.h>
9#include <linux/kernel.h>
10#include <linux/list.h>
11#include <linux/mm.h>
12#include <linux/slab.h>
13#include <linux/spinlock.h>
14#include <linux/types.h>
15
16#include <asm/page.h>
17
18#include <dvb_demux.h>
19
20#include "firedtv.h"
21
22static LIST_HEAD(node_list);
23static DEFINE_SPINLOCK(node_list_lock);
24
25static inline struct fw_device *device_of(struct firedtv *fdtv)
26{
27 return fw_device(fdtv->device->parent);
28}
29
30static int node_req(struct firedtv *fdtv, u64 addr, void *data, size_t len,
31 int tcode)
32{
33 struct fw_device *device = device_of(fdtv);
34 int rcode, generation = device->generation;
35
36 smp_rmb(); /* node_id vs. generation */
37
38 rcode = fw_run_transaction(device->card, tcode, device->node_id,
39 generation, device->max_speed, addr, data, len);
40
41 return rcode != RCODE_COMPLETE ? -EIO : 0;
42}
43
44static int node_lock(struct firedtv *fdtv, u64 addr, void *data)
45{
46 return node_req(fdtv, addr, data, 8, TCODE_LOCK_COMPARE_SWAP);
47}
48
49static int node_read(struct firedtv *fdtv, u64 addr, void *data)
50{
51 return node_req(fdtv, addr, data, 4, TCODE_READ_QUADLET_REQUEST);
52}
53
54static int node_write(struct firedtv *fdtv, u64 addr, void *data, size_t len)
55{
56 return node_req(fdtv, addr, data, len, TCODE_WRITE_BLOCK_REQUEST);
57}
58
59#define ISO_HEADER_SIZE 4
60#define CIP_HEADER_SIZE 8
61#define MPEG2_TS_HEADER_SIZE 4
62#define MPEG2_TS_SOURCE_PACKET_SIZE (4 + 188)
63
64#define MAX_PACKET_SIZE 1024 /* 776, rounded up to 2^n */
65#define PACKETS_PER_PAGE (PAGE_SIZE / MAX_PACKET_SIZE)
66#define N_PACKETS 64 /* buffer size */
67#define N_PAGES DIV_ROUND_UP(N_PACKETS, PACKETS_PER_PAGE)
68#define IRQ_INTERVAL 16
69
70struct firedtv_receive_context {
71 struct fw_iso_context *context;
72 struct fw_iso_buffer buffer;
73 int interrupt_packet;
74 int current_packet;
75 char *pages[N_PAGES];
76};
77
78static int queue_iso(struct firedtv_receive_context *ctx, int index)
79{
80 struct fw_iso_packet p;
81
82 p.payload_length = MAX_PACKET_SIZE;
83 p.interrupt = !(++ctx->interrupt_packet & (IRQ_INTERVAL - 1));
84 p.skip = 0;
85 p.header_length = ISO_HEADER_SIZE;
86
87 return fw_iso_context_queue(ctx->context, &p, &ctx->buffer,
88 index * MAX_PACKET_SIZE);
89}
90
91static void handle_iso(struct fw_iso_context *context, u32 cycle,
92 size_t header_length, void *header, void *data)
93{
94 struct firedtv *fdtv = data;
95 struct firedtv_receive_context *ctx = fdtv->backend_data;
96 __be32 *h, *h_end;
97 int length, err, i = ctx->current_packet;
98 char *p, *p_end;
99
100 for (h = header, h_end = h + header_length / 4; h < h_end; h++) {
101 length = be32_to_cpup(h) >> 16;
102 if (unlikely(length > MAX_PACKET_SIZE)) {
103 dev_err(fdtv->device, "length = %d\n", length);
104 length = MAX_PACKET_SIZE;
105 }
106
107 p = ctx->pages[i / PACKETS_PER_PAGE]
108 + (i % PACKETS_PER_PAGE) * MAX_PACKET_SIZE;
109 p_end = p + length;
110
111 for (p += CIP_HEADER_SIZE + MPEG2_TS_HEADER_SIZE; p < p_end;
112 p += MPEG2_TS_SOURCE_PACKET_SIZE)
113 dvb_dmx_swfilter_packets(&fdtv->demux, p, 1);
114
115 err = queue_iso(ctx, i);
116 if (unlikely(err))
117 dev_err(fdtv->device, "requeue failed\n");
118
119 i = (i + 1) & (N_PACKETS - 1);
120 }
121 ctx->current_packet = i;
122}
123
124static int start_iso(struct firedtv *fdtv)
125{
126 struct firedtv_receive_context *ctx;
127 struct fw_device *device = device_of(fdtv);
128 int i, err;
129
130 ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
131 if (!ctx)
132 return -ENOMEM;
133
134 ctx->context = fw_iso_context_create(device->card,
135 FW_ISO_CONTEXT_RECEIVE, fdtv->isochannel,
136 device->max_speed, ISO_HEADER_SIZE, handle_iso, fdtv);
137 if (IS_ERR(ctx->context)) {
138 err = PTR_ERR(ctx->context);
139 goto fail_free;
140 }
141
142 err = fw_iso_buffer_init(&ctx->buffer, device->card,
143 N_PAGES, DMA_FROM_DEVICE);
144 if (err)
145 goto fail_context_destroy;
146
147 ctx->interrupt_packet = 0;
148 ctx->current_packet = 0;
149
150 for (i = 0; i < N_PAGES; i++)
151 ctx->pages[i] = page_address(ctx->buffer.pages[i]);
152
153 for (i = 0; i < N_PACKETS; i++) {
154 err = queue_iso(ctx, i);
155 if (err)
156 goto fail;
157 }
158
159 err = fw_iso_context_start(ctx->context, -1, 0,
160 FW_ISO_CONTEXT_MATCH_ALL_TAGS);
161 if (err)
162 goto fail;
163
164 fdtv->backend_data = ctx;
165
166 return 0;
167fail:
168 fw_iso_buffer_destroy(&ctx->buffer, device->card);
169fail_context_destroy:
170 fw_iso_context_destroy(ctx->context);
171fail_free:
172 kfree(ctx);
173
174 return err;
175}
176
177static void stop_iso(struct firedtv *fdtv)
178{
179 struct firedtv_receive_context *ctx = fdtv->backend_data;
180
181 fw_iso_context_stop(ctx->context);
182 fw_iso_buffer_destroy(&ctx->buffer, device_of(fdtv)->card);
183 fw_iso_context_destroy(ctx->context);
184 kfree(ctx);
185}
186
187static const struct firedtv_backend backend = {
188 .lock = node_lock,
189 .read = node_read,
190 .write = node_write,
191 .start_iso = start_iso,
192 .stop_iso = stop_iso,
193};
194
195static void handle_fcp(struct fw_card *card, struct fw_request *request,
196 int tcode, int destination, int source, int generation,
197 int speed, unsigned long long offset,
198 void *payload, size_t length, void *callback_data)
199{
200 struct firedtv *f, *fdtv = NULL;
201 struct fw_device *device;
202 unsigned long flags;
203 int su;
204
205 if (length < 2 || (((u8 *)payload)[0] & 0xf0) != 0)
206 return;
207
208 su = ((u8 *)payload)[1] & 0x7;
209
210 spin_lock_irqsave(&node_list_lock, flags);
211 list_for_each_entry(f, &node_list, list) {
212 device = device_of(f);
213 if (device->generation != generation)
214 continue;
215
216 smp_rmb(); /* node_id vs. generation */
217
218 if (device->card == card &&
219 device->node_id == source &&
220 (f->subunit == su || (f->subunit == 0 && su == 0x7))) {
221 fdtv = f;
222 break;
223 }
224 }
225 spin_unlock_irqrestore(&node_list_lock, flags);
226
227 if (fdtv)
228 avc_recv(fdtv, payload, length);
229}
230
231static struct fw_address_handler fcp_handler = {
232 .length = CSR_FCP_END - CSR_FCP_RESPONSE,
233 .address_callback = handle_fcp,
234};
235
236static const struct fw_address_region fcp_region = {
237 .start = CSR_REGISTER_BASE + CSR_FCP_RESPONSE,
238 .end = CSR_REGISTER_BASE + CSR_FCP_END,
239};
240
241/* Adjust the template string if models with longer names appear. */
242#define MAX_MODEL_NAME_LEN sizeof("FireDTV ????")
243
244static int node_probe(struct device *dev)
245{
246 struct firedtv *fdtv;
247 char name[MAX_MODEL_NAME_LEN];
248 int name_len, err;
249
250 name_len = fw_csr_string(fw_unit(dev)->directory, CSR_MODEL,
251 name, sizeof(name));
252
253 fdtv = fdtv_alloc(dev, &backend, name, name_len >= 0 ? name_len : 0);
254 if (!fdtv)
255 return -ENOMEM;
256
257 err = fdtv_register_rc(fdtv, dev);
258 if (err)
259 goto fail_free;
260
261 spin_lock_irq(&node_list_lock);
262 list_add_tail(&fdtv->list, &node_list);
263 spin_unlock_irq(&node_list_lock);
264
265 err = avc_identify_subunit(fdtv);
266 if (err)
267 goto fail;
268
269 err = fdtv_dvb_register(fdtv);
270 if (err)
271 goto fail;
272
273 avc_register_remote_control(fdtv);
274
275 return 0;
276fail:
277 spin_lock_irq(&node_list_lock);
278 list_del(&fdtv->list);
279 spin_unlock_irq(&node_list_lock);
280 fdtv_unregister_rc(fdtv);
281fail_free:
282 kfree(fdtv);
283
284 return err;
285}
286
287static int node_remove(struct device *dev)
288{
289 struct firedtv *fdtv = dev_get_drvdata(dev);
290
291 fdtv_dvb_unregister(fdtv);
292
293 spin_lock_irq(&node_list_lock);
294 list_del(&fdtv->list);
295 spin_unlock_irq(&node_list_lock);
296
297 fdtv_unregister_rc(fdtv);
298
299 kfree(fdtv);
300 return 0;
301}
302
303static void node_update(struct fw_unit *unit)
304{
305 struct firedtv *fdtv = dev_get_drvdata(&unit->device);
306
307 if (fdtv->isochannel >= 0)
308 cmp_establish_pp_connection(fdtv, fdtv->subunit,
309 fdtv->isochannel);
310}
311
312static struct fw_driver fdtv_driver = {
313 .driver = {
314 .owner = THIS_MODULE,
315 .name = "firedtv",
316 .bus = &fw_bus_type,
317 .probe = node_probe,
318 .remove = node_remove,
319 },
320 .update = node_update,
321 .id_table = fdtv_id_table,
322};
323
324int __init fdtv_fw_init(void)
325{
326 int ret;
327
328 ret = fw_core_add_address_handler(&fcp_handler, &fcp_region);
329 if (ret < 0)
330 return ret;
331
332 return driver_register(&fdtv_driver.driver);
333}
334
335void fdtv_fw_exit(void)
336{
337 driver_unregister(&fdtv_driver.driver);
338 fw_core_remove_address_handler(&fcp_handler);
339}
diff --git a/drivers/media/dvb/firewire/firedtv-rc.c b/drivers/media/dvb/firewire/firedtv-rc.c
index 27bca2e283df..fcf3828472b8 100644
--- a/drivers/media/dvb/firewire/firedtv-rc.c
+++ b/drivers/media/dvb/firewire/firedtv-rc.c
@@ -12,8 +12,10 @@
12#include <linux/bitops.h> 12#include <linux/bitops.h>
13#include <linux/input.h> 13#include <linux/input.h>
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/slab.h>
15#include <linux/string.h> 16#include <linux/string.h>
16#include <linux/types.h> 17#include <linux/types.h>
18#include <linux/workqueue.h>
17 19
18#include "firedtv.h" 20#include "firedtv.h"
19 21
@@ -163,6 +165,7 @@ fail:
163 165
164void fdtv_unregister_rc(struct firedtv *fdtv) 166void fdtv_unregister_rc(struct firedtv *fdtv)
165{ 167{
168 cancel_work_sync(&fdtv->remote_ctrl_work);
166 kfree(fdtv->remote_ctrl_dev->keycode); 169 kfree(fdtv->remote_ctrl_dev->keycode);
167 input_unregister_device(fdtv->remote_ctrl_dev); 170 input_unregister_device(fdtv->remote_ctrl_dev);
168} 171}
diff --git a/drivers/media/dvb/firewire/firedtv.h b/drivers/media/dvb/firewire/firedtv.h
index d48530b81e61..78cc28f36914 100644
--- a/drivers/media/dvb/firewire/firedtv.h
+++ b/drivers/media/dvb/firewire/firedtv.h
@@ -16,6 +16,7 @@
16#include <linux/dvb/dmx.h> 16#include <linux/dvb/dmx.h>
17#include <linux/dvb/frontend.h> 17#include <linux/dvb/frontend.h>
18#include <linux/list.h> 18#include <linux/list.h>
19#include <linux/mod_devicetable.h>
19#include <linux/mutex.h> 20#include <linux/mutex.h>
20#include <linux/spinlock_types.h> 21#include <linux/spinlock_types.h>
21#include <linux/types.h> 22#include <linux/types.h>
@@ -72,8 +73,8 @@ struct input_dev;
72struct firedtv; 73struct firedtv;
73 74
74struct firedtv_backend { 75struct firedtv_backend {
75 int (*lock)(struct firedtv *fdtv, u64 addr, void *data, __be32 arg); 76 int (*lock)(struct firedtv *fdtv, u64 addr, void *data);
76 int (*read)(struct firedtv *fdtv, u64 addr, void *data, size_t len); 77 int (*read)(struct firedtv *fdtv, u64 addr, void *data);
77 int (*write)(struct firedtv *fdtv, u64 addr, void *data, size_t len); 78 int (*write)(struct firedtv *fdtv, u64 addr, void *data, size_t len);
78 int (*start_iso)(struct firedtv *fdtv); 79 int (*start_iso)(struct firedtv *fdtv);
79 void (*stop_iso)(struct firedtv *fdtv); 80 void (*stop_iso)(struct firedtv *fdtv);
@@ -113,16 +114,16 @@ struct firedtv {
113 unsigned long channel_active; 114 unsigned long channel_active;
114 u16 channel_pid[16]; 115 u16 channel_pid[16];
115 116
116 size_t response_length; 117 int avc_data_length;
117 u8 response[512]; 118 u8 avc_data[512];
118}; 119};
119 120
120/* firedtv-1394.c */ 121/* firedtv-1394.c */
121#ifdef CONFIG_DVB_FIREDTV_IEEE1394 122#ifdef CONFIG_DVB_FIREDTV_IEEE1394
122int fdtv_1394_init(struct ieee1394_device_id id_table[]); 123int fdtv_1394_init(void);
123void fdtv_1394_exit(void); 124void fdtv_1394_exit(void);
124#else 125#else
125static inline int fdtv_1394_init(struct ieee1394_device_id it[]) { return 0; } 126static inline int fdtv_1394_init(void) { return 0; }
126static inline void fdtv_1394_exit(void) {} 127static inline void fdtv_1394_exit(void) {}
127#endif 128#endif
128 129
@@ -163,10 +164,20 @@ struct firedtv *fdtv_alloc(struct device *dev,
163 const struct firedtv_backend *backend, 164 const struct firedtv_backend *backend,
164 const char *name, size_t name_len); 165 const char *name, size_t name_len);
165extern const char *fdtv_model_names[]; 166extern const char *fdtv_model_names[];
167extern const struct ieee1394_device_id fdtv_id_table[];
166 168
167/* firedtv-fe.c */ 169/* firedtv-fe.c */
168void fdtv_frontend_init(struct firedtv *fdtv); 170void fdtv_frontend_init(struct firedtv *fdtv);
169 171
172/* firedtv-fw.c */
173#ifdef CONFIG_DVB_FIREDTV_FIREWIRE
174int fdtv_fw_init(void);
175void fdtv_fw_exit(void);
176#else
177static inline int fdtv_fw_init(void) { return 0; }
178static inline void fdtv_fw_exit(void) {}
179#endif
180
170/* firedtv-rc.c */ 181/* firedtv-rc.c */
171#ifdef CONFIG_DVB_FIREDTV_INPUT 182#ifdef CONFIG_DVB_FIREDTV_INPUT
172int fdtv_register_rc(struct firedtv *fdtv, struct device *dev); 183int fdtv_register_rc(struct firedtv *fdtv, struct device *dev);
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index d7c4837fa71c..cd7f9b7cbffa 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -201,6 +201,21 @@ config DVB_SI21XX
201 help 201 help
202 A DVB-S tuner module. Say Y when you want to support this frontend. 202 A DVB-S tuner module. Say Y when you want to support this frontend.
203 203
204config DVB_DS3000
205 tristate "Montage Tehnology DS3000 based"
206 depends on DVB_CORE && I2C
207 default m if DVB_FE_CUSTOMISE
208 help
209 A DVB-S/S2 tuner module. Say Y when you want to support this frontend.
210
211config DVB_MB86A16
212 tristate "Fujitsu MB86A16 based"
213 depends on DVB_CORE && I2C
214 default m if DVB_FE_CUSTOMISE
215 help
216 A DVB-S/DSS Direct Conversion reveiver.
217 Say Y when you want to support this frontend.
218
204comment "DVB-T (terrestrial) frontends" 219comment "DVB-T (terrestrial) frontends"
205 depends on DVB_CORE 220 depends on DVB_CORE
206 221
@@ -342,6 +357,13 @@ config DVB_AF9013
342 help 357 help
343 Say Y when you want to support this frontend. 358 Say Y when you want to support this frontend.
344 359
360config DVB_EC100
361 tristate "E3C EC100"
362 depends on DVB_CORE && I2C
363 default m if DVB_FE_CUSTOMISE
364 help
365 Say Y when you want to support this frontend.
366
345comment "DVB-C (cable) frontends" 367comment "DVB-C (cable) frontends"
346 depends on DVB_CORE 368 depends on DVB_CORE
347 369
@@ -512,6 +534,15 @@ config DVB_TUNER_DIB0070
512 This device is only used inside a SiP called together with a 534 This device is only used inside a SiP called together with a
513 demodulator for now. 535 demodulator for now.
514 536
537config DVB_TUNER_DIB0090
538 tristate "DiBcom DiB0090 silicon base-band tuner"
539 depends on I2C
540 default m if DVB_FE_CUSTOMISE
541 help
542 A driver for the silicon baseband tuner DiB0090 from DiBcom.
543 This device is only used inside a SiP called together with a
544 demodulator for now.
545
515comment "SEC control devices for DVB-S" 546comment "SEC control devices for DVB-S"
516 depends on DVB_CORE 547 depends on DVB_CORE
517 548
@@ -557,6 +588,24 @@ config DVB_LGS8GXX
557 help 588 help
558 A DMB-TH tuner module. Say Y when you want to support this frontend. 589 A DMB-TH tuner module. Say Y when you want to support this frontend.
559 590
591config DVB_ATBM8830
592 tristate "AltoBeam ATBM8830/8831 DMB-TH demodulator"
593 depends on DVB_CORE && I2C
594 default m if DVB_FE_CUSTOMISE
595 help
596 A DMB-TH tuner module. Say Y when you want to support this frontend.
597
598config DVB_TDA665x
599 tristate "TDA665x tuner"
600 depends on DVB_CORE && I2C
601 default m if DVB_FE_CUSTOMISE
602 help
603 Support for tuner modules based on Philips TDA6650/TDA6651 chips.
604 Say Y when you want to support this chip.
605
606 Currently supported tuners:
607 * Panasonic ENV57H12D5 (ET-50DT)
608
560comment "Tools to develop new frontends" 609comment "Tools to develop new frontends"
561 610
562config DVB_DUMMY_FE 611config DVB_DUMMY_FE
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
index 3523767e7a76..874e8ada4d1d 100644
--- a/drivers/media/dvb/frontends/Makefile
+++ b/drivers/media/dvb/frontends/Makefile
@@ -55,6 +55,7 @@ obj-$(CONFIG_DVB_TDA10086) += tda10086.o
55obj-$(CONFIG_DVB_TDA826X) += tda826x.o 55obj-$(CONFIG_DVB_TDA826X) += tda826x.o
56obj-$(CONFIG_DVB_TDA8261) += tda8261.o 56obj-$(CONFIG_DVB_TDA8261) += tda8261.o
57obj-$(CONFIG_DVB_TUNER_DIB0070) += dib0070.o 57obj-$(CONFIG_DVB_TUNER_DIB0070) += dib0070.o
58obj-$(CONFIG_DVB_TUNER_DIB0090) += dib0090.o
58obj-$(CONFIG_DVB_TUA6100) += tua6100.o 59obj-$(CONFIG_DVB_TUA6100) += tua6100.o
59obj-$(CONFIG_DVB_S5H1409) += s5h1409.o 60obj-$(CONFIG_DVB_S5H1409) += s5h1409.o
60obj-$(CONFIG_DVB_TUNER_ITD1000) += itd1000.o 61obj-$(CONFIG_DVB_TUNER_ITD1000) += itd1000.o
@@ -63,7 +64,9 @@ obj-$(CONFIG_DVB_TDA10048) += tda10048.o
63obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o 64obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o
64obj-$(CONFIG_DVB_S5H1411) += s5h1411.o 65obj-$(CONFIG_DVB_S5H1411) += s5h1411.o
65obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o 66obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o
67obj-$(CONFIG_DVB_TDA665x) += tda665x.o
66obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o 68obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o
69obj-$(CONFIG_DVB_ATBM8830) += atbm8830.o
67obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o 70obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o
68obj-$(CONFIG_DVB_AF9013) += af9013.o 71obj-$(CONFIG_DVB_AF9013) += af9013.o
69obj-$(CONFIG_DVB_CX24116) += cx24116.o 72obj-$(CONFIG_DVB_CX24116) += cx24116.o
@@ -76,3 +79,6 @@ obj-$(CONFIG_DVB_STV0900) += stv0900.o
76obj-$(CONFIG_DVB_STV090x) += stv090x.o 79obj-$(CONFIG_DVB_STV090x) += stv090x.o
77obj-$(CONFIG_DVB_STV6110x) += stv6110x.o 80obj-$(CONFIG_DVB_STV6110x) += stv6110x.o
78obj-$(CONFIG_DVB_ISL6423) += isl6423.o 81obj-$(CONFIG_DVB_ISL6423) += isl6423.o
82obj-$(CONFIG_DVB_EC100) += ec100.o
83obj-$(CONFIG_DVB_DS3000) += ds3000.o
84obj-$(CONFIG_DVB_MB86A16) += mb86a16.o
diff --git a/drivers/media/dvb/frontends/af9013.h b/drivers/media/dvb/frontends/af9013.h
index 28b90c91c766..e90fa92b1c1d 100644
--- a/drivers/media/dvb/frontends/af9013.h
+++ b/drivers/media/dvb/frontends/af9013.h
@@ -44,6 +44,7 @@ enum af9013_tuner {
44 AF9013_TUNER_MT2060_2 = 147, /* Microtune */ 44 AF9013_TUNER_MT2060_2 = 147, /* Microtune */
45 AF9013_TUNER_TDA18271 = 156, /* NXP */ 45 AF9013_TUNER_TDA18271 = 156, /* NXP */
46 AF9013_TUNER_QT1010A = 162, /* Quantek */ 46 AF9013_TUNER_QT1010A = 162, /* Quantek */
47 AF9013_TUNER_TDA18218 = 179, /* NXP */
47}; 48};
48 49
49/* AF9013/5 GPIOs (mostly guessed) 50/* AF9013/5 GPIOs (mostly guessed)
diff --git a/drivers/media/dvb/frontends/atbm8830.c b/drivers/media/dvb/frontends/atbm8830.c
new file mode 100644
index 000000000000..43aac2f85c2e
--- /dev/null
+++ b/drivers/media/dvb/frontends/atbm8830.c
@@ -0,0 +1,511 @@
1/*
2 * Support for AltoBeam GB20600 (a.k.a DMB-TH) demodulator
3 * ATBM8830, ATBM8831
4 *
5 * Copyright (C) 2009 David T.L. Wong <davidtlwong@gmail.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include <asm/div64.h>
23#include "dvb_frontend.h"
24
25#include "atbm8830.h"
26#include "atbm8830_priv.h"
27
28#define dprintk(args...) \
29 do { \
30 if (debug) \
31 printk(KERN_DEBUG "atbm8830: " args); \
32 } while (0)
33
34static int debug;
35
36module_param(debug, int, 0644);
37MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
38
39static int atbm8830_write_reg(struct atbm_state *priv, u16 reg, u8 data)
40{
41 int ret = 0;
42 u8 dev_addr;
43 u8 buf1[] = { reg >> 8, reg & 0xFF };
44 u8 buf2[] = { data };
45 struct i2c_msg msg1 = { .flags = 0, .buf = buf1, .len = 2 };
46 struct i2c_msg msg2 = { .flags = 0, .buf = buf2, .len = 1 };
47
48 dev_addr = priv->config->demod_address;
49 msg1.addr = dev_addr;
50 msg2.addr = dev_addr;
51
52 if (debug >= 2)
53 printk(KERN_DEBUG "%s: reg=0x%04X, data=0x%02X\n",
54 __func__, reg, data);
55
56 ret = i2c_transfer(priv->i2c, &msg1, 1);
57 if (ret != 1)
58 return -EIO;
59
60 ret = i2c_transfer(priv->i2c, &msg2, 1);
61 return (ret != 1) ? -EIO : 0;
62}
63
64static int atbm8830_read_reg(struct atbm_state *priv, u16 reg, u8 *p_data)
65{
66 int ret;
67 u8 dev_addr;
68
69 u8 buf1[] = { reg >> 8, reg & 0xFF };
70 u8 buf2[] = { 0 };
71 struct i2c_msg msg1 = { .flags = 0, .buf = buf1, .len = 2 };
72 struct i2c_msg msg2 = { .flags = I2C_M_RD, .buf = buf2, .len = 1 };
73
74 dev_addr = priv->config->demod_address;
75 msg1.addr = dev_addr;
76 msg2.addr = dev_addr;
77
78 ret = i2c_transfer(priv->i2c, &msg1, 1);
79 if (ret != 1) {
80 dprintk(KERN_DEBUG "%s: error reg=0x%04x, ret=%i\n",
81 __func__, reg, ret);
82 return -EIO;
83 }
84
85 ret = i2c_transfer(priv->i2c, &msg2, 1);
86 if (ret != 1)
87 return -EIO;
88
89 *p_data = buf2[0];
90 if (debug >= 2)
91 printk(KERN_DEBUG "%s: reg=0x%04X, data=0x%02X\n",
92 __func__, reg, buf2[0]);
93
94 return 0;
95}
96
97/* Lock register latch so that multi-register read is atomic */
98static inline int atbm8830_reglatch_lock(struct atbm_state *priv, int lock)
99{
100 return atbm8830_write_reg(priv, REG_READ_LATCH, lock ? 1 : 0);
101}
102
103static int set_osc_freq(struct atbm_state *priv, u32 freq /*in kHz*/)
104{
105 u32 val;
106 u64 t;
107
108 /* 0x100000 * freq / 30.4MHz */
109 t = (u64)0x100000 * freq;
110 do_div(t, 30400);
111 val = t;
112
113 atbm8830_write_reg(priv, REG_OSC_CLK, val);
114 atbm8830_write_reg(priv, REG_OSC_CLK + 1, val >> 8);
115 atbm8830_write_reg(priv, REG_OSC_CLK + 2, val >> 16);
116
117 return 0;
118}
119
120static int set_if_freq(struct atbm_state *priv, u32 freq /*in kHz*/)
121{
122
123 u32 fs = priv->config->osc_clk_freq;
124 u64 t;
125 u32 val;
126 u8 dat;
127
128 if (freq != 0) {
129 /* 2 * PI * (freq - fs) / fs * (2 ^ 22) */
130 t = (u64) 2 * 31416 * (freq - fs);
131 t <<= 22;
132 do_div(t, fs);
133 do_div(t, 1000);
134 val = t;
135
136 atbm8830_write_reg(priv, REG_TUNER_BASEBAND, 1);
137 atbm8830_write_reg(priv, REG_IF_FREQ, val);
138 atbm8830_write_reg(priv, REG_IF_FREQ+1, val >> 8);
139 atbm8830_write_reg(priv, REG_IF_FREQ+2, val >> 16);
140
141 atbm8830_read_reg(priv, REG_ADC_CONFIG, &dat);
142 dat &= 0xFC;
143 atbm8830_write_reg(priv, REG_ADC_CONFIG, dat);
144 } else {
145 /* Zero IF */
146 atbm8830_write_reg(priv, REG_TUNER_BASEBAND, 0);
147
148 atbm8830_read_reg(priv, REG_ADC_CONFIG, &dat);
149 dat &= 0xFC;
150 dat |= 0x02;
151 atbm8830_write_reg(priv, REG_ADC_CONFIG, dat);
152
153 if (priv->config->zif_swap_iq)
154 atbm8830_write_reg(priv, REG_SWAP_I_Q, 0x03);
155 else
156 atbm8830_write_reg(priv, REG_SWAP_I_Q, 0x01);
157 }
158
159 return 0;
160}
161
162static int is_locked(struct atbm_state *priv, u8 *locked)
163{
164 u8 status;
165
166 atbm8830_read_reg(priv, REG_LOCK_STATUS, &status);
167
168 if (locked != NULL)
169 *locked = (status == 1);
170 return 0;
171}
172
173static int set_agc_config(struct atbm_state *priv,
174 u8 min, u8 max, u8 hold_loop)
175{
176 /* no effect if both min and max are zero */
177 if (!min && !max)
178 return 0;
179
180 atbm8830_write_reg(priv, REG_AGC_MIN, min);
181 atbm8830_write_reg(priv, REG_AGC_MAX, max);
182 atbm8830_write_reg(priv, REG_AGC_HOLD_LOOP, hold_loop);
183
184 return 0;
185}
186
187static int set_static_channel_mode(struct atbm_state *priv)
188{
189 int i;
190
191 for (i = 0; i < 5; i++)
192 atbm8830_write_reg(priv, 0x099B + i, 0x08);
193
194 atbm8830_write_reg(priv, 0x095B, 0x7F);
195 atbm8830_write_reg(priv, 0x09CB, 0x01);
196 atbm8830_write_reg(priv, 0x09CC, 0x7F);
197 atbm8830_write_reg(priv, 0x09CD, 0x7F);
198 atbm8830_write_reg(priv, 0x0E01, 0x20);
199
200 /* For single carrier */
201 atbm8830_write_reg(priv, 0x0B03, 0x0A);
202 atbm8830_write_reg(priv, 0x0935, 0x10);
203 atbm8830_write_reg(priv, 0x0936, 0x08);
204 atbm8830_write_reg(priv, 0x093E, 0x08);
205 atbm8830_write_reg(priv, 0x096E, 0x06);
206
207 /* frame_count_max0 */
208 atbm8830_write_reg(priv, 0x0B09, 0x00);
209 /* frame_count_max1 */
210 atbm8830_write_reg(priv, 0x0B0A, 0x08);
211
212 return 0;
213}
214
215static int set_ts_config(struct atbm_state *priv)
216{
217 const struct atbm8830_config *cfg = priv->config;
218
219 /*Set parallel/serial ts mode*/
220 atbm8830_write_reg(priv, REG_TS_SERIAL, cfg->serial_ts ? 1 : 0);
221 atbm8830_write_reg(priv, REG_TS_CLK_MODE, cfg->serial_ts ? 1 : 0);
222 /*Set ts sampling edge*/
223 atbm8830_write_reg(priv, REG_TS_SAMPLE_EDGE,
224 cfg->ts_sampling_edge ? 1 : 0);
225 /*Set ts clock freerun*/
226 atbm8830_write_reg(priv, REG_TS_CLK_FREERUN,
227 cfg->ts_clk_gated ? 0 : 1);
228
229 return 0;
230}
231
232static int atbm8830_init(struct dvb_frontend *fe)
233{
234 struct atbm_state *priv = fe->demodulator_priv;
235 const struct atbm8830_config *cfg = priv->config;
236
237 /*Set oscillator frequency*/
238 set_osc_freq(priv, cfg->osc_clk_freq);
239
240 /*Set IF frequency*/
241 set_if_freq(priv, cfg->if_freq);
242
243 /*Set AGC Config*/
244 set_agc_config(priv, cfg->agc_min, cfg->agc_max,
245 cfg->agc_hold_loop);
246
247 /*Set static channel mode*/
248 set_static_channel_mode(priv);
249
250 set_ts_config(priv);
251 /*Turn off DSP reset*/
252 atbm8830_write_reg(priv, 0x000A, 0);
253
254 /*SW version test*/
255 atbm8830_write_reg(priv, 0x020C, 11);
256
257 /* Run */
258 atbm8830_write_reg(priv, REG_DEMOD_RUN, 1);
259
260 return 0;
261}
262
263
264static void atbm8830_release(struct dvb_frontend *fe)
265{
266 struct atbm_state *state = fe->demodulator_priv;
267 dprintk("%s\n", __func__);
268
269 kfree(state);
270}
271
272static int atbm8830_set_fe(struct dvb_frontend *fe,
273 struct dvb_frontend_parameters *fe_params)
274{
275 struct atbm_state *priv = fe->demodulator_priv;
276 int i;
277 u8 locked = 0;
278 dprintk("%s\n", __func__);
279
280 /* set frequency */
281 if (fe->ops.tuner_ops.set_params) {
282 if (fe->ops.i2c_gate_ctrl)
283 fe->ops.i2c_gate_ctrl(fe, 1);
284 fe->ops.tuner_ops.set_params(fe, fe_params);
285 if (fe->ops.i2c_gate_ctrl)
286 fe->ops.i2c_gate_ctrl(fe, 0);
287 }
288
289 /* start auto lock */
290 for (i = 0; i < 10; i++) {
291 mdelay(100);
292 dprintk("Try %d\n", i);
293 is_locked(priv, &locked);
294 if (locked != 0) {
295 dprintk("ATBM8830 locked!\n");
296 break;
297 }
298 }
299
300 return 0;
301}
302
303static int atbm8830_get_fe(struct dvb_frontend *fe,
304 struct dvb_frontend_parameters *fe_params)
305{
306 dprintk("%s\n", __func__);
307
308 /* TODO: get real readings from device */
309 /* inversion status */
310 fe_params->inversion = INVERSION_OFF;
311
312 /* bandwidth */
313 fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
314
315 fe_params->u.ofdm.code_rate_HP = FEC_AUTO;
316 fe_params->u.ofdm.code_rate_LP = FEC_AUTO;
317
318 fe_params->u.ofdm.constellation = QAM_AUTO;
319
320 /* transmission mode */
321 fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
322
323 /* guard interval */
324 fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
325
326 /* hierarchy */
327 fe_params->u.ofdm.hierarchy_information = HIERARCHY_NONE;
328
329 return 0;
330}
331
332static int atbm8830_get_tune_settings(struct dvb_frontend *fe,
333 struct dvb_frontend_tune_settings *fesettings)
334{
335 fesettings->min_delay_ms = 0;
336 fesettings->step_size = 0;
337 fesettings->max_drift = 0;
338 return 0;
339}
340
341static int atbm8830_read_status(struct dvb_frontend *fe, fe_status_t *fe_status)
342{
343 struct atbm_state *priv = fe->demodulator_priv;
344 u8 locked = 0;
345 u8 agc_locked = 0;
346
347 dprintk("%s\n", __func__);
348 *fe_status = 0;
349
350 is_locked(priv, &locked);
351 if (locked) {
352 *fe_status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
353 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
354 }
355 dprintk("%s: fe_status=0x%x\n", __func__, *fe_status);
356
357 atbm8830_read_reg(priv, REG_AGC_LOCK, &agc_locked);
358 dprintk("AGC Lock: %d\n", agc_locked);
359
360 return 0;
361}
362
363static int atbm8830_read_ber(struct dvb_frontend *fe, u32 *ber)
364{
365 struct atbm_state *priv = fe->demodulator_priv;
366 u32 frame_err;
367 u8 t;
368
369 dprintk("%s\n", __func__);
370
371 atbm8830_reglatch_lock(priv, 1);
372
373 atbm8830_read_reg(priv, REG_FRAME_ERR_CNT + 1, &t);
374 frame_err = t & 0x7F;
375 frame_err <<= 8;
376 atbm8830_read_reg(priv, REG_FRAME_ERR_CNT, &t);
377 frame_err |= t;
378
379 atbm8830_reglatch_lock(priv, 0);
380
381 *ber = frame_err * 100 / 32767;
382
383 dprintk("%s: ber=0x%x\n", __func__, *ber);
384 return 0;
385}
386
387static int atbm8830_read_signal_strength(struct dvb_frontend *fe, u16 *signal)
388{
389 struct atbm_state *priv = fe->demodulator_priv;
390 u32 pwm;
391 u8 t;
392
393 dprintk("%s\n", __func__);
394 atbm8830_reglatch_lock(priv, 1);
395
396 atbm8830_read_reg(priv, REG_AGC_PWM_VAL + 1, &t);
397 pwm = t & 0x03;
398 pwm <<= 8;
399 atbm8830_read_reg(priv, REG_AGC_PWM_VAL, &t);
400 pwm |= t;
401
402 atbm8830_reglatch_lock(priv, 0);
403
404 dprintk("AGC PWM = 0x%02X\n", pwm);
405 pwm = 0x400 - pwm;
406
407 *signal = pwm * 0x10000 / 0x400;
408
409 return 0;
410}
411
412static int atbm8830_read_snr(struct dvb_frontend *fe, u16 *snr)
413{
414 dprintk("%s\n", __func__);
415 *snr = 0;
416 return 0;
417}
418
419static int atbm8830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
420{
421 dprintk("%s\n", __func__);
422 *ucblocks = 0;
423 return 0;
424}
425
426static int atbm8830_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
427{
428 struct atbm_state *priv = fe->demodulator_priv;
429
430 return atbm8830_write_reg(priv, REG_I2C_GATE, enable ? 1 : 0);
431}
432
433static struct dvb_frontend_ops atbm8830_ops = {
434 .info = {
435 .name = "AltoBeam ATBM8830/8831 DMB-TH",
436 .type = FE_OFDM,
437 .frequency_min = 474000000,
438 .frequency_max = 858000000,
439 .frequency_stepsize = 10000,
440 .caps =
441 FE_CAN_FEC_AUTO |
442 FE_CAN_QAM_AUTO |
443 FE_CAN_TRANSMISSION_MODE_AUTO |
444 FE_CAN_GUARD_INTERVAL_AUTO
445 },
446
447 .release = atbm8830_release,
448
449 .init = atbm8830_init,
450 .sleep = NULL,
451 .write = NULL,
452 .i2c_gate_ctrl = atbm8830_i2c_gate_ctrl,
453
454 .set_frontend = atbm8830_set_fe,
455 .get_frontend = atbm8830_get_fe,
456 .get_tune_settings = atbm8830_get_tune_settings,
457
458 .read_status = atbm8830_read_status,
459 .read_ber = atbm8830_read_ber,
460 .read_signal_strength = atbm8830_read_signal_strength,
461 .read_snr = atbm8830_read_snr,
462 .read_ucblocks = atbm8830_read_ucblocks,
463};
464
465struct dvb_frontend *atbm8830_attach(const struct atbm8830_config *config,
466 struct i2c_adapter *i2c)
467{
468 struct atbm_state *priv = NULL;
469 u8 data = 0;
470
471 dprintk("%s()\n", __func__);
472
473 if (config == NULL || i2c == NULL)
474 return NULL;
475
476 priv = kzalloc(sizeof(struct atbm_state), GFP_KERNEL);
477 if (priv == NULL)
478 goto error_out;
479
480 priv->config = config;
481 priv->i2c = i2c;
482
483 /* check if the demod is there */
484 if (atbm8830_read_reg(priv, REG_CHIP_ID, &data) != 0) {
485 dprintk("%s atbm8830/8831 not found at i2c addr 0x%02X\n",
486 __func__, priv->config->demod_address);
487 goto error_out;
488 }
489 dprintk("atbm8830 chip id: 0x%02X\n", data);
490
491 memcpy(&priv->frontend.ops, &atbm8830_ops,
492 sizeof(struct dvb_frontend_ops));
493 priv->frontend.demodulator_priv = priv;
494
495 atbm8830_init(&priv->frontend);
496
497 atbm8830_i2c_gate_ctrl(&priv->frontend, 1);
498
499 return &priv->frontend;
500
501error_out:
502 dprintk("%s() error_out\n", __func__);
503 kfree(priv);
504 return NULL;
505
506}
507EXPORT_SYMBOL(atbm8830_attach);
508
509MODULE_DESCRIPTION("AltoBeam ATBM8830/8831 GB20600 demodulator driver");
510MODULE_AUTHOR("David T. L. Wong <davidtlwong@gmail.com>");
511MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/atbm8830.h b/drivers/media/dvb/frontends/atbm8830.h
new file mode 100644
index 000000000000..e8149f393300
--- /dev/null
+++ b/drivers/media/dvb/frontends/atbm8830.h
@@ -0,0 +1,76 @@
1/*
2 * Support for AltoBeam GB20600 (a.k.a DMB-TH) demodulator
3 * ATBM8830, ATBM8831
4 *
5 * Copyright (C) 2009 David T.L. Wong <davidtlwong@gmail.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#ifndef __ATBM8830_H__
23#define __ATBM8830_H__
24
25#include <linux/dvb/frontend.h>
26#include <linux/i2c.h>
27
28#define ATBM8830_PROD_8830 0
29#define ATBM8830_PROD_8831 1
30
31struct atbm8830_config {
32
33 /* product type */
34 u8 prod;
35
36 /* the demodulator's i2c address */
37 u8 demod_address;
38
39 /* parallel or serial transport stream */
40 u8 serial_ts;
41
42 /* transport stream clock output only when receving valid stream */
43 u8 ts_clk_gated;
44
45 /* Decoder sample TS data at rising edge of clock */
46 u8 ts_sampling_edge;
47
48 /* Oscillator clock frequency */
49 u32 osc_clk_freq; /* in kHz */
50
51 /* IF frequency */
52 u32 if_freq; /* in kHz */
53
54 /* Swap I/Q for zero IF */
55 u8 zif_swap_iq;
56
57 /* Tuner AGC settings */
58 u8 agc_min;
59 u8 agc_max;
60 u8 agc_hold_loop;
61};
62
63#if defined(CONFIG_DVB_ATBM8830) || \
64 (defined(CONFIG_DVB_ATBM8830_MODULE) && defined(MODULE))
65extern struct dvb_frontend *atbm8830_attach(const struct atbm8830_config *config,
66 struct i2c_adapter *i2c);
67#else
68static inline
69struct dvb_frontend *atbm8830_attach(const struct atbm8830_config *config,
70 struct i2c_adapter *i2c) {
71 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
72 return NULL;
73}
74#endif /* CONFIG_DVB_ATBM8830 */
75
76#endif /* __ATBM8830_H__ */
diff --git a/drivers/media/dvb/frontends/atbm8830_priv.h b/drivers/media/dvb/frontends/atbm8830_priv.h
new file mode 100644
index 000000000000..ce960f76092a
--- /dev/null
+++ b/drivers/media/dvb/frontends/atbm8830_priv.h
@@ -0,0 +1,75 @@
1/*
2 * Support for AltoBeam GB20600 (a.k.a DMB-TH) demodulator
3 * ATBM8830, ATBM8831
4 *
5 * Copyright (C) 2009 David T.L. Wong <davidtlwong@gmail.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#ifndef __ATBM8830_PRIV_H
23#define __ATBM8830_PRIV_H
24
25struct atbm_state {
26 struct i2c_adapter *i2c;
27 /* configuration settings */
28 const struct atbm8830_config *config;
29 struct dvb_frontend frontend;
30};
31
32#define REG_CHIP_ID 0x0000
33#define REG_TUNER_BASEBAND 0x0001
34#define REG_DEMOD_RUN 0x0004
35#define REG_DSP_RESET 0x0005
36#define REG_RAM_RESET 0x0006
37#define REG_ADC_RESET 0x0007
38#define REG_TSPORT_RESET 0x0008
39#define REG_BLKERR_POL 0x000C
40#define REG_I2C_GATE 0x0103
41#define REG_TS_SAMPLE_EDGE 0x0301
42#define REG_TS_PKT_LEN_204 0x0302
43#define REG_TS_PKT_LEN_AUTO 0x0303
44#define REG_TS_SERIAL 0x0305
45#define REG_TS_CLK_FREERUN 0x0306
46#define REG_TS_VALID_MODE 0x0307
47#define REG_TS_CLK_MODE 0x030B /* 1 for serial, 0 for parallel */
48
49#define REG_TS_ERRBIT_USE 0x030C
50#define REG_LOCK_STATUS 0x030D
51#define REG_ADC_CONFIG 0x0602
52#define REG_CARRIER_OFFSET 0x0827 /* 0x0827-0x0829 little endian */
53#define REG_DETECTED_PN_MODE 0x082D
54#define REG_READ_LATCH 0x084D
55#define REG_IF_FREQ 0x0A00 /* 0x0A00-0x0A02 little endian */
56#define REG_OSC_CLK 0x0A03 /* 0x0A03-0x0A05 little endian */
57#define REG_BYPASS_CCI 0x0A06
58#define REG_ANALOG_LUMA_DETECTED 0x0A25
59#define REG_ANALOG_AUDIO_DETECTED 0x0A26
60#define REG_ANALOG_CHROMA_DETECTED 0x0A39
61#define REG_FRAME_ERR_CNT 0x0B04
62#define REG_USE_EXT_ADC 0x0C00
63#define REG_SWAP_I_Q 0x0C01
64#define REG_TPS_MANUAL 0x0D01
65#define REG_TPS_CONFIG 0x0D02
66#define REG_BYPASS_DEINTERLEAVER 0x0E00
67#define REG_AGC_TARGET 0x1003 /* 0x1003-0x1005 little endian */
68#define REG_AGC_MIN 0x1020
69#define REG_AGC_MAX 0x1023
70#define REG_AGC_LOCK 0x1027
71#define REG_AGC_PWM_VAL 0x1028 /* 0x1028-0x1029 little endian */
72#define REG_AGC_HOLD_LOOP 0x1031
73
74#endif
75
diff --git a/drivers/media/dvb/frontends/au8522_decoder.c b/drivers/media/dvb/frontends/au8522_decoder.c
index 74981ee923c8..24268ef2753d 100644
--- a/drivers/media/dvb/frontends/au8522_decoder.c
+++ b/drivers/media/dvb/frontends/au8522_decoder.c
@@ -23,7 +23,6 @@
23/* Developer notes: 23/* Developer notes:
24 * 24 *
25 * VBI support is not yet working 25 * VBI support is not yet working
26 * Saturation and hue setting are not yet working
27 * Enough is implemented here for CVBS and S-Video inputs, but the actual 26 * Enough is implemented here for CVBS and S-Video inputs, but the actual
28 * analog demodulator code isn't implemented (not needed for xc5000 since it 27 * analog demodulator code isn't implemented (not needed for xc5000 since it
29 * has its own demodulator and outputs CVBS) 28 * has its own demodulator and outputs CVBS)
@@ -63,7 +62,7 @@ struct au8522_register_config {
63 The values are as follows from left to right 62 The values are as follows from left to right
64 0="ATV RF" 1="ATV RF13" 2="CVBS" 3="S-Video" 4="PAL" 5=CVBS13" 6="SVideo13" 63 0="ATV RF" 1="ATV RF13" 2="CVBS" 3="S-Video" 4="PAL" 5=CVBS13" 6="SVideo13"
65*/ 64*/
66struct au8522_register_config filter_coef[] = { 65static const struct au8522_register_config filter_coef[] = {
67 {AU8522_FILTER_COEF_R410, {0x25, 0x00, 0x25, 0x25, 0x00, 0x00, 0x00} }, 66 {AU8522_FILTER_COEF_R410, {0x25, 0x00, 0x25, 0x25, 0x00, 0x00, 0x00} },
68 {AU8522_FILTER_COEF_R411, {0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00} }, 67 {AU8522_FILTER_COEF_R411, {0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00} },
69 {AU8522_FILTER_COEF_R412, {0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00} }, 68 {AU8522_FILTER_COEF_R412, {0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00} },
@@ -105,7 +104,7 @@ struct au8522_register_config filter_coef[] = {
105 0="SIF" 1="ATVRF/ATVRF13" 104 0="SIF" 1="ATVRF/ATVRF13"
106 Note: the "ATVRF/ATVRF13" mode has never been tested 105 Note: the "ATVRF/ATVRF13" mode has never been tested
107*/ 106*/
108struct au8522_register_config lpfilter_coef[] = { 107static const struct au8522_register_config lpfilter_coef[] = {
109 {0x060b, {0x21, 0x0b} }, 108 {0x060b, {0x21, 0x0b} },
110 {0x060c, {0xad, 0xad} }, 109 {0x060c, {0xad, 0xad} },
111 {0x060d, {0x70, 0xf0} }, 110 {0x060d, {0x70, 0xf0} },
@@ -236,8 +235,10 @@ static void setup_decoder_defaults(struct au8522_state *state, u8 input_mode)
236 state->contrast = 0x79; 235 state->contrast = 0x79;
237 au8522_writereg(state, AU8522_TVDEC_SATURATION_CB_REG00CH, 0x80); 236 au8522_writereg(state, AU8522_TVDEC_SATURATION_CB_REG00CH, 0x80);
238 au8522_writereg(state, AU8522_TVDEC_SATURATION_CR_REG00DH, 0x80); 237 au8522_writereg(state, AU8522_TVDEC_SATURATION_CR_REG00DH, 0x80);
238 state->saturation = 0x80;
239 au8522_writereg(state, AU8522_TVDEC_HUE_H_REG00EH, 0x00); 239 au8522_writereg(state, AU8522_TVDEC_HUE_H_REG00EH, 0x00);
240 au8522_writereg(state, AU8522_TVDEC_HUE_L_REG00FH, 0x00); 240 au8522_writereg(state, AU8522_TVDEC_HUE_L_REG00FH, 0x00);
241 state->hue = 0x00;
241 242
242 /* Other decoder registers */ 243 /* Other decoder registers */
243 au8522_writereg(state, AU8522_TVDEC_INT_MASK_REG010H, 0x00); 244 au8522_writereg(state, AU8522_TVDEC_INT_MASK_REG010H, 0x00);
@@ -315,7 +316,7 @@ static void setup_decoder_defaults(struct au8522_state *state, u8 input_mode)
315 if (input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 || 316 if (input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 ||
316 input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24) { 317 input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24) {
317 /* Despite what the table says, for the HVR-950q we still need 318 /* Despite what the table says, for the HVR-950q we still need
318 to be in CVBS mode for the S-Video input (reason uknown). */ 319 to be in CVBS mode for the S-Video input (reason unknown). */
319 /* filter_coef_type = 3; */ 320 /* filter_coef_type = 3; */
320 filter_coef_type = 5; 321 filter_coef_type = 5;
321 } else { 322 } else {
@@ -504,7 +505,19 @@ static int au8522_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
504 ctrl->value); 505 ctrl->value);
505 break; 506 break;
506 case V4L2_CID_SATURATION: 507 case V4L2_CID_SATURATION:
508 state->saturation = ctrl->value;
509 au8522_writereg(state, AU8522_TVDEC_SATURATION_CB_REG00CH,
510 ctrl->value);
511 au8522_writereg(state, AU8522_TVDEC_SATURATION_CR_REG00DH,
512 ctrl->value);
513 break;
507 case V4L2_CID_HUE: 514 case V4L2_CID_HUE:
515 state->hue = ctrl->value;
516 au8522_writereg(state, AU8522_TVDEC_HUE_H_REG00EH,
517 ctrl->value >> 8);
518 au8522_writereg(state, AU8522_TVDEC_HUE_L_REG00FH,
519 ctrl->value & 0xFF);
520 break;
508 case V4L2_CID_AUDIO_VOLUME: 521 case V4L2_CID_AUDIO_VOLUME:
509 case V4L2_CID_AUDIO_BASS: 522 case V4L2_CID_AUDIO_BASS:
510 case V4L2_CID_AUDIO_TREBLE: 523 case V4L2_CID_AUDIO_TREBLE:
@@ -534,7 +547,11 @@ static int au8522_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
534 ctrl->value = state->contrast; 547 ctrl->value = state->contrast;
535 break; 548 break;
536 case V4L2_CID_SATURATION: 549 case V4L2_CID_SATURATION:
550 ctrl->value = state->saturation;
551 break;
537 case V4L2_CID_HUE: 552 case V4L2_CID_HUE:
553 ctrl->value = state->hue;
554 break;
538 case V4L2_CID_AUDIO_VOLUME: 555 case V4L2_CID_AUDIO_VOLUME:
539 case V4L2_CID_AUDIO_BASS: 556 case V4L2_CID_AUDIO_BASS:
540 case V4L2_CID_AUDIO_TREBLE: 557 case V4L2_CID_AUDIO_TREBLE:
@@ -632,8 +649,9 @@ static int au8522_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
632 case V4L2_CID_BRIGHTNESS: 649 case V4L2_CID_BRIGHTNESS:
633 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); 650 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
634 case V4L2_CID_SATURATION: 651 case V4L2_CID_SATURATION:
652 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
635 case V4L2_CID_HUE: 653 case V4L2_CID_HUE:
636 /* Not yet implemented */ 654 return v4l2_ctrl_query_fill(qc, -32768, 32768, 1, 0);
637 default: 655 default:
638 break; 656 break;
639 } 657 }
diff --git a/drivers/media/dvb/frontends/au8522_dig.c b/drivers/media/dvb/frontends/au8522_dig.c
index 956b80f4979c..a1fed0fa8ed4 100644
--- a/drivers/media/dvb/frontends/au8522_dig.c
+++ b/drivers/media/dvb/frontends/au8522_dig.c
@@ -23,7 +23,6 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/module.h> 24#include <linux/module.h>
25#include <linux/string.h> 25#include <linux/string.h>
26#include <linux/slab.h>
27#include <linux/delay.h> 26#include <linux/delay.h>
28#include "dvb_frontend.h" 27#include "dvb_frontend.h"
29#include "au8522.h" 28#include "au8522.h"
diff --git a/drivers/media/dvb/frontends/au8522_priv.h b/drivers/media/dvb/frontends/au8522_priv.h
index f328f2b3ad3d..c74c4e72fe91 100644
--- a/drivers/media/dvb/frontends/au8522_priv.h
+++ b/drivers/media/dvb/frontends/au8522_priv.h
@@ -62,6 +62,8 @@ struct au8522_state {
62 u32 rev; 62 u32 rev;
63 u8 brightness; 63 u8 brightness;
64 u8 contrast; 64 u8 contrast;
65 u8 saturation;
66 s16 hue;
65}; 67};
66 68
67/* These are routines shared by both the VSB/QAM demodulator and the analog 69/* These are routines shared by both the VSB/QAM demodulator and the analog
diff --git a/drivers/media/dvb/frontends/cx24110.c b/drivers/media/dvb/frontends/cx24110.c
index ffbcfabd83f0..00a4e8f03304 100644
--- a/drivers/media/dvb/frontends/cx24110.c
+++ b/drivers/media/dvb/frontends/cx24110.c
@@ -1,4 +1,4 @@
1 /* 1/*
2 cx24110 - Single Chip Satellite Channel Receiver driver module 2 cx24110 - Single Chip Satellite Channel Receiver driver module
3 3
4 Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@htp-tel.de> based on 4 Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@htp-tel.de> based on
@@ -96,7 +96,7 @@ static struct {u8 reg; u8 data;} cx24110_regdata[]=
96 {0x42,0x00}, /* @ middle bytes " */ 96 {0x42,0x00}, /* @ middle bytes " */
97 {0x43,0x00}, /* @ LSB " */ 97 {0x43,0x00}, /* @ LSB " */
98 /* leave the carrier tracking loop parameters on default */ 98 /* leave the carrier tracking loop parameters on default */
99 /* leave the bit timing loop parameters at gefault */ 99 /* leave the bit timing loop parameters at default */
100 {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */ 100 {0x56,0x4d}, /* set the filtune voltage to 2.7V, as recommended by */
101 /* the cx24108 data sheet for symbol rates above 15MS/s */ 101 /* the cx24108 data sheet for symbol rates above 15MS/s */
102 {0x57,0x00}, /* @ Filter sigma delta enabled, positive */ 102 {0x57,0x00}, /* @ Filter sigma delta enabled, positive */
diff --git a/drivers/media/dvb/frontends/cx24113.c b/drivers/media/dvb/frontends/cx24113.c
index 075b2b57cf09..e9ee55592fd3 100644
--- a/drivers/media/dvb/frontends/cx24113.c
+++ b/drivers/media/dvb/frontends/cx24113.c
@@ -589,7 +589,7 @@ struct dvb_frontend *cx24113_attach(struct dvb_frontend *fe,
589 info("detected CX24113 variant\n"); 589 info("detected CX24113 variant\n");
590 break; 590 break;
591 case REV_CX24113: 591 case REV_CX24113:
592 info("sucessfully detected\n"); 592 info("successfully detected\n");
593 break; 593 break;
594 default: 594 default:
595 err("unsupported device id: %x\n", state->rev); 595 err("unsupported device id: %x\n", state->rev);
diff --git a/drivers/media/dvb/frontends/dib0070.c b/drivers/media/dvb/frontends/dib0070.c
index 2be17b93e0bd..d4e466a90e43 100644
--- a/drivers/media/dvb/frontends/dib0070.c
+++ b/drivers/media/dvb/frontends/dib0070.c
@@ -25,6 +25,7 @@
25 */ 25 */
26 26
27#include <linux/kernel.h> 27#include <linux/kernel.h>
28#include <linux/slab.h>
28#include <linux/i2c.h> 29#include <linux/i2c.h>
29 30
30#include "dvb_frontend.h" 31#include "dvb_frontend.h"
@@ -49,21 +50,6 @@ MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
49#define DIB0070_P1G 0x03 50#define DIB0070_P1G 0x03
50#define DIB0070S_P1A 0x02 51#define DIB0070S_P1A 0x02
51 52
52enum frontend_tune_state {
53 CT_TUNER_START = 10,
54 CT_TUNER_STEP_0,
55 CT_TUNER_STEP_1,
56 CT_TUNER_STEP_2,
57 CT_TUNER_STEP_3,
58 CT_TUNER_STEP_4,
59 CT_TUNER_STEP_5,
60 CT_TUNER_STEP_6,
61 CT_TUNER_STEP_7,
62 CT_TUNER_STOP,
63};
64
65#define FE_CALLBACK_TIME_NEVER 0xffffffff
66
67struct dib0070_state { 53struct dib0070_state {
68 struct i2c_adapter *i2c; 54 struct i2c_adapter *i2c;
69 struct dvb_frontend *fe; 55 struct dvb_frontend *fe;
@@ -71,10 +57,10 @@ struct dib0070_state {
71 u16 wbd_ff_offset; 57 u16 wbd_ff_offset;
72 u8 revision; 58 u8 revision;
73 59
74 enum frontend_tune_state tune_state; 60 enum frontend_tune_state tune_state;
75 u32 current_rf; 61 u32 current_rf;
76 62
77 /* for the captrim binary search */ 63 /* for the captrim binary search */
78 s8 step; 64 s8 step;
79 u16 adc_diff; 65 u16 adc_diff;
80 66
@@ -85,7 +71,7 @@ struct dib0070_state {
85 const struct dib0070_tuning *current_tune_table_index; 71 const struct dib0070_tuning *current_tune_table_index;
86 const struct dib0070_lna_match *lna_match; 72 const struct dib0070_lna_match *lna_match;
87 73
88 u8 wbd_gain_current; 74 u8 wbd_gain_current;
89 u16 wbd_offset_3_3[2]; 75 u16 wbd_offset_3_3[2];
90}; 76};
91 77
@@ -93,8 +79,8 @@ static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg)
93{ 79{
94 u8 b[2]; 80 u8 b[2];
95 struct i2c_msg msg[2] = { 81 struct i2c_msg msg[2] = {
96 {.addr = state->cfg->i2c_address,.flags = 0,.buf = &reg,.len = 1}, 82 { .addr = state->cfg->i2c_address, .flags = 0, .buf = &reg, .len = 1 },
97 {.addr = state->cfg->i2c_address,.flags = I2C_M_RD,.buf = b,.len = 2}, 83 { .addr = state->cfg->i2c_address, .flags = I2C_M_RD, .buf = b, .len = 2 },
98 }; 84 };
99 if (i2c_transfer(state->i2c, msg, 2) != 2) { 85 if (i2c_transfer(state->i2c, msg, 2) != 2) {
100 printk(KERN_WARNING "DiB0070 I2C read failed\n"); 86 printk(KERN_WARNING "DiB0070 I2C read failed\n");
@@ -106,7 +92,7 @@ static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg)
106static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val) 92static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val)
107{ 93{
108 u8 b[3] = { reg, val >> 8, val & 0xff }; 94 u8 b[3] = { reg, val >> 8, val & 0xff };
109 struct i2c_msg msg = {.addr = state->cfg->i2c_address,.flags = 0,.buf = b,.len = 3 }; 95 struct i2c_msg msg = { .addr = state->cfg->i2c_address, .flags = 0, .buf = b, .len = 3 };
110 if (i2c_transfer(state->i2c, &msg, 1) != 1) { 96 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
111 printk(KERN_WARNING "DiB0070 I2C write failed\n"); 97 printk(KERN_WARNING "DiB0070 I2C write failed\n");
112 return -EREMOTEIO; 98 return -EREMOTEIO;
@@ -124,30 +110,30 @@ static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val)
124 110
125static int dib0070_set_bandwidth(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch) 111static int dib0070_set_bandwidth(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch)
126{ 112{
127 struct dib0070_state *state = fe->tuner_priv; 113 struct dib0070_state *state = fe->tuner_priv;
128 u16 tmp = dib0070_read_reg(state, 0x02) & 0x3fff; 114 u16 tmp = dib0070_read_reg(state, 0x02) & 0x3fff;
129 115
130 if (state->fe->dtv_property_cache.bandwidth_hz / 1000 > 7000) 116 if (state->fe->dtv_property_cache.bandwidth_hz/1000 > 7000)
131 tmp |= (0 << 14); 117 tmp |= (0 << 14);
132 else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 > 6000) 118 else if (state->fe->dtv_property_cache.bandwidth_hz/1000 > 6000)
133 tmp |= (1 << 14); 119 tmp |= (1 << 14);
134 else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 > 5000) 120 else if (state->fe->dtv_property_cache.bandwidth_hz/1000 > 5000)
135 tmp |= (2 << 14); 121 tmp |= (2 << 14);
136 else 122 else
137 tmp |= (3 << 14); 123 tmp |= (3 << 14);
138 124
139 dib0070_write_reg(state, 0x02, tmp); 125 dib0070_write_reg(state, 0x02, tmp);
140 126
141 /* sharpen the BB filter in ISDB-T to have higher immunity to adjacent channels */ 127 /* sharpen the BB filter in ISDB-T to have higher immunity to adjacent channels */
142 if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT) { 128 if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT) {
143 u16 value = dib0070_read_reg(state, 0x17); 129 u16 value = dib0070_read_reg(state, 0x17);
144 130
145 dib0070_write_reg(state, 0x17, value & 0xfffc); 131 dib0070_write_reg(state, 0x17, value & 0xfffc);
146 tmp = dib0070_read_reg(state, 0x01) & 0x01ff; 132 tmp = dib0070_read_reg(state, 0x01) & 0x01ff;
147 dib0070_write_reg(state, 0x01, tmp | (60 << 9)); 133 dib0070_write_reg(state, 0x01, tmp | (60 << 9));
148 134
149 dib0070_write_reg(state, 0x17, value); 135 dib0070_write_reg(state, 0x17, value);
150 } 136 }
151 return 0; 137 return 0;
152} 138}
153 139
@@ -160,14 +146,14 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state
160 if (*tune_state == CT_TUNER_STEP_0) { 146 if (*tune_state == CT_TUNER_STEP_0) {
161 147
162 dib0070_write_reg(state, 0x0f, 0xed10); 148 dib0070_write_reg(state, 0x0f, 0xed10);
163 dib0070_write_reg(state, 0x17, 0x0034); 149 dib0070_write_reg(state, 0x17, 0x0034);
164 150
165 dib0070_write_reg(state, 0x18, 0x0032); 151 dib0070_write_reg(state, 0x18, 0x0032);
166 state->step = state->captrim = state->fcaptrim = 64; 152 state->step = state->captrim = state->fcaptrim = 64;
167 state->adc_diff = 3000; 153 state->adc_diff = 3000;
168 ret = 20; 154 ret = 20;
169 155
170 *tune_state = CT_TUNER_STEP_1; 156 *tune_state = CT_TUNER_STEP_1;
171 } else if (*tune_state == CT_TUNER_STEP_1) { 157 } else if (*tune_state == CT_TUNER_STEP_1) {
172 state->step /= 2; 158 state->step /= 2;
173 dib0070_write_reg(state, 0x14, state->lo4 | state->captrim); 159 dib0070_write_reg(state, 0x14, state->lo4 | state->captrim);
@@ -178,7 +164,7 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state
178 164
179 adc = dib0070_read_reg(state, 0x19); 165 adc = dib0070_read_reg(state, 0x19);
180 166
181 dprintk("CAPTRIM=%hd; ADC = %hd (ADC) & %dmV", state->captrim, adc, (u32) adc * (u32) 1800 / (u32) 1024); 167 dprintk("CAPTRIM=%hd; ADC = %hd (ADC) & %dmV", state->captrim, adc, (u32) adc*(u32)1800/(u32)1024);
182 168
183 if (adc >= 400) { 169 if (adc >= 400) {
184 adc -= 400; 170 adc -= 400;
@@ -193,6 +179,8 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state
193 state->adc_diff = adc; 179 state->adc_diff = adc;
194 state->fcaptrim = state->captrim; 180 state->fcaptrim = state->captrim;
195 181
182
183
196 } 184 }
197 state->captrim += (step_sign * state->step); 185 state->captrim += (step_sign * state->step);
198 186
@@ -213,7 +201,7 @@ static int dib0070_captrim(struct dib0070_state *state, enum frontend_tune_state
213static int dib0070_set_ctrl_lo5(struct dvb_frontend *fe, u8 vco_bias_trim, u8 hf_div_trim, u8 cp_current, u8 third_order_filt) 201static int dib0070_set_ctrl_lo5(struct dvb_frontend *fe, u8 vco_bias_trim, u8 hf_div_trim, u8 cp_current, u8 third_order_filt)
214{ 202{
215 struct dib0070_state *state = fe->tuner_priv; 203 struct dib0070_state *state = fe->tuner_priv;
216 u16 lo5 = (third_order_filt << 14) | (0 << 13) | (1 << 12) | (3 << 9) | (cp_current << 6) | (hf_div_trim << 3) | (vco_bias_trim << 0); 204 u16 lo5 = (third_order_filt << 14) | (0 << 13) | (1 << 12) | (3 << 9) | (cp_current << 6) | (hf_div_trim << 3) | (vco_bias_trim << 0);
217 dprintk("CTRL_LO5: 0x%x", lo5); 205 dprintk("CTRL_LO5: 0x%x", lo5);
218 return dib0070_write_reg(state, 0x15, lo5); 206 return dib0070_write_reg(state, 0x15, lo5);
219} 207}
@@ -227,99 +215,99 @@ void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open)
227 dib0070_write_reg(state, 0x1a, 0x0000); 215 dib0070_write_reg(state, 0x1a, 0x0000);
228 } else { 216 } else {
229 dib0070_write_reg(state, 0x1b, 0x4112); 217 dib0070_write_reg(state, 0x1b, 0x4112);
230 if (state->cfg->vga_filter != 0) { 218 if (state->cfg->vga_filter != 0) {
231 dib0070_write_reg(state, 0x1a, state->cfg->vga_filter); 219 dib0070_write_reg(state, 0x1a, state->cfg->vga_filter);
232 dprintk("vga filter register is set to %x", state->cfg->vga_filter); 220 dprintk("vga filter register is set to %x", state->cfg->vga_filter);
233 } else 221 } else
234 dib0070_write_reg(state, 0x1a, 0x0009); 222 dib0070_write_reg(state, 0x1a, 0x0009);
235 } 223 }
236} 224}
237 225
238EXPORT_SYMBOL(dib0070_ctrl_agc_filter); 226EXPORT_SYMBOL(dib0070_ctrl_agc_filter);
239struct dib0070_tuning { 227struct dib0070_tuning {
240 u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ 228 u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */
241 u8 switch_trim; 229 u8 switch_trim;
242 u8 vco_band; 230 u8 vco_band;
243 u8 hfdiv; 231 u8 hfdiv;
244 u8 vco_multi; 232 u8 vco_multi;
245 u8 presc; 233 u8 presc;
246 u8 wbdmux; 234 u8 wbdmux;
247 u16 tuner_enable; 235 u16 tuner_enable;
248}; 236};
249 237
250struct dib0070_lna_match { 238struct dib0070_lna_match {
251 u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */ 239 u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */
252 u8 lna_band; 240 u8 lna_band;
253}; 241};
254 242
255static const struct dib0070_tuning dib0070s_tuning_table[] = { 243static const struct dib0070_tuning dib0070s_tuning_table[] = {
256 {570000, 2, 1, 3, 6, 6, 2, 0x4000 | 0x0800}, /* UHF */ 244 { 570000, 2, 1, 3, 6, 6, 2, 0x4000 | 0x0800 }, /* UHF */
257 {700000, 2, 0, 2, 4, 2, 2, 0x4000 | 0x0800}, 245 { 700000, 2, 0, 2, 4, 2, 2, 0x4000 | 0x0800 },
258 {863999, 2, 1, 2, 4, 2, 2, 0x4000 | 0x0800}, 246 { 863999, 2, 1, 2, 4, 2, 2, 0x4000 | 0x0800 },
259 {1500000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400}, /* LBAND */ 247 { 1500000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400 }, /* LBAND */
260 {1600000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400}, 248 { 1600000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400 },
261 {2000000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400}, 249 { 2000000, 0, 1, 1, 2, 2, 4, 0x2000 | 0x0400 },
262 {0xffffffff, 0, 0, 8, 1, 2, 1, 0x8000 | 0x1000}, /* SBAND */ 250 { 0xffffffff, 0, 0, 8, 1, 2, 1, 0x8000 | 0x1000 }, /* SBAND */
263}; 251};
264 252
265static const struct dib0070_tuning dib0070_tuning_table[] = { 253static const struct dib0070_tuning dib0070_tuning_table[] = {
266 {115000, 1, 0, 7, 24, 2, 1, 0x8000 | 0x1000}, /* FM below 92MHz cannot be tuned */ 254 { 115000, 1, 0, 7, 24, 2, 1, 0x8000 | 0x1000 }, /* FM below 92MHz cannot be tuned */
267 {179500, 1, 0, 3, 16, 2, 1, 0x8000 | 0x1000}, /* VHF */ 255 { 179500, 1, 0, 3, 16, 2, 1, 0x8000 | 0x1000 }, /* VHF */
268 {189999, 1, 1, 3, 16, 2, 1, 0x8000 | 0x1000}, 256 { 189999, 1, 1, 3, 16, 2, 1, 0x8000 | 0x1000 },
269 {250000, 1, 0, 6, 12, 2, 1, 0x8000 | 0x1000}, 257 { 250000, 1, 0, 6, 12, 2, 1, 0x8000 | 0x1000 },
270 {569999, 2, 1, 5, 6, 2, 2, 0x4000 | 0x0800}, /* UHF */ 258 { 569999, 2, 1, 5, 6, 2, 2, 0x4000 | 0x0800 }, /* UHF */
271 {699999, 2, 0, 1, 4, 2, 2, 0x4000 | 0x0800}, 259 { 699999, 2, 0, 1, 4, 2, 2, 0x4000 | 0x0800 },
272 {863999, 2, 1, 1, 4, 2, 2, 0x4000 | 0x0800}, 260 { 863999, 2, 1, 1, 4, 2, 2, 0x4000 | 0x0800 },
273 {0xffffffff, 0, 1, 0, 2, 2, 4, 0x2000 | 0x0400}, /* LBAND or everything higher than UHF */ 261 { 0xffffffff, 0, 1, 0, 2, 2, 4, 0x2000 | 0x0400 }, /* LBAND or everything higher than UHF */
274}; 262};
275 263
276static const struct dib0070_lna_match dib0070_lna_flip_chip[] = { 264static const struct dib0070_lna_match dib0070_lna_flip_chip[] = {
277 {180000, 0}, /* VHF */ 265 { 180000, 0 }, /* VHF */
278 {188000, 1}, 266 { 188000, 1 },
279 {196400, 2}, 267 { 196400, 2 },
280 {250000, 3}, 268 { 250000, 3 },
281 {550000, 0}, /* UHF */ 269 { 550000, 0 }, /* UHF */
282 {590000, 1}, 270 { 590000, 1 },
283 {666000, 3}, 271 { 666000, 3 },
284 {864000, 5}, 272 { 864000, 5 },
285 {1500000, 0}, /* LBAND or everything higher than UHF */ 273 { 1500000, 0 }, /* LBAND or everything higher than UHF */
286 {1600000, 1}, 274 { 1600000, 1 },
287 {2000000, 3}, 275 { 2000000, 3 },
288 {0xffffffff, 7}, 276 { 0xffffffff, 7 },
289}; 277};
290 278
291static const struct dib0070_lna_match dib0070_lna[] = { 279static const struct dib0070_lna_match dib0070_lna[] = {
292 {180000, 0}, /* VHF */ 280 { 180000, 0 }, /* VHF */
293 {188000, 1}, 281 { 188000, 1 },
294 {196400, 2}, 282 { 196400, 2 },
295 {250000, 3}, 283 { 250000, 3 },
296 {550000, 2}, /* UHF */ 284 { 550000, 2 }, /* UHF */
297 {650000, 3}, 285 { 650000, 3 },
298 {750000, 5}, 286 { 750000, 5 },
299 {850000, 6}, 287 { 850000, 6 },
300 {864000, 7}, 288 { 864000, 7 },
301 {1500000, 0}, /* LBAND or everything higher than UHF */ 289 { 1500000, 0 }, /* LBAND or everything higher than UHF */
302 {1600000, 1}, 290 { 1600000, 1 },
303 {2000000, 3}, 291 { 2000000, 3 },
304 {0xffffffff, 7}, 292 { 0xffffffff, 7 },
305}; 293};
306 294
307#define LPF 100 // define for the loop filter 100kHz by default 16-07-06 295#define LPF 100
308static int dib0070_tune_digital(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch) 296static int dib0070_tune_digital(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch)
309{ 297{
310 struct dib0070_state *state = fe->tuner_priv; 298 struct dib0070_state *state = fe->tuner_priv;
311 299
312 const struct dib0070_tuning *tune; 300 const struct dib0070_tuning *tune;
313 const struct dib0070_lna_match *lna_match; 301 const struct dib0070_lna_match *lna_match;
314 302
315 enum frontend_tune_state *tune_state = &state->tune_state; 303 enum frontend_tune_state *tune_state = &state->tune_state;
316 int ret = 10; /* 1ms is the default delay most of the time */ 304 int ret = 10; /* 1ms is the default delay most of the time */
317 305
318 u8 band = (u8) BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000); 306 u8 band = (u8)BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency/1000);
319 u32 freq = fe->dtv_property_cache.frequency / 1000 + (band == BAND_VHF ? state->cfg->freq_offset_khz_vhf : state->cfg->freq_offset_khz_uhf); 307 u32 freq = fe->dtv_property_cache.frequency/1000 + (band == BAND_VHF ? state->cfg->freq_offset_khz_vhf : state->cfg->freq_offset_khz_uhf);
320 308
321#ifdef CONFIG_SYS_ISDBT 309#ifdef CONFIG_SYS_ISDBT
322 if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT && state->fe->dtv_property_cache.isdbt_sb_mode == 1) 310 if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT && state->fe->dtv_property_cache.isdbt_sb_mode == 1)
323 if (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) 311 if (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2)
324 && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1))) 312 && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))
325 || (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) == 0) 313 || (((state->fe->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
@@ -328,172 +316,180 @@ static int dib0070_tune_digital(struct dvb_frontend *fe, struct dvb_frontend_par
328 && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))) 316 && (state->fe->dtv_property_cache.isdbt_sb_segment_idx == ((state->fe->dtv_property_cache.isdbt_sb_segment_count / 2) + 1))))
329 freq += 850; 317 freq += 850;
330#endif 318#endif
319 if (state->current_rf != freq) {
320
321 switch (state->revision) {
322 case DIB0070S_P1A:
323 tune = dib0070s_tuning_table;
324 lna_match = dib0070_lna;
325 break;
326 default:
327 tune = dib0070_tuning_table;
328 if (state->cfg->flip_chip)
329 lna_match = dib0070_lna_flip_chip;
330 else
331 lna_match = dib0070_lna;
332 break;
333 }
334 while (freq > tune->max_freq) /* find the right one */
335 tune++;
336 while (freq > lna_match->max_freq) /* find the right one */
337 lna_match++;
338
339 state->current_tune_table_index = tune;
340 state->lna_match = lna_match;
341 }
342
343 if (*tune_state == CT_TUNER_START) {
344 dprintk("Tuning for Band: %hd (%d kHz)", band, freq);
331 if (state->current_rf != freq) { 345 if (state->current_rf != freq) {
346 u8 REFDIV;
347 u32 FBDiv, Rest, FREF, VCOF_kHz;
348 u8 Den;
349
350 state->current_rf = freq;
351 state->lo4 = (state->current_tune_table_index->vco_band << 11) | (state->current_tune_table_index->hfdiv << 7);
352
353
354 dib0070_write_reg(state, 0x17, 0x30);
355
356
357 VCOF_kHz = state->current_tune_table_index->vco_multi * freq * 2;
358
359 switch (band) {
360 case BAND_VHF:
361 REFDIV = (u8) ((state->cfg->clock_khz + 9999) / 10000);
362 break;
363 case BAND_FM:
364 REFDIV = (u8) ((state->cfg->clock_khz) / 1000);
365 break;
366 default:
367 REFDIV = (u8) (state->cfg->clock_khz / 10000);
368 break;
369 }
370 FREF = state->cfg->clock_khz / REFDIV;
371
372
332 373
333 switch (state->revision) { 374 switch (state->revision) {
334 case DIB0070S_P1A: 375 case DIB0070S_P1A:
335 tune = dib0070s_tuning_table; 376 FBDiv = (VCOF_kHz / state->current_tune_table_index->presc / FREF);
336 lna_match = dib0070_lna; 377 Rest = (VCOF_kHz / state->current_tune_table_index->presc) - FBDiv * FREF;
337 break; 378 break;
379
380 case DIB0070_P1G:
381 case DIB0070_P1F:
338 default: 382 default:
339 tune = dib0070_tuning_table; 383 FBDiv = (freq / (FREF / 2));
340 if (state->cfg->flip_chip) 384 Rest = 2 * freq - FBDiv * FREF;
341 lna_match = dib0070_lna_flip_chip;
342 else
343 lna_match = dib0070_lna;
344 break; 385 break;
345 } 386 }
346 while (freq > tune->max_freq) /* find the right one */
347 tune++;
348 while (freq > lna_match->max_freq) /* find the right one */
349 lna_match++;
350 387
351 state->current_tune_table_index = tune; 388 if (Rest < LPF)
352 state->lna_match = lna_match; 389 Rest = 0;
353 } 390 else if (Rest < 2 * LPF)
391 Rest = 2 * LPF;
392 else if (Rest > (FREF - LPF)) {
393 Rest = 0;
394 FBDiv += 1;
395 } else if (Rest > (FREF - 2 * LPF))
396 Rest = FREF - 2 * LPF;
397 Rest = (Rest * 6528) / (FREF / 10);
398
399 Den = 1;
400 if (Rest > 0) {
401 state->lo4 |= (1 << 14) | (1 << 12);
402 Den = 255;
403 }
404
354 405
355 if (*tune_state == CT_TUNER_START) { 406 dib0070_write_reg(state, 0x11, (u16)FBDiv);
356 dprintk("Tuning for Band: %hd (%d kHz)", band, freq); 407 dib0070_write_reg(state, 0x12, (Den << 8) | REFDIV);
357 if (state->current_rf != freq) { 408 dib0070_write_reg(state, 0x13, (u16) Rest);
358 u8 REFDIV; 409
359 u32 FBDiv, Rest, FREF, VCOF_kHz; 410 if (state->revision == DIB0070S_P1A) {
360 u8 Den; 411
361 412 if (band == BAND_SBAND) {
362 state->current_rf = freq; 413 dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0);
363 state->lo4 = (state->current_tune_table_index->vco_band << 11) | (state->current_tune_table_index->hfdiv << 7); 414 dib0070_write_reg(state, 0x1d, 0xFFFF);
364 415 } else
365 dib0070_write_reg(state, 0x17, 0x30); 416 dib0070_set_ctrl_lo5(fe, 5, 4, 3, 1);
366
367 VCOF_kHz = state->current_tune_table_index->vco_multi * freq * 2;
368
369 switch (band) {
370 case BAND_VHF:
371 REFDIV = (u8) ((state->cfg->clock_khz + 9999) / 10000);
372 break;
373 case BAND_FM:
374 REFDIV = (u8) ((state->cfg->clock_khz) / 1000);
375 break;
376 default:
377 REFDIV = (u8) (state->cfg->clock_khz / 10000);
378 break;
379 }
380 FREF = state->cfg->clock_khz / REFDIV;
381
382 switch (state->revision) {
383 case DIB0070S_P1A:
384 FBDiv = (VCOF_kHz / state->current_tune_table_index->presc / FREF);
385 Rest = (VCOF_kHz / state->current_tune_table_index->presc) - FBDiv * FREF;
386 break;
387
388 case DIB0070_P1G:
389 case DIB0070_P1F:
390 default:
391 FBDiv = (freq / (FREF / 2));
392 Rest = 2 * freq - FBDiv * FREF;
393 break;
394 }
395
396 if (Rest < LPF)
397 Rest = 0;
398 else if (Rest < 2 * LPF)
399 Rest = 2 * LPF;
400 else if (Rest > (FREF - LPF)) {
401 Rest = 0;
402 FBDiv += 1;
403 } else if (Rest > (FREF - 2 * LPF))
404 Rest = FREF - 2 * LPF;
405 Rest = (Rest * 6528) / (FREF / 10);
406
407 Den = 1;
408 if (Rest > 0) {
409 state->lo4 |= (1 << 14) | (1 << 12);
410 Den = 255;
411 }
412
413 dib0070_write_reg(state, 0x11, (u16) FBDiv);
414 dib0070_write_reg(state, 0x12, (Den << 8) | REFDIV);
415 dib0070_write_reg(state, 0x13, (u16) Rest);
416
417 if (state->revision == DIB0070S_P1A) {
418
419 if (band == BAND_SBAND) {
420 dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0);
421 dib0070_write_reg(state, 0x1d, 0xFFFF);
422 } else
423 dib0070_set_ctrl_lo5(fe, 5, 4, 3, 1);
424 }
425
426 dib0070_write_reg(state, 0x20,
427 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001 | state->current_tune_table_index->tuner_enable);
428
429 dprintk("REFDIV: %hd, FREF: %d", REFDIV, FREF);
430 dprintk("FBDIV: %d, Rest: %d", FBDiv, Rest);
431 dprintk("Num: %hd, Den: %hd, SD: %hd", (u16) Rest, Den, (state->lo4 >> 12) & 0x1);
432 dprintk("HFDIV code: %hd", state->current_tune_table_index->hfdiv);
433 dprintk("VCO = %hd", state->current_tune_table_index->vco_band);
434 dprintk("VCOF: ((%hd*%d) << 1))", state->current_tune_table_index->vco_multi, freq);
435
436 *tune_state = CT_TUNER_STEP_0;
437 } else { /* we are already tuned to this frequency - the configuration is correct */
438 ret = 50; /* wakeup time */
439 *tune_state = CT_TUNER_STEP_5;
440 } 417 }
441 } else if ((*tune_state > CT_TUNER_START) && (*tune_state < CT_TUNER_STEP_4)) {
442 418
443 ret = dib0070_captrim(state, tune_state); 419 dib0070_write_reg(state, 0x20,
420 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001 | state->current_tune_table_index->tuner_enable);
444 421
445 } else if (*tune_state == CT_TUNER_STEP_4) { 422 dprintk("REFDIV: %hd, FREF: %d", REFDIV, FREF);
446 const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain; 423 dprintk("FBDIV: %d, Rest: %d", FBDiv, Rest);
447 if (tmp != NULL) { 424 dprintk("Num: %hd, Den: %hd, SD: %hd", (u16) Rest, Den, (state->lo4 >> 12) & 0x1);
448 while (freq / 1000 > tmp->freq) /* find the right one */ 425 dprintk("HFDIV code: %hd", state->current_tune_table_index->hfdiv);
449 tmp++; 426 dprintk("VCO = %hd", state->current_tune_table_index->vco_band);
450 dib0070_write_reg(state, 0x0f, 427 dprintk("VCOF: ((%hd*%d) << 1))", state->current_tune_table_index->vco_multi, freq);
451 (0 << 15) | (1 << 14) | (3 << 12) | (tmp->wbd_gain_val << 9) | (0 << 8) | (1 << 7) | (state-> 428
452 current_tune_table_index-> 429 *tune_state = CT_TUNER_STEP_0;
453 wbdmux << 0)); 430 } else { /* we are already tuned to this frequency - the configuration is correct */
454 state->wbd_gain_current = tmp->wbd_gain_val; 431 ret = 50; /* wakeup time */
455 } else { 432 *tune_state = CT_TUNER_STEP_5;
433 }
434 } else if ((*tune_state > CT_TUNER_START) && (*tune_state < CT_TUNER_STEP_4)) {
435
436 ret = dib0070_captrim(state, tune_state);
437
438 } else if (*tune_state == CT_TUNER_STEP_4) {
439 const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain;
440 if (tmp != NULL) {
441 while (freq/1000 > tmp->freq) /* find the right one */
442 tmp++;
443 dib0070_write_reg(state, 0x0f,
444 (0 << 15) | (1 << 14) | (3 << 12)
445 | (tmp->wbd_gain_val << 9) | (0 << 8) | (1 << 7)
446 | (state->current_tune_table_index->wbdmux << 0));
447 state->wbd_gain_current = tmp->wbd_gain_val;
448 } else {
456 dib0070_write_reg(state, 0x0f, 449 dib0070_write_reg(state, 0x0f,
457 (0 << 15) | (1 << 14) | (3 << 12) | (6 << 9) | (0 << 8) | (1 << 7) | (state->current_tune_table_index-> 450 (0 << 15) | (1 << 14) | (3 << 12) | (6 << 9) | (0 << 8) | (1 << 7) | (state->current_tune_table_index->
458 wbdmux << 0)); 451 wbdmux << 0));
459 state->wbd_gain_current = 6; 452 state->wbd_gain_current = 6;
460 } 453 }
461 454
462 dib0070_write_reg(state, 0x06, 0x3fff); 455 dib0070_write_reg(state, 0x06, 0x3fff);
463 dib0070_write_reg(state, 0x07, 456 dib0070_write_reg(state, 0x07,
464 (state->current_tune_table_index->switch_trim << 11) | (7 << 8) | (state->lna_match->lna_band << 3) | (3 << 0)); 457 (state->current_tune_table_index->switch_trim << 11) | (7 << 8) | (state->lna_match->lna_band << 3) | (3 << 0));
465 dib0070_write_reg(state, 0x08, (state->lna_match->lna_band << 10) | (3 << 7) | (127)); 458 dib0070_write_reg(state, 0x08, (state->lna_match->lna_band << 10) | (3 << 7) | (127));
466 dib0070_write_reg(state, 0x0d, 0x0d80); 459 dib0070_write_reg(state, 0x0d, 0x0d80);
467 460
468 dib0070_write_reg(state, 0x18, 0x07ff);
469 dib0070_write_reg(state, 0x17, 0x0033);
470 461
471 *tune_state = CT_TUNER_STEP_5; 462 dib0070_write_reg(state, 0x18, 0x07ff);
472 } else if (*tune_state == CT_TUNER_STEP_5) { 463 dib0070_write_reg(state, 0x17, 0x0033);
473 dib0070_set_bandwidth(fe, ch); 464
474 *tune_state = CT_TUNER_STOP; 465
475 } else { 466 *tune_state = CT_TUNER_STEP_5;
476 ret = FE_CALLBACK_TIME_NEVER; /* tuner finished, time to call again infinite */ 467 } else if (*tune_state == CT_TUNER_STEP_5) {
477 } 468 dib0070_set_bandwidth(fe, ch);
478 return ret; 469 *tune_state = CT_TUNER_STOP;
470 } else {
471 ret = FE_CALLBACK_TIME_NEVER; /* tuner finished, time to call again infinite */
472 }
473 return ret;
479} 474}
480 475
476
481static int dib0070_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) 477static int dib0070_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
482{ 478{
483 struct dib0070_state *state = fe->tuner_priv; 479 struct dib0070_state *state = fe->tuner_priv;
484 uint32_t ret; 480 uint32_t ret;
485 481
486 state->tune_state = CT_TUNER_START; 482 state->tune_state = CT_TUNER_START;
487 483
488 do { 484 do {
489 ret = dib0070_tune_digital(fe, p); 485 ret = dib0070_tune_digital(fe, p);
490 if (ret != FE_CALLBACK_TIME_NEVER) 486 if (ret != FE_CALLBACK_TIME_NEVER)
491 msleep(ret / 10); 487 msleep(ret/10);
492 else 488 else
493 break; 489 break;
494 } while (state->tune_state != CT_TUNER_STOP); 490 } while (state->tune_state != CT_TUNER_STOP);
495 491
496 return 0; 492 return 0;
497} 493}
498 494
499static int dib0070_wakeup(struct dvb_frontend *fe) 495static int dib0070_wakeup(struct dvb_frontend *fe)
@@ -512,92 +508,113 @@ static int dib0070_sleep(struct dvb_frontend *fe)
512 return 0; 508 return 0;
513} 509}
514 510
515static const u16 dib0070_p1f_defaults[] = { 511u8 dib0070_get_rf_output(struct dvb_frontend *fe)
512{
513 struct dib0070_state *state = fe->tuner_priv;
514 return (dib0070_read_reg(state, 0x07) >> 11) & 0x3;
515}
516EXPORT_SYMBOL(dib0070_get_rf_output);
517
518int dib0070_set_rf_output(struct dvb_frontend *fe, u8 no)
519{
520 struct dib0070_state *state = fe->tuner_priv;
521 u16 rxrf2 = dib0070_read_reg(state, 0x07) & 0xfe7ff;
522 if (no > 3)
523 no = 3;
524 if (no < 1)
525 no = 1;
526 return dib0070_write_reg(state, 0x07, rxrf2 | (no << 11));
527}
528EXPORT_SYMBOL(dib0070_set_rf_output);
529
530static const u16 dib0070_p1f_defaults[] =
531
532{
516 7, 0x02, 533 7, 0x02,
517 0x0008, 534 0x0008,
518 0x0000, 535 0x0000,
519 0x0000, 536 0x0000,
520 0x0000, 537 0x0000,
521 0x0000, 538 0x0000,
522 0x0002, 539 0x0002,
523 0x0100, 540 0x0100,
524 541
525 3, 0x0d, 542 3, 0x0d,
526 0x0d80, 543 0x0d80,
527 0x0001, 544 0x0001,
528 0x0000, 545 0x0000,
529 546
530 4, 0x11, 547 4, 0x11,
531 0x0000, 548 0x0000,
532 0x0103, 549 0x0103,
533 0x0000, 550 0x0000,
534 0x0000, 551 0x0000,
535 552
536 3, 0x16, 553 3, 0x16,
537 0x0004 | 0x0040, 554 0x0004 | 0x0040,
538 0x0030, 555 0x0030,
539 0x07ff, 556 0x07ff,
540 557
541 6, 0x1b, 558 6, 0x1b,
542 0x4112, 559 0x4112,
543 0xff00, 560 0xff00,
544 0xc07f, 561 0xc07f,
545 0x0000, 562 0x0000,
546 0x0180, 563 0x0180,
547 0x4000 | 0x0800 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001, 564 0x4000 | 0x0800 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001,
548 565
549 0, 566 0,
550}; 567};
551 568
552static u16 dib0070_read_wbd_offset(struct dib0070_state *state, u8 gain) 569static u16 dib0070_read_wbd_offset(struct dib0070_state *state, u8 gain)
553{ 570{
554 u16 tuner_en = dib0070_read_reg(state, 0x20); 571 u16 tuner_en = dib0070_read_reg(state, 0x20);
555 u16 offset; 572 u16 offset;
556 573
557 dib0070_write_reg(state, 0x18, 0x07ff); 574 dib0070_write_reg(state, 0x18, 0x07ff);
558 dib0070_write_reg(state, 0x20, 0x0800 | 0x4000 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001); 575 dib0070_write_reg(state, 0x20, 0x0800 | 0x4000 | 0x0040 | 0x0020 | 0x0010 | 0x0008 | 0x0002 | 0x0001);
559 dib0070_write_reg(state, 0x0f, (1 << 14) | (2 << 12) | (gain << 9) | (1 << 8) | (1 << 7) | (0 << 0)); 576 dib0070_write_reg(state, 0x0f, (1 << 14) | (2 << 12) | (gain << 9) | (1 << 8) | (1 << 7) | (0 << 0));
560 msleep(9); 577 msleep(9);
561 offset = dib0070_read_reg(state, 0x19); 578 offset = dib0070_read_reg(state, 0x19);
562 dib0070_write_reg(state, 0x20, tuner_en); 579 dib0070_write_reg(state, 0x20, tuner_en);
563 return offset; 580 return offset;
564} 581}
565 582
566static void dib0070_wbd_offset_calibration(struct dib0070_state *state) 583static void dib0070_wbd_offset_calibration(struct dib0070_state *state)
567{ 584{
568 u8 gain; 585 u8 gain;
569 for (gain = 6; gain < 8; gain++) { 586 for (gain = 6; gain < 8; gain++) {
570 state->wbd_offset_3_3[gain - 6] = ((dib0070_read_wbd_offset(state, gain) * 8 * 18 / 33 + 1) / 2); 587 state->wbd_offset_3_3[gain - 6] = ((dib0070_read_wbd_offset(state, gain) * 8 * 18 / 33 + 1) / 2);
571 dprintk("Gain: %d, WBDOffset (3.3V) = %hd", gain, state->wbd_offset_3_3[gain - 6]); 588 dprintk("Gain: %d, WBDOffset (3.3V) = %hd", gain, state->wbd_offset_3_3[gain-6]);
572 } 589 }
573} 590}
574 591
575u16 dib0070_wbd_offset(struct dvb_frontend *fe) 592u16 dib0070_wbd_offset(struct dvb_frontend *fe)
576{ 593{
577 struct dib0070_state *state = fe->tuner_priv; 594 struct dib0070_state *state = fe->tuner_priv;
578 const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain; 595 const struct dib0070_wbd_gain_cfg *tmp = state->cfg->wbd_gain;
579 u32 freq = fe->dtv_property_cache.frequency / 1000; 596 u32 freq = fe->dtv_property_cache.frequency/1000;
580 597
581 if (tmp != NULL) { 598 if (tmp != NULL) {
582 while (freq / 1000 > tmp->freq) /* find the right one */ 599 while (freq/1000 > tmp->freq) /* find the right one */
583 tmp++; 600 tmp++;
584 state->wbd_gain_current = tmp->wbd_gain_val; 601 state->wbd_gain_current = tmp->wbd_gain_val;
585 } else 602 } else
586 state->wbd_gain_current = 6; 603 state->wbd_gain_current = 6;
587 604
588 return state->wbd_offset_3_3[state->wbd_gain_current - 6]; 605 return state->wbd_offset_3_3[state->wbd_gain_current - 6];
589} 606}
590
591EXPORT_SYMBOL(dib0070_wbd_offset); 607EXPORT_SYMBOL(dib0070_wbd_offset);
592 608
593#define pgm_read_word(w) (*w) 609#define pgm_read_word(w) (*w)
594static int dib0070_reset(struct dvb_frontend *fe) 610static int dib0070_reset(struct dvb_frontend *fe)
595{ 611{
596 struct dib0070_state *state = fe->tuner_priv; 612 struct dib0070_state *state = fe->tuner_priv;
597 u16 l, r, *n; 613 u16 l, r, *n;
598 614
599 HARD_RESET(state); 615 HARD_RESET(state);
600 616
617
601#ifndef FORCE_SBAND_TUNER 618#ifndef FORCE_SBAND_TUNER
602 if ((dib0070_read_reg(state, 0x22) >> 9) & 0x1) 619 if ((dib0070_read_reg(state, 0x22) >> 9) & 0x1)
603 state->revision = (dib0070_read_reg(state, 0x1f) >> 8) & 0xff; 620 state->revision = (dib0070_read_reg(state, 0x1f) >> 8) & 0xff;
@@ -605,7 +622,7 @@ static int dib0070_reset(struct dvb_frontend *fe)
605#else 622#else
606#warning forcing SBAND 623#warning forcing SBAND
607#endif 624#endif
608 state->revision = DIB0070S_P1A; 625 state->revision = DIB0070S_P1A;
609 626
610 /* P1F or not */ 627 /* P1F or not */
611 dprintk("Revision: %x", state->revision); 628 dprintk("Revision: %x", state->revision);
@@ -620,7 +637,7 @@ static int dib0070_reset(struct dvb_frontend *fe)
620 while (l) { 637 while (l) {
621 r = pgm_read_word(n++); 638 r = pgm_read_word(n++);
622 do { 639 do {
623 dib0070_write_reg(state, (u8) r, pgm_read_word(n++)); 640 dib0070_write_reg(state, (u8)r, pgm_read_word(n++));
624 r++; 641 r++;
625 } while (--l); 642 } while (--l);
626 l = pgm_read_word(n++); 643 l = pgm_read_word(n++);
@@ -633,6 +650,7 @@ static int dib0070_reset(struct dvb_frontend *fe)
633 else 650 else
634 r = 2; 651 r = 2;
635 652
653
636 r |= state->cfg->osc_buffer_state << 3; 654 r |= state->cfg->osc_buffer_state << 3;
637 655
638 dib0070_write_reg(state, 0x10, r); 656 dib0070_write_reg(state, 0x10, r);
@@ -643,16 +661,24 @@ static int dib0070_reset(struct dvb_frontend *fe)
643 dib0070_write_reg(state, 0x02, r | (1 << 5)); 661 dib0070_write_reg(state, 0x02, r | (1 << 5));
644 } 662 }
645 663
646 if (state->revision == DIB0070S_P1A) 664 if (state->revision == DIB0070S_P1A)
647 dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0); 665 dib0070_set_ctrl_lo5(fe, 2, 4, 3, 0);
648 else 666 else
649 dib0070_set_ctrl_lo5(fe, 5, 4, state->cfg->charge_pump, state->cfg->enable_third_order_filter); 667 dib0070_set_ctrl_lo5(fe, 5, 4, state->cfg->charge_pump, state->cfg->enable_third_order_filter);
650 668
651 dib0070_write_reg(state, 0x01, (54 << 9) | 0xc8); 669 dib0070_write_reg(state, 0x01, (54 << 9) | 0xc8);
652 670
653 dib0070_wbd_offset_calibration(state); 671 dib0070_wbd_offset_calibration(state);
654 672
655 return 0; 673 return 0;
674}
675
676static int dib0070_get_frequency(struct dvb_frontend *fe, u32 *frequency)
677{
678 struct dib0070_state *state = fe->tuner_priv;
679
680 *frequency = 1000 * state->current_rf;
681 return 0;
656} 682}
657 683
658static int dib0070_release(struct dvb_frontend *fe) 684static int dib0070_release(struct dvb_frontend *fe)
@@ -664,18 +690,18 @@ static int dib0070_release(struct dvb_frontend *fe)
664 690
665static const struct dvb_tuner_ops dib0070_ops = { 691static const struct dvb_tuner_ops dib0070_ops = {
666 .info = { 692 .info = {
667 .name = "DiBcom DiB0070", 693 .name = "DiBcom DiB0070",
668 .frequency_min = 45000000, 694 .frequency_min = 45000000,
669 .frequency_max = 860000000, 695 .frequency_max = 860000000,
670 .frequency_step = 1000, 696 .frequency_step = 1000,
671 }, 697 },
672 .release = dib0070_release, 698 .release = dib0070_release,
673 699
674 .init = dib0070_wakeup, 700 .init = dib0070_wakeup,
675 .sleep = dib0070_sleep, 701 .sleep = dib0070_sleep,
676 .set_params = dib0070_tune, 702 .set_params = dib0070_tune,
677 703
678// .get_frequency = dib0070_get_frequency, 704 .get_frequency = dib0070_get_frequency,
679// .get_bandwidth = dib0070_get_bandwidth 705// .get_bandwidth = dib0070_get_bandwidth
680}; 706};
681 707
@@ -687,7 +713,7 @@ struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter
687 713
688 state->cfg = cfg; 714 state->cfg = cfg;
689 state->i2c = i2c; 715 state->i2c = i2c;
690 state->fe = fe; 716 state->fe = fe;
691 fe->tuner_priv = state; 717 fe->tuner_priv = state;
692 718
693 if (dib0070_reset(fe) != 0) 719 if (dib0070_reset(fe) != 0)
@@ -699,12 +725,11 @@ struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter
699 fe->tuner_priv = state; 725 fe->tuner_priv = state;
700 return fe; 726 return fe;
701 727
702 free_mem: 728free_mem:
703 kfree(state); 729 kfree(state);
704 fe->tuner_priv = NULL; 730 fe->tuner_priv = NULL;
705 return NULL; 731 return NULL;
706} 732}
707
708EXPORT_SYMBOL(dib0070_attach); 733EXPORT_SYMBOL(dib0070_attach);
709 734
710MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); 735MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
diff --git a/drivers/media/dvb/frontends/dib0070.h b/drivers/media/dvb/frontends/dib0070.h
index eec9e52ffa75..45c31fae3967 100644
--- a/drivers/media/dvb/frontends/dib0070.h
+++ b/drivers/media/dvb/frontends/dib0070.h
@@ -52,6 +52,8 @@ struct dib0070_config {
52extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg); 52extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg);
53extern u16 dib0070_wbd_offset(struct dvb_frontend *); 53extern u16 dib0070_wbd_offset(struct dvb_frontend *);
54extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open); 54extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open);
55extern u8 dib0070_get_rf_output(struct dvb_frontend *fe);
56extern int dib0070_set_rf_output(struct dvb_frontend *fe, u8 no);
55#else 57#else
56static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg) 58static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg)
57{ 59{
@@ -62,7 +64,7 @@ static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struc
62static inline u16 dib0070_wbd_offset(struct dvb_frontend *fe) 64static inline u16 dib0070_wbd_offset(struct dvb_frontend *fe)
63{ 65{
64 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 66 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
65 return -ENODEV; 67 return 0;
66} 68}
67 69
68static inline void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open) 70static inline void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open)
diff --git a/drivers/media/dvb/frontends/dib0090.c b/drivers/media/dvb/frontends/dib0090.c
new file mode 100644
index 000000000000..65240b7801e8
--- /dev/null
+++ b/drivers/media/dvb/frontends/dib0090.c
@@ -0,0 +1,1523 @@
1/*
2 * Linux-DVB Driver for DiBcom's DiB0090 base-band RF Tuner.
3 *
4 * Copyright (C) 2005-9 DiBcom (http://www.dibcom.fr/)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 *
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 *
22 * This code is more or less generated from another driver, please
23 * excuse some codingstyle oddities.
24 *
25 */
26
27#include <linux/kernel.h>
28#include <linux/slab.h>
29#include <linux/i2c.h>
30
31#include "dvb_frontend.h"
32
33#include "dib0090.h"
34#include "dibx000_common.h"
35
36static int debug;
37module_param(debug, int, 0644);
38MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
39
40#define dprintk(args...) do { \
41 if (debug) { \
42 printk(KERN_DEBUG "DiB0090: "); \
43 printk(args); \
44 printk("\n"); \
45 } \
46} while (0)
47
48#define CONFIG_SYS_ISDBT
49#define CONFIG_BAND_CBAND
50#define CONFIG_BAND_VHF
51#define CONFIG_BAND_UHF
52#define CONFIG_DIB0090_USE_PWM_AGC
53
54#define EN_LNA0 0x8000
55#define EN_LNA1 0x4000
56#define EN_LNA2 0x2000
57#define EN_LNA3 0x1000
58#define EN_MIX0 0x0800
59#define EN_MIX1 0x0400
60#define EN_MIX2 0x0200
61#define EN_MIX3 0x0100
62#define EN_IQADC 0x0040
63#define EN_PLL 0x0020
64#define EN_TX 0x0010
65#define EN_BB 0x0008
66#define EN_LO 0x0004
67#define EN_BIAS 0x0001
68
69#define EN_IQANA 0x0002
70#define EN_DIGCLK 0x0080 /* not in the 0x24 reg, only in 0x1b */
71#define EN_CRYSTAL 0x0002
72
73#define EN_UHF 0x22E9
74#define EN_VHF 0x44E9
75#define EN_LBD 0x11E9
76#define EN_SBD 0x44E9
77#define EN_CAB 0x88E9
78
79#define pgm_read_word(w) (*w)
80
81struct dc_calibration;
82
83struct dib0090_tuning {
84 u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */
85 u8 switch_trim;
86 u8 lna_tune;
87 u8 lna_bias;
88 u16 v2i;
89 u16 mix;
90 u16 load;
91 u16 tuner_enable;
92};
93
94struct dib0090_pll {
95 u32 max_freq; /* for every frequency less than or equal to that field: this information is correct */
96 u8 vco_band;
97 u8 hfdiv_code;
98 u8 hfdiv;
99 u8 topresc;
100};
101
102struct dib0090_state {
103 struct i2c_adapter *i2c;
104 struct dvb_frontend *fe;
105 const struct dib0090_config *config;
106
107 u8 current_band;
108 u16 revision;
109 enum frontend_tune_state tune_state;
110 u32 current_rf;
111
112 u16 wbd_offset;
113 s16 wbd_target; /* in dB */
114
115 s16 rf_gain_limit; /* take-over-point: where to split between bb and rf gain */
116 s16 current_gain; /* keeps the currently programmed gain */
117 u8 agc_step; /* new binary search */
118
119 u16 gain[2]; /* for channel monitoring */
120
121 const u16 *rf_ramp;
122 const u16 *bb_ramp;
123
124 /* for the software AGC ramps */
125 u16 bb_1_def;
126 u16 rf_lt_def;
127 u16 gain_reg[4];
128
129 /* for the captrim/dc-offset search */
130 s8 step;
131 s16 adc_diff;
132 s16 min_adc_diff;
133
134 s8 captrim;
135 s8 fcaptrim;
136
137 const struct dc_calibration *dc;
138 u16 bb6, bb7;
139
140 const struct dib0090_tuning *current_tune_table_index;
141 const struct dib0090_pll *current_pll_table_index;
142
143 u8 tuner_is_tuned;
144 u8 agc_freeze;
145
146 u8 reset;
147};
148
149static u16 dib0090_read_reg(struct dib0090_state *state, u8 reg)
150{
151 u8 b[2];
152 struct i2c_msg msg[2] = {
153 {.addr = state->config->i2c_address, .flags = 0, .buf = &reg, .len = 1},
154 {.addr = state->config->i2c_address, .flags = I2C_M_RD, .buf = b, .len = 2},
155 };
156 if (i2c_transfer(state->i2c, msg, 2) != 2) {
157 printk(KERN_WARNING "DiB0090 I2C read failed\n");
158 return 0;
159 }
160 return (b[0] << 8) | b[1];
161}
162
163static int dib0090_write_reg(struct dib0090_state *state, u32 reg, u16 val)
164{
165 u8 b[3] = { reg & 0xff, val >> 8, val & 0xff };
166 struct i2c_msg msg = {.addr = state->config->i2c_address, .flags = 0, .buf = b, .len = 3 };
167 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
168 printk(KERN_WARNING "DiB0090 I2C write failed\n");
169 return -EREMOTEIO;
170 }
171 return 0;
172}
173
174#define HARD_RESET(state) do { if (cfg->reset) { if (cfg->sleep) cfg->sleep(fe, 0); msleep(10); cfg->reset(fe, 1); msleep(10); cfg->reset(fe, 0); msleep(10); } } while (0)
175#define ADC_TARGET -220
176#define GAIN_ALPHA 5
177#define WBD_ALPHA 6
178#define LPF 100
179static void dib0090_write_regs(struct dib0090_state *state, u8 r, const u16 * b, u8 c)
180{
181 do {
182 dib0090_write_reg(state, r++, *b++);
183 } while (--c);
184}
185
186static u16 dib0090_identify(struct dvb_frontend *fe)
187{
188 struct dib0090_state *state = fe->tuner_priv;
189 u16 v;
190
191 v = dib0090_read_reg(state, 0x1a);
192
193#ifdef FIRMWARE_FIREFLY
194 /* pll is not locked locked */
195 if (!(v & 0x800))
196 dprintk("FE%d : Identification : pll is not yet locked", fe->id);
197#endif
198
199 /* without PLL lock info */
200 v &= 0x3ff;
201 dprintk("P/V: %04x:", v);
202
203 if ((v >> 8) & 0xf)
204 dprintk("FE%d : Product ID = 0x%x : KROSUS", fe->id, (v >> 8) & 0xf);
205 else
206 return 0xff;
207
208 v &= 0xff;
209 if (((v >> 5) & 0x7) == 0x1)
210 dprintk("FE%d : MP001 : 9090/8096", fe->id);
211 else if (((v >> 5) & 0x7) == 0x4)
212 dprintk("FE%d : MP005 : Single Sband", fe->id);
213 else if (((v >> 5) & 0x7) == 0x6)
214 dprintk("FE%d : MP008 : diversity VHF-UHF-LBAND", fe->id);
215 else if (((v >> 5) & 0x7) == 0x7)
216 dprintk("FE%d : MP009 : diversity 29098 CBAND-UHF-LBAND-SBAND", fe->id);
217 else
218 return 0xff;
219
220 /* revision only */
221 if ((v & 0x1f) == 0x3)
222 dprintk("FE%d : P1-D/E/F detected", fe->id);
223 else if ((v & 0x1f) == 0x1)
224 dprintk("FE%d : P1C detected", fe->id);
225 else if ((v & 0x1f) == 0x0) {
226#ifdef CONFIG_TUNER_DIB0090_P1B_SUPPORT
227 dprintk("FE%d : P1-A/B detected: using previous driver - support will be removed soon", fe->id);
228 dib0090_p1b_register(fe);
229#else
230 dprintk("FE%d : P1-A/B detected: driver is deactivated - not available", fe->id);
231 return 0xff;
232#endif
233 }
234
235 return v;
236}
237
238static void dib0090_reset_digital(struct dvb_frontend *fe, const struct dib0090_config *cfg)
239{
240 struct dib0090_state *state = fe->tuner_priv;
241
242 HARD_RESET(state);
243
244 dib0090_write_reg(state, 0x24, EN_PLL);
245 dib0090_write_reg(state, 0x1b, EN_DIGCLK | EN_PLL | EN_CRYSTAL); /* PLL, DIG_CLK and CRYSTAL remain */
246
247 /* adcClkOutRatio=8->7, release reset */
248 dib0090_write_reg(state, 0x20, ((cfg->io.adc_clock_ratio - 1) << 11) | (0 << 10) | (1 << 9) | (1 << 8) | (0 << 4) | 0);
249 if (cfg->clkoutdrive != 0)
250 dib0090_write_reg(state, 0x23,
251 (0 << 15) | ((!cfg->analog_output) << 14) | (1 << 10) | (1 << 9) | (0 << 8) | (cfg->clkoutdrive << 5) | (cfg->
252 clkouttobamse
253 << 4) | (0
254 <<
255 2)
256 | (0));
257 else
258 dib0090_write_reg(state, 0x23,
259 (0 << 15) | ((!cfg->analog_output) << 14) | (1 << 10) | (1 << 9) | (0 << 8) | (7 << 5) | (cfg->
260 clkouttobamse << 4) | (0
261 <<
262 2)
263 | (0));
264
265 /* enable pll, de-activate reset, ratio: 2/1 = 60MHz */
266 dib0090_write_reg(state, 0x21,
267 (cfg->io.pll_bypass << 15) | (1 << 13) | (cfg->io.pll_range << 12) | (cfg->io.pll_loopdiv << 6) | (cfg->io.pll_prediv));
268
269}
270
271static int dib0090_wakeup(struct dvb_frontend *fe)
272{
273 struct dib0090_state *state = fe->tuner_priv;
274 if (state->config->sleep)
275 state->config->sleep(fe, 0);
276 return 0;
277}
278
279static int dib0090_sleep(struct dvb_frontend *fe)
280{
281 struct dib0090_state *state = fe->tuner_priv;
282 if (state->config->sleep)
283 state->config->sleep(fe, 1);
284 return 0;
285}
286
287void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast)
288{
289 struct dib0090_state *state = fe->tuner_priv;
290 if (fast)
291 dib0090_write_reg(state, 0x04, 0);
292 else
293 dib0090_write_reg(state, 0x04, 1);
294}
295EXPORT_SYMBOL(dib0090_dcc_freq);
296
297static const u16 rf_ramp_pwm_cband[] = {
298 0, /* max RF gain in 10th of dB */
299 0, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x2b */
300 0, /* ramp_max = maximum X used on the ramp */
301 (0 << 10) | 0, /* 0x2c, LNA 1 = 0dB */
302 (0 << 10) | 0, /* 0x2d, LNA 1 */
303 (0 << 10) | 0, /* 0x2e, LNA 2 = 0dB */
304 (0 << 10) | 0, /* 0x2f, LNA 2 */
305 (0 << 10) | 0, /* 0x30, LNA 3 = 0dB */
306 (0 << 10) | 0, /* 0x31, LNA 3 */
307 (0 << 10) | 0, /* GAIN_4_1, LNA 4 = 0dB */
308 (0 << 10) | 0, /* GAIN_4_2, LNA 4 */
309};
310
311static const u16 rf_ramp_vhf[] = {
312 412, /* max RF gain in 10th of dB */
313 132, 307, 127, /* LNA1, 13.2dB */
314 105, 412, 255, /* LNA2, 10.5dB */
315 50, 50, 127, /* LNA3, 5dB */
316 125, 175, 127, /* LNA4, 12.5dB */
317 0, 0, 127, /* CBAND, 0dB */
318};
319
320static const u16 rf_ramp_uhf[] = {
321 412, /* max RF gain in 10th of dB */
322 132, 307, 127, /* LNA1 : total gain = 13.2dB, point on the ramp where this amp is full gain, value to write to get full gain */
323 105, 412, 255, /* LNA2 : 10.5 dB */
324 50, 50, 127, /* LNA3 : 5.0 dB */
325 125, 175, 127, /* LNA4 : 12.5 dB */
326 0, 0, 127, /* CBAND : 0.0 dB */
327};
328
329static const u16 rf_ramp_cband[] = {
330 332, /* max RF gain in 10th of dB */
331 132, 252, 127, /* LNA1, dB */
332 80, 332, 255, /* LNA2, dB */
333 0, 0, 127, /* LNA3, dB */
334 0, 0, 127, /* LNA4, dB */
335 120, 120, 127, /* LT1 CBAND */
336};
337
338static const u16 rf_ramp_pwm_vhf[] = {
339 404, /* max RF gain in 10th of dB */
340 25, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x2b */
341 1011, /* ramp_max = maximum X used on the ramp */
342 (6 << 10) | 417, /* 0x2c, LNA 1 = 13.2dB */
343 (0 << 10) | 756, /* 0x2d, LNA 1 */
344 (16 << 10) | 756, /* 0x2e, LNA 2 = 10.5dB */
345 (0 << 10) | 1011, /* 0x2f, LNA 2 */
346 (16 << 10) | 290, /* 0x30, LNA 3 = 5dB */
347 (0 << 10) | 417, /* 0x31, LNA 3 */
348 (7 << 10) | 0, /* GAIN_4_1, LNA 4 = 12.5dB */
349 (0 << 10) | 290, /* GAIN_4_2, LNA 4 */
350};
351
352static const u16 rf_ramp_pwm_uhf[] = {
353 404, /* max RF gain in 10th of dB */
354 25, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x2b */
355 1011, /* ramp_max = maximum X used on the ramp */
356 (6 << 10) | 417, /* 0x2c, LNA 1 = 13.2dB */
357 (0 << 10) | 756, /* 0x2d, LNA 1 */
358 (16 << 10) | 756, /* 0x2e, LNA 2 = 10.5dB */
359 (0 << 10) | 1011, /* 0x2f, LNA 2 */
360 (16 << 10) | 0, /* 0x30, LNA 3 = 5dB */
361 (0 << 10) | 127, /* 0x31, LNA 3 */
362 (7 << 10) | 127, /* GAIN_4_1, LNA 4 = 12.5dB */
363 (0 << 10) | 417, /* GAIN_4_2, LNA 4 */
364};
365
366static const u16 bb_ramp_boost[] = {
367 550, /* max BB gain in 10th of dB */
368 260, 260, 26, /* BB1, 26dB */
369 290, 550, 29, /* BB2, 29dB */
370};
371
372static const u16 bb_ramp_pwm_normal[] = {
373 500, /* max RF gain in 10th of dB */
374 8, /* ramp_slope = 1dB of gain -> clock_ticks_per_db = clk_khz / ramp_slope -> 0x34 */
375 400,
376 (2 << 9) | 0, /* 0x35 = 21dB */
377 (0 << 9) | 168, /* 0x36 */
378 (2 << 9) | 168, /* 0x37 = 29dB */
379 (0 << 9) | 400, /* 0x38 */
380};
381
382struct slope {
383 int16_t range;
384 int16_t slope;
385};
386static u16 slopes_to_scale(const struct slope *slopes, u8 num, s16 val)
387{
388 u8 i;
389 u16 rest;
390 u16 ret = 0;
391 for (i = 0; i < num; i++) {
392 if (val > slopes[i].range)
393 rest = slopes[i].range;
394 else
395 rest = val;
396 ret += (rest * slopes[i].slope) / slopes[i].range;
397 val -= rest;
398 }
399 return ret;
400}
401
402static const struct slope dib0090_wbd_slopes[3] = {
403 {66, 120}, /* -64,-52: offset - 65 */
404 {600, 170}, /* -52,-35: 65 - 665 */
405 {170, 250}, /* -45,-10: 665 - 835 */
406};
407
408static s16 dib0090_wbd_to_db(struct dib0090_state *state, u16 wbd)
409{
410 wbd &= 0x3ff;
411 if (wbd < state->wbd_offset)
412 wbd = 0;
413 else
414 wbd -= state->wbd_offset;
415 /* -64dB is the floor */
416 return -640 + (s16) slopes_to_scale(dib0090_wbd_slopes, ARRAY_SIZE(dib0090_wbd_slopes), wbd);
417}
418
419static void dib0090_wbd_target(struct dib0090_state *state, u32 rf)
420{
421 u16 offset = 250;
422
423 /* TODO : DAB digital N+/-1 interferer perfs : offset = 10 */
424
425 if (state->current_band == BAND_VHF)
426 offset = 650;
427#ifndef FIRMWARE_FIREFLY
428 if (state->current_band == BAND_VHF)
429 offset = state->config->wbd_vhf_offset;
430 if (state->current_band == BAND_CBAND)
431 offset = state->config->wbd_cband_offset;
432#endif
433
434 state->wbd_target = dib0090_wbd_to_db(state, state->wbd_offset + offset);
435 dprintk("wbd-target: %d dB", (u32) state->wbd_target);
436}
437
438static const int gain_reg_addr[4] = {
439 0x08, 0x0a, 0x0f, 0x01
440};
441
442static void dib0090_gain_apply(struct dib0090_state *state, s16 gain_delta, s16 top_delta, u8 force)
443{
444 u16 rf, bb, ref;
445 u16 i, v, gain_reg[4] = { 0 }, gain;
446 const u16 *g;
447
448 if (top_delta < -511)
449 top_delta = -511;
450 if (top_delta > 511)
451 top_delta = 511;
452
453 if (force) {
454 top_delta *= (1 << WBD_ALPHA);
455 gain_delta *= (1 << GAIN_ALPHA);
456 }
457
458 if (top_delta >= ((s16) (state->rf_ramp[0] << WBD_ALPHA) - state->rf_gain_limit)) /* overflow */
459 state->rf_gain_limit = state->rf_ramp[0] << WBD_ALPHA;
460 else
461 state->rf_gain_limit += top_delta;
462
463 if (state->rf_gain_limit < 0) /*underflow */
464 state->rf_gain_limit = 0;
465
466 /* use gain as a temporary variable and correct current_gain */
467 gain = ((state->rf_gain_limit >> WBD_ALPHA) + state->bb_ramp[0]) << GAIN_ALPHA;
468 if (gain_delta >= ((s16) gain - state->current_gain)) /* overflow */
469 state->current_gain = gain;
470 else
471 state->current_gain += gain_delta;
472 /* cannot be less than 0 (only if gain_delta is less than 0 we can have current_gain < 0) */
473 if (state->current_gain < 0)
474 state->current_gain = 0;
475
476 /* now split total gain to rf and bb gain */
477 gain = state->current_gain >> GAIN_ALPHA;
478
479 /* requested gain is bigger than rf gain limit - ACI/WBD adjustment */
480 if (gain > (state->rf_gain_limit >> WBD_ALPHA)) {
481 rf = state->rf_gain_limit >> WBD_ALPHA;
482 bb = gain - rf;
483 if (bb > state->bb_ramp[0])
484 bb = state->bb_ramp[0];
485 } else { /* high signal level -> all gains put on RF */
486 rf = gain;
487 bb = 0;
488 }
489
490 state->gain[0] = rf;
491 state->gain[1] = bb;
492
493 /* software ramp */
494 /* Start with RF gains */
495 g = state->rf_ramp + 1; /* point on RF LNA1 max gain */
496 ref = rf;
497 for (i = 0; i < 7; i++) { /* Go over all amplifiers => 5RF amps + 2 BB amps = 7 amps */
498 if (g[0] == 0 || ref < (g[1] - g[0])) /* if total gain of the current amp is null or this amp is not concerned because it starts to work from an higher gain value */
499 v = 0; /* force the gain to write for the current amp to be null */
500 else if (ref >= g[1]) /* Gain to set is higher than the high working point of this amp */
501 v = g[2]; /* force this amp to be full gain */
502 else /* compute the value to set to this amp because we are somewhere in his range */
503 v = ((ref - (g[1] - g[0])) * g[2]) / g[0];
504
505 if (i == 0) /* LNA 1 reg mapping */
506 gain_reg[0] = v;
507 else if (i == 1) /* LNA 2 reg mapping */
508 gain_reg[0] |= v << 7;
509 else if (i == 2) /* LNA 3 reg mapping */
510 gain_reg[1] = v;
511 else if (i == 3) /* LNA 4 reg mapping */
512 gain_reg[1] |= v << 7;
513 else if (i == 4) /* CBAND LNA reg mapping */
514 gain_reg[2] = v | state->rf_lt_def;
515 else if (i == 5) /* BB gain 1 reg mapping */
516 gain_reg[3] = v << 3;
517 else if (i == 6) /* BB gain 2 reg mapping */
518 gain_reg[3] |= v << 8;
519
520 g += 3; /* go to next gain bloc */
521
522 /* When RF is finished, start with BB */
523 if (i == 4) {
524 g = state->bb_ramp + 1; /* point on BB gain 1 max gain */
525 ref = bb;
526 }
527 }
528 gain_reg[3] |= state->bb_1_def;
529 gain_reg[3] |= ((bb % 10) * 100) / 125;
530
531#ifdef DEBUG_AGC
532 dprintk("GA CALC: DB: %3d(rf) + %3d(bb) = %3d gain_reg[0]=%04x gain_reg[1]=%04x gain_reg[2]=%04x gain_reg[0]=%04x", rf, bb, rf + bb,
533 gain_reg[0], gain_reg[1], gain_reg[2], gain_reg[3]);
534#endif
535
536 /* Write the amplifier regs */
537 for (i = 0; i < 4; i++) {
538 v = gain_reg[i];
539 if (force || state->gain_reg[i] != v) {
540 state->gain_reg[i] = v;
541 dib0090_write_reg(state, gain_reg_addr[i], v);
542 }
543 }
544}
545
546static void dib0090_set_boost(struct dib0090_state *state, int onoff)
547{
548 state->bb_1_def &= 0xdfff;
549 state->bb_1_def |= onoff << 13;
550}
551
552static void dib0090_set_rframp(struct dib0090_state *state, const u16 * cfg)
553{
554 state->rf_ramp = cfg;
555}
556
557static void dib0090_set_rframp_pwm(struct dib0090_state *state, const u16 * cfg)
558{
559 state->rf_ramp = cfg;
560
561 dib0090_write_reg(state, 0x2a, 0xffff);
562
563 dprintk("total RF gain: %ddB, step: %d", (u32) cfg[0], dib0090_read_reg(state, 0x2a));
564
565 dib0090_write_regs(state, 0x2c, cfg + 3, 6);
566 dib0090_write_regs(state, 0x3e, cfg + 9, 2);
567}
568
569static void dib0090_set_bbramp(struct dib0090_state *state, const u16 * cfg)
570{
571 state->bb_ramp = cfg;
572 dib0090_set_boost(state, cfg[0] > 500); /* we want the boost if the gain is higher that 50dB */
573}
574
575static void dib0090_set_bbramp_pwm(struct dib0090_state *state, const u16 * cfg)
576{
577 state->bb_ramp = cfg;
578
579 dib0090_set_boost(state, cfg[0] > 500); /* we want the boost if the gain is higher that 50dB */
580
581 dib0090_write_reg(state, 0x33, 0xffff);
582 dprintk("total BB gain: %ddB, step: %d", (u32) cfg[0], dib0090_read_reg(state, 0x33));
583 dib0090_write_regs(state, 0x35, cfg + 3, 4);
584}
585
586void dib0090_pwm_gain_reset(struct dvb_frontend *fe)
587{
588 struct dib0090_state *state = fe->tuner_priv;
589 /* reset the AGC */
590
591 if (state->config->use_pwm_agc) {
592#ifdef CONFIG_BAND_SBAND
593 if (state->current_band == BAND_SBAND) {
594 dib0090_set_rframp_pwm(state, rf_ramp_pwm_sband);
595 dib0090_set_bbramp_pwm(state, bb_ramp_pwm_boost);
596 } else
597#endif
598#ifdef CONFIG_BAND_CBAND
599 if (state->current_band == BAND_CBAND) {
600 dib0090_set_rframp_pwm(state, rf_ramp_pwm_cband);
601 dib0090_set_bbramp_pwm(state, bb_ramp_pwm_normal);
602 } else
603#endif
604#ifdef CONFIG_BAND_VHF
605 if (state->current_band == BAND_VHF) {
606 dib0090_set_rframp_pwm(state, rf_ramp_pwm_vhf);
607 dib0090_set_bbramp_pwm(state, bb_ramp_pwm_normal);
608 } else
609#endif
610 {
611 dib0090_set_rframp_pwm(state, rf_ramp_pwm_uhf);
612 dib0090_set_bbramp_pwm(state, bb_ramp_pwm_normal);
613 }
614
615 if (state->rf_ramp[0] != 0)
616 dib0090_write_reg(state, 0x32, (3 << 11));
617 else
618 dib0090_write_reg(state, 0x32, (0 << 11));
619
620 dib0090_write_reg(state, 0x39, (1 << 10));
621 }
622}
623EXPORT_SYMBOL(dib0090_pwm_gain_reset);
624
625int dib0090_gain_control(struct dvb_frontend *fe)
626{
627 struct dib0090_state *state = fe->tuner_priv;
628 enum frontend_tune_state *tune_state = &state->tune_state;
629 int ret = 10;
630
631 u16 wbd_val = 0;
632 u8 apply_gain_immediatly = 1;
633 s16 wbd_error = 0, adc_error = 0;
634
635 if (*tune_state == CT_AGC_START) {
636 state->agc_freeze = 0;
637 dib0090_write_reg(state, 0x04, 0x0);
638
639#ifdef CONFIG_BAND_SBAND
640 if (state->current_band == BAND_SBAND) {
641 dib0090_set_rframp(state, rf_ramp_sband);
642 dib0090_set_bbramp(state, bb_ramp_boost);
643 } else
644#endif
645#ifdef CONFIG_BAND_VHF
646 if (state->current_band == BAND_VHF) {
647 dib0090_set_rframp(state, rf_ramp_vhf);
648 dib0090_set_bbramp(state, bb_ramp_boost);
649 } else
650#endif
651#ifdef CONFIG_BAND_CBAND
652 if (state->current_band == BAND_CBAND) {
653 dib0090_set_rframp(state, rf_ramp_cband);
654 dib0090_set_bbramp(state, bb_ramp_boost);
655 } else
656#endif
657 {
658 dib0090_set_rframp(state, rf_ramp_uhf);
659 dib0090_set_bbramp(state, bb_ramp_boost);
660 }
661
662 dib0090_write_reg(state, 0x32, 0);
663 dib0090_write_reg(state, 0x39, 0);
664
665 dib0090_wbd_target(state, state->current_rf);
666
667 state->rf_gain_limit = state->rf_ramp[0] << WBD_ALPHA;
668 state->current_gain = ((state->rf_ramp[0] + state->bb_ramp[0]) / 2) << GAIN_ALPHA;
669
670 *tune_state = CT_AGC_STEP_0;
671 } else if (!state->agc_freeze) {
672 s16 wbd;
673
674 int adc;
675 wbd_val = dib0090_read_reg(state, 0x1d);
676
677 /* read and calc the wbd power */
678 wbd = dib0090_wbd_to_db(state, wbd_val);
679 wbd_error = state->wbd_target - wbd;
680
681 if (*tune_state == CT_AGC_STEP_0) {
682 if (wbd_error < 0 && state->rf_gain_limit > 0) {
683#ifdef CONFIG_BAND_CBAND
684 /* in case of CBAND tune reduce first the lt_gain2 before adjusting the RF gain */
685 u8 ltg2 = (state->rf_lt_def >> 10) & 0x7;
686 if (state->current_band == BAND_CBAND && ltg2) {
687 ltg2 >>= 1;
688 state->rf_lt_def &= ltg2 << 10; /* reduce in 3 steps from 7 to 0 */
689 }
690#endif
691 } else {
692 state->agc_step = 0;
693 *tune_state = CT_AGC_STEP_1;
694 }
695 } else {
696 /* calc the adc power */
697 adc = state->config->get_adc_power(fe);
698 adc = (adc * ((s32) 355774) + (((s32) 1) << 20)) >> 21; /* included in [0:-700] */
699
700 adc_error = (s16) (((s32) ADC_TARGET) - adc);
701#ifdef CONFIG_STANDARD_DAB
702 if (state->fe->dtv_property_cache.delivery_system == STANDARD_DAB)
703 adc_error += 130;
704#endif
705#ifdef CONFIG_STANDARD_DVBT
706 if (state->fe->dtv_property_cache.delivery_system == STANDARD_DVBT &&
707 (state->fe->dtv_property_cache.modulation == QAM_64 || state->fe->dtv_property_cache.modulation == QAM_16))
708 adc_error += 60;
709#endif
710#ifdef CONFIG_SYS_ISDBT
711 if ((state->fe->dtv_property_cache.delivery_system == SYS_ISDBT) && (((state->fe->dtv_property_cache.layer[0].segment_count >
712 0)
713 &&
714 ((state->fe->dtv_property_cache.layer[0].modulation ==
715 QAM_64)
716 || (state->fe->dtv_property_cache.layer[0].
717 modulation == QAM_16)))
718 ||
719 ((state->fe->dtv_property_cache.layer[1].segment_count >
720 0)
721 &&
722 ((state->fe->dtv_property_cache.layer[1].modulation ==
723 QAM_64)
724 || (state->fe->dtv_property_cache.layer[1].
725 modulation == QAM_16)))
726 ||
727 ((state->fe->dtv_property_cache.layer[2].segment_count >
728 0)
729 &&
730 ((state->fe->dtv_property_cache.layer[2].modulation ==
731 QAM_64)
732 || (state->fe->dtv_property_cache.layer[2].
733 modulation == QAM_16)))
734 )
735 )
736 adc_error += 60;
737#endif
738
739 if (*tune_state == CT_AGC_STEP_1) { /* quickly go to the correct range of the ADC power */
740 if (ABS(adc_error) < 50 || state->agc_step++ > 5) {
741
742#ifdef CONFIG_STANDARD_DAB
743 if (state->fe->dtv_property_cache.delivery_system == STANDARD_DAB) {
744 dib0090_write_reg(state, 0x02, (1 << 15) | (15 << 11) | (31 << 6) | (63)); /* cap value = 63 : narrow BB filter : Fc = 1.8MHz */
745 dib0090_write_reg(state, 0x04, 0x0);
746 } else
747#endif
748 {
749 dib0090_write_reg(state, 0x02, (1 << 15) | (3 << 11) | (6 << 6) | (32));
750 dib0090_write_reg(state, 0x04, 0x01); /*0 = 1KHz ; 1 = 150Hz ; 2 = 50Hz ; 3 = 50KHz ; 4 = servo fast */
751 }
752
753 *tune_state = CT_AGC_STOP;
754 }
755 } else {
756 /* everything higher than or equal to CT_AGC_STOP means tracking */
757 ret = 100; /* 10ms interval */
758 apply_gain_immediatly = 0;
759 }
760 }
761#ifdef DEBUG_AGC
762 dprintk
763 ("FE: %d, tune state %d, ADC = %3ddB (ADC err %3d) WBD %3ddB (WBD err %3d, WBD val SADC: %4d), RFGainLimit (TOP): %3d, signal: %3ddBm",
764 (u32) fe->id, (u32) *tune_state, (u32) adc, (u32) adc_error, (u32) wbd, (u32) wbd_error, (u32) wbd_val,
765 (u32) state->rf_gain_limit >> WBD_ALPHA, (s32) 200 + adc - (state->current_gain >> GAIN_ALPHA));
766#endif
767 }
768
769 /* apply gain */
770 if (!state->agc_freeze)
771 dib0090_gain_apply(state, adc_error, wbd_error, apply_gain_immediatly);
772 return ret;
773}
774EXPORT_SYMBOL(dib0090_gain_control);
775
776void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt)
777{
778 struct dib0090_state *state = fe->tuner_priv;
779 if (rf)
780 *rf = state->gain[0];
781 if (bb)
782 *bb = state->gain[1];
783 if (rf_gain_limit)
784 *rf_gain_limit = state->rf_gain_limit;
785 if (rflt)
786 *rflt = (state->rf_lt_def >> 10) & 0x7;
787}
788EXPORT_SYMBOL(dib0090_get_current_gain);
789
790u16 dib0090_get_wbd_offset(struct dvb_frontend *tuner)
791{
792 struct dib0090_state *st = tuner->tuner_priv;
793 return st->wbd_offset;
794}
795EXPORT_SYMBOL(dib0090_get_wbd_offset);
796
797static const u16 dib0090_defaults[] = {
798
799 25, 0x01,
800 0x0000,
801 0x99a0,
802 0x6008,
803 0x0000,
804 0x8acb,
805 0x0000,
806 0x0405,
807 0x0000,
808 0x0000,
809 0x0000,
810 0xb802,
811 0x0300,
812 0x2d12,
813 0xbac0,
814 0x7c00,
815 0xdbb9,
816 0x0954,
817 0x0743,
818 0x8000,
819 0x0001,
820 0x0040,
821 0x0100,
822 0x0000,
823 0xe910,
824 0x149e,
825
826 1, 0x1c,
827 0xff2d,
828
829 1, 0x39,
830 0x0000,
831
832 1, 0x1b,
833 EN_IQADC | EN_BB | EN_BIAS | EN_DIGCLK | EN_PLL | EN_CRYSTAL,
834 2, 0x1e,
835 0x07FF,
836 0x0007,
837
838 1, 0x24,
839 EN_UHF | EN_CRYSTAL,
840
841 2, 0x3c,
842 0x3ff,
843 0x111,
844 0
845};
846
847static int dib0090_reset(struct dvb_frontend *fe)
848{
849 struct dib0090_state *state = fe->tuner_priv;
850 u16 l, r, *n;
851
852 dib0090_reset_digital(fe, state->config);
853 state->revision = dib0090_identify(fe);
854
855 /* Revision definition */
856 if (state->revision == 0xff)
857 return -EINVAL;
858#ifdef EFUSE
859 else if ((state->revision & 0x1f) >= 3) /* Update the efuse : Only available for KROSUS > P1C */
860 dib0090_set_EFUSE(state);
861#endif
862
863#ifdef CONFIG_TUNER_DIB0090_P1B_SUPPORT
864 if (!(state->revision & 0x1)) /* it is P1B - reset is already done */
865 return 0;
866#endif
867
868 /* Upload the default values */
869 n = (u16 *) dib0090_defaults;
870 l = pgm_read_word(n++);
871 while (l) {
872 r = pgm_read_word(n++);
873 do {
874 /* DEBUG_TUNER */
875 /* dprintk("%d, %d, %d", l, r, pgm_read_word(n)); */
876 dib0090_write_reg(state, r, pgm_read_word(n++));
877 r++;
878 } while (--l);
879 l = pgm_read_word(n++);
880 }
881
882 /* Congigure in function of the crystal */
883 if (state->config->io.clock_khz >= 24000)
884 l = 1;
885 else
886 l = 2;
887 dib0090_write_reg(state, 0x14, l);
888 dprintk("Pll lock : %d", (dib0090_read_reg(state, 0x1a) >> 11) & 0x1);
889
890 state->reset = 3; /* enable iq-offset-calibration and wbd-calibration when tuning next time */
891
892 return 0;
893}
894
895#define steps(u) (((u) > 15) ? ((u)-16) : (u))
896#define INTERN_WAIT 10
897static int dib0090_get_offset(struct dib0090_state *state, enum frontend_tune_state *tune_state)
898{
899 int ret = INTERN_WAIT * 10;
900
901 switch (*tune_state) {
902 case CT_TUNER_STEP_2:
903 /* Turns to positive */
904 dib0090_write_reg(state, 0x1f, 0x7);
905 *tune_state = CT_TUNER_STEP_3;
906 break;
907
908 case CT_TUNER_STEP_3:
909 state->adc_diff = dib0090_read_reg(state, 0x1d);
910
911 /* Turns to negative */
912 dib0090_write_reg(state, 0x1f, 0x4);
913 *tune_state = CT_TUNER_STEP_4;
914 break;
915
916 case CT_TUNER_STEP_4:
917 state->adc_diff -= dib0090_read_reg(state, 0x1d);
918 *tune_state = CT_TUNER_STEP_5;
919 ret = 0;
920 break;
921
922 default:
923 break;
924 }
925
926 return ret;
927}
928
929struct dc_calibration {
930 uint8_t addr;
931 uint8_t offset;
932 uint8_t pga:1;
933 uint16_t bb1;
934 uint8_t i:1;
935};
936
937static const struct dc_calibration dc_table[] = {
938 /* Step1 BB gain1= 26 with boost 1, gain 2 = 0 */
939 {0x06, 5, 1, (1 << 13) | (0 << 8) | (26 << 3), 1},
940 {0x07, 11, 1, (1 << 13) | (0 << 8) | (26 << 3), 0},
941 /* Step 2 BB gain 1 = 26 with boost = 1 & gain 2 = 29 */
942 {0x06, 0, 0, (1 << 13) | (29 << 8) | (26 << 3), 1},
943 {0x06, 10, 0, (1 << 13) | (29 << 8) | (26 << 3), 0},
944 {0},
945};
946
947static void dib0090_set_trim(struct dib0090_state *state)
948{
949 u16 *val;
950
951 if (state->dc->addr == 0x07)
952 val = &state->bb7;
953 else
954 val = &state->bb6;
955
956 *val &= ~(0x1f << state->dc->offset);
957 *val |= state->step << state->dc->offset;
958
959 dib0090_write_reg(state, state->dc->addr, *val);
960}
961
962static int dib0090_dc_offset_calibration(struct dib0090_state *state, enum frontend_tune_state *tune_state)
963{
964 int ret = 0;
965
966 switch (*tune_state) {
967
968 case CT_TUNER_START:
969 /* init */
970 dprintk("Internal DC calibration");
971
972 /* the LNA is off */
973 dib0090_write_reg(state, 0x24, 0x02ed);
974
975 /* force vcm2 = 0.8V */
976 state->bb6 = 0;
977 state->bb7 = 0x040d;
978
979 state->dc = dc_table;
980
981 *tune_state = CT_TUNER_STEP_0;
982
983 /* fall through */
984
985 case CT_TUNER_STEP_0:
986 dib0090_write_reg(state, 0x01, state->dc->bb1);
987 dib0090_write_reg(state, 0x07, state->bb7 | (state->dc->i << 7));
988
989 state->step = 0;
990
991 state->min_adc_diff = 1023;
992
993 *tune_state = CT_TUNER_STEP_1;
994 ret = 50;
995 break;
996
997 case CT_TUNER_STEP_1:
998 dib0090_set_trim(state);
999
1000 *tune_state = CT_TUNER_STEP_2;
1001 break;
1002
1003 case CT_TUNER_STEP_2:
1004 case CT_TUNER_STEP_3:
1005 case CT_TUNER_STEP_4:
1006 ret = dib0090_get_offset(state, tune_state);
1007 break;
1008
1009 case CT_TUNER_STEP_5: /* found an offset */
1010 dprintk("FE%d: IQC read=%d, current=%x", state->fe->id, (u32) state->adc_diff, state->step);
1011
1012 /* first turn for this frequency */
1013 if (state->step == 0) {
1014 if (state->dc->pga && state->adc_diff < 0)
1015 state->step = 0x10;
1016 if (state->dc->pga == 0 && state->adc_diff > 0)
1017 state->step = 0x10;
1018 }
1019
1020 state->adc_diff = ABS(state->adc_diff);
1021
1022 if (state->adc_diff < state->min_adc_diff && steps(state->step) < 15) { /* stop search when the delta to 0 is increasing */
1023 state->step++;
1024 state->min_adc_diff = state->adc_diff;
1025 *tune_state = CT_TUNER_STEP_1;
1026 } else {
1027
1028 /* the minimum was what we have seen in the step before */
1029 state->step--;
1030 dib0090_set_trim(state);
1031
1032 dprintk("FE%d: BB Offset Cal, BBreg=%hd,Offset=%hd,Value Set=%hd", state->fe->id, state->dc->addr, state->adc_diff,
1033 state->step);
1034
1035 state->dc++;
1036 if (state->dc->addr == 0) /* done */
1037 *tune_state = CT_TUNER_STEP_6;
1038 else
1039 *tune_state = CT_TUNER_STEP_0;
1040
1041 }
1042 break;
1043
1044 case CT_TUNER_STEP_6:
1045 dib0090_write_reg(state, 0x07, state->bb7 & ~0x0008);
1046 dib0090_write_reg(state, 0x1f, 0x7);
1047 *tune_state = CT_TUNER_START; /* reset done -> real tuning can now begin */
1048 state->reset &= ~0x1;
1049 default:
1050 break;
1051 }
1052 return ret;
1053}
1054
1055static int dib0090_wbd_calibration(struct dib0090_state *state, enum frontend_tune_state *tune_state)
1056{
1057 switch (*tune_state) {
1058 case CT_TUNER_START:
1059 /* WBD-mode=log, Bias=2, Gain=6, Testmode=1, en=1, WBDMUX=1 */
1060 dib0090_write_reg(state, 0x10, 0xdb09 | (1 << 10));
1061 dib0090_write_reg(state, 0x24, EN_UHF & 0x0fff);
1062
1063 *tune_state = CT_TUNER_STEP_0;
1064 return 90; /* wait for the WBDMUX to switch and for the ADC to sample */
1065 case CT_TUNER_STEP_0:
1066 state->wbd_offset = dib0090_read_reg(state, 0x1d);
1067 dprintk("WBD calibration offset = %d", state->wbd_offset);
1068
1069 *tune_state = CT_TUNER_START; /* reset done -> real tuning can now begin */
1070 state->reset &= ~0x2;
1071 break;
1072 default:
1073 break;
1074 }
1075 return 0;
1076}
1077
1078static void dib0090_set_bandwidth(struct dib0090_state *state)
1079{
1080 u16 tmp;
1081
1082 if (state->fe->dtv_property_cache.bandwidth_hz / 1000 <= 5000)
1083 tmp = (3 << 14);
1084 else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 <= 6000)
1085 tmp = (2 << 14);
1086 else if (state->fe->dtv_property_cache.bandwidth_hz / 1000 <= 7000)
1087 tmp = (1 << 14);
1088 else
1089 tmp = (0 << 14);
1090
1091 state->bb_1_def &= 0x3fff;
1092 state->bb_1_def |= tmp;
1093
1094 dib0090_write_reg(state, 0x01, state->bb_1_def); /* be sure that we have the right bb-filter */
1095}
1096
1097static const struct dib0090_pll dib0090_pll_table[] = {
1098#ifdef CONFIG_BAND_CBAND
1099 {56000, 0, 9, 48, 6},
1100 {70000, 1, 9, 48, 6},
1101 {87000, 0, 8, 32, 4},
1102 {105000, 1, 8, 32, 4},
1103 {115000, 0, 7, 24, 6},
1104 {140000, 1, 7, 24, 6},
1105 {170000, 0, 6, 16, 4},
1106#endif
1107#ifdef CONFIG_BAND_VHF
1108 {200000, 1, 6, 16, 4},
1109 {230000, 0, 5, 12, 6},
1110 {280000, 1, 5, 12, 6},
1111 {340000, 0, 4, 8, 4},
1112 {380000, 1, 4, 8, 4},
1113 {450000, 0, 3, 6, 6},
1114#endif
1115#ifdef CONFIG_BAND_UHF
1116 {580000, 1, 3, 6, 6},
1117 {700000, 0, 2, 4, 4},
1118 {860000, 1, 2, 4, 4},
1119#endif
1120#ifdef CONFIG_BAND_LBAND
1121 {1800000, 1, 0, 2, 4},
1122#endif
1123#ifdef CONFIG_BAND_SBAND
1124 {2900000, 0, 14, 1, 4},
1125#endif
1126};
1127
1128static const struct dib0090_tuning dib0090_tuning_table_fm_vhf_on_cband[] = {
1129
1130#ifdef CONFIG_BAND_CBAND
1131 {184000, 4, 1, 15, 0x280, 0x2912, 0xb94e, EN_CAB},
1132 {227000, 4, 3, 15, 0x280, 0x2912, 0xb94e, EN_CAB},
1133 {380000, 4, 7, 15, 0x280, 0x2912, 0xb94e, EN_CAB},
1134#endif
1135#ifdef CONFIG_BAND_UHF
1136 {520000, 2, 0, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1137 {550000, 2, 2, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1138 {650000, 2, 3, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1139 {750000, 2, 5, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1140 {850000, 2, 6, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1141 {900000, 2, 7, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1142#endif
1143#ifdef CONFIG_BAND_LBAND
1144 {1500000, 4, 0, 20, 0x300, 0x1912, 0x82c9, EN_LBD},
1145 {1600000, 4, 1, 20, 0x300, 0x1912, 0x82c9, EN_LBD},
1146 {1800000, 4, 3, 20, 0x300, 0x1912, 0x82c9, EN_LBD},
1147#endif
1148#ifdef CONFIG_BAND_SBAND
1149 {2300000, 1, 4, 20, 0x300, 0x2d2A, 0x82c7, EN_SBD},
1150 {2900000, 1, 7, 20, 0x280, 0x2deb, 0x8347, EN_SBD},
1151#endif
1152};
1153
1154static const struct dib0090_tuning dib0090_tuning_table[] = {
1155
1156#ifdef CONFIG_BAND_CBAND
1157 {170000, 4, 1, 15, 0x280, 0x2912, 0xb94e, EN_CAB},
1158#endif
1159#ifdef CONFIG_BAND_VHF
1160 {184000, 1, 1, 15, 0x300, 0x4d12, 0xb94e, EN_VHF},
1161 {227000, 1, 3, 15, 0x300, 0x4d12, 0xb94e, EN_VHF},
1162 {380000, 1, 7, 15, 0x300, 0x4d12, 0xb94e, EN_VHF},
1163#endif
1164#ifdef CONFIG_BAND_UHF
1165 {520000, 2, 0, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1166 {550000, 2, 2, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1167 {650000, 2, 3, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1168 {750000, 2, 5, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1169 {850000, 2, 6, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1170 {900000, 2, 7, 15, 0x300, 0x1d12, 0xb9ce, EN_UHF},
1171#endif
1172#ifdef CONFIG_BAND_LBAND
1173 {1500000, 4, 0, 20, 0x300, 0x1912, 0x82c9, EN_LBD},
1174 {1600000, 4, 1, 20, 0x300, 0x1912, 0x82c9, EN_LBD},
1175 {1800000, 4, 3, 20, 0x300, 0x1912, 0x82c9, EN_LBD},
1176#endif
1177#ifdef CONFIG_BAND_SBAND
1178 {2300000, 1, 4, 20, 0x300, 0x2d2A, 0x82c7, EN_SBD},
1179 {2900000, 1, 7, 20, 0x280, 0x2deb, 0x8347, EN_SBD},
1180#endif
1181};
1182
1183#define WBD 0x781 /* 1 1 1 1 0000 0 0 1 */
1184static int dib0090_tune(struct dvb_frontend *fe)
1185{
1186 struct dib0090_state *state = fe->tuner_priv;
1187 const struct dib0090_tuning *tune = state->current_tune_table_index;
1188 const struct dib0090_pll *pll = state->current_pll_table_index;
1189 enum frontend_tune_state *tune_state = &state->tune_state;
1190
1191 u32 rf;
1192 u16 lo4 = 0xe900, lo5, lo6, Den;
1193 u32 FBDiv, Rest, FREF, VCOF_kHz = 0;
1194 u16 tmp, adc;
1195 int8_t step_sign;
1196 int ret = 10; /* 1ms is the default delay most of the time */
1197 u8 c, i;
1198
1199 state->current_band = (u8) BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000);
1200 rf = fe->dtv_property_cache.frequency / 1000 + (state->current_band ==
1201 BAND_UHF ? state->config->freq_offset_khz_uhf : state->config->freq_offset_khz_vhf);
1202 /* in any case we first need to do a reset if needed */
1203 if (state->reset & 0x1)
1204 return dib0090_dc_offset_calibration(state, tune_state);
1205 else if (state->reset & 0x2)
1206 return dib0090_wbd_calibration(state, tune_state);
1207
1208 /************************* VCO ***************************/
1209 /* Default values for FG */
1210 /* from these are needed : */
1211 /* Cp,HFdiv,VCOband,SD,Num,Den,FB and REFDiv */
1212
1213#ifdef CONFIG_SYS_ISDBT
1214 if (state->fe->dtv_property_cache.delivery_system == SYS_ISDBT && state->fe->dtv_property_cache.isdbt_sb_mode == 1)
1215 rf += 850;
1216#endif
1217
1218 if (state->current_rf != rf) {
1219 state->tuner_is_tuned = 0;
1220
1221 tune = dib0090_tuning_table;
1222
1223 tmp = (state->revision >> 5) & 0x7;
1224 if (tmp == 0x4 || tmp == 0x7) {
1225 /* CBAND tuner version for VHF */
1226 if (state->current_band == BAND_FM || state->current_band == BAND_VHF) {
1227 /* Force CBAND */
1228 state->current_band = BAND_CBAND;
1229 tune = dib0090_tuning_table_fm_vhf_on_cband;
1230 }
1231 }
1232
1233 pll = dib0090_pll_table;
1234 /* Look for the interval */
1235 while (rf > tune->max_freq)
1236 tune++;
1237 while (rf > pll->max_freq)
1238 pll++;
1239 state->current_tune_table_index = tune;
1240 state->current_pll_table_index = pll;
1241 }
1242
1243 if (*tune_state == CT_TUNER_START) {
1244
1245 if (state->tuner_is_tuned == 0)
1246 state->current_rf = 0;
1247
1248 if (state->current_rf != rf) {
1249
1250 dib0090_write_reg(state, 0x0b, 0xb800 | (tune->switch_trim));
1251
1252 /* external loop filter, otherwise:
1253 * lo5 = (0 << 15) | (0 << 12) | (0 << 11) | (3 << 9) | (4 << 6) | (3 << 4) | 4;
1254 * lo6 = 0x0e34 */
1255 if (pll->vco_band)
1256 lo5 = 0x049e;
1257 else if (state->config->analog_output)
1258 lo5 = 0x041d;
1259 else
1260 lo5 = 0x041c;
1261
1262 lo5 |= (pll->hfdiv_code << 11) | (pll->vco_band << 7); /* bit 15 is the split to the slave, we do not do it here */
1263
1264 if (!state->config->io.pll_int_loop_filt)
1265 lo6 = 0xff28;
1266 else
1267 lo6 = (state->config->io.pll_int_loop_filt << 3);
1268
1269 VCOF_kHz = (pll->hfdiv * rf) * 2;
1270
1271 FREF = state->config->io.clock_khz;
1272
1273 FBDiv = (VCOF_kHz / pll->topresc / FREF);
1274 Rest = (VCOF_kHz / pll->topresc) - FBDiv * FREF;
1275
1276 if (Rest < LPF)
1277 Rest = 0;
1278 else if (Rest < 2 * LPF)
1279 Rest = 2 * LPF;
1280 else if (Rest > (FREF - LPF)) {
1281 Rest = 0;
1282 FBDiv += 1;
1283 } else if (Rest > (FREF - 2 * LPF))
1284 Rest = FREF - 2 * LPF;
1285 Rest = (Rest * 6528) / (FREF / 10);
1286
1287 Den = 1;
1288
1289 dprintk(" ***** ******* Rest value = %d", Rest);
1290
1291 if (Rest > 0) {
1292 if (state->config->analog_output)
1293 lo6 |= (1 << 2) | 2;
1294 else
1295 lo6 |= (1 << 2) | 1;
1296 Den = 255;
1297 }
1298#ifdef CONFIG_BAND_SBAND
1299 if (state->current_band == BAND_SBAND)
1300 lo6 &= 0xfffb;
1301#endif
1302
1303 dib0090_write_reg(state, 0x15, (u16) FBDiv);
1304
1305 dib0090_write_reg(state, 0x16, (Den << 8) | 1);
1306
1307 dib0090_write_reg(state, 0x17, (u16) Rest);
1308
1309 dib0090_write_reg(state, 0x19, lo5);
1310
1311 dib0090_write_reg(state, 0x1c, lo6);
1312
1313 lo6 = tune->tuner_enable;
1314 if (state->config->analog_output)
1315 lo6 = (lo6 & 0xff9f) | 0x2;
1316
1317 dib0090_write_reg(state, 0x24, lo6 | EN_LO
1318#ifdef CONFIG_DIB0090_USE_PWM_AGC
1319 | state->config->use_pwm_agc * EN_CRYSTAL
1320#endif
1321 );
1322
1323 state->current_rf = rf;
1324
1325 /* prepare a complete captrim */
1326 state->step = state->captrim = state->fcaptrim = 64;
1327
1328 } else { /* we are already tuned to this frequency - the configuration is correct */
1329
1330 /* do a minimal captrim even if the frequency has not changed */
1331 state->step = 4;
1332 state->captrim = state->fcaptrim = dib0090_read_reg(state, 0x18) & 0x7f;
1333 }
1334 state->adc_diff = 3000;
1335
1336 dib0090_write_reg(state, 0x10, 0x2B1);
1337
1338 dib0090_write_reg(state, 0x1e, 0x0032);
1339
1340 ret = 20;
1341 *tune_state = CT_TUNER_STEP_1;
1342 } else if (*tune_state == CT_TUNER_STEP_0) {
1343 /* nothing */
1344 } else if (*tune_state == CT_TUNER_STEP_1) {
1345 state->step /= 2;
1346 dib0090_write_reg(state, 0x18, lo4 | state->captrim);
1347 *tune_state = CT_TUNER_STEP_2;
1348 } else if (*tune_state == CT_TUNER_STEP_2) {
1349
1350 adc = dib0090_read_reg(state, 0x1d);
1351 dprintk("FE %d CAPTRIM=%d; ADC = %d (ADC) & %dmV", (u32) fe->id, (u32) state->captrim, (u32) adc,
1352 (u32) (adc) * (u32) 1800 / (u32) 1024);
1353
1354 if (adc >= 400) {
1355 adc -= 400;
1356 step_sign = -1;
1357 } else {
1358 adc = 400 - adc;
1359 step_sign = 1;
1360 }
1361
1362 if (adc < state->adc_diff) {
1363 dprintk("FE %d CAPTRIM=%d is closer to target (%d/%d)", (u32) fe->id, (u32) state->captrim, (u32) adc, (u32) state->adc_diff);
1364 state->adc_diff = adc;
1365 state->fcaptrim = state->captrim;
1366
1367 }
1368
1369 state->captrim += step_sign * state->step;
1370 if (state->step >= 1)
1371 *tune_state = CT_TUNER_STEP_1;
1372 else
1373 *tune_state = CT_TUNER_STEP_3;
1374
1375 ret = 15;
1376 } else if (*tune_state == CT_TUNER_STEP_3) {
1377 /*write the final cptrim config */
1378 dib0090_write_reg(state, 0x18, lo4 | state->fcaptrim);
1379
1380#ifdef CONFIG_TUNER_DIB0090_CAPTRIM_MEMORY
1381 state->memory[state->memory_index].cap = state->fcaptrim;
1382#endif
1383
1384 *tune_state = CT_TUNER_STEP_4;
1385 } else if (*tune_state == CT_TUNER_STEP_4) {
1386 dib0090_write_reg(state, 0x1e, 0x07ff);
1387
1388 dprintk("FE %d Final Captrim: %d", (u32) fe->id, (u32) state->fcaptrim);
1389 dprintk("FE %d HFDIV code: %d", (u32) fe->id, (u32) pll->hfdiv_code);
1390 dprintk("FE %d VCO = %d", (u32) fe->id, (u32) pll->vco_band);
1391 dprintk("FE %d VCOF in kHz: %d ((%d*%d) << 1))", (u32) fe->id, (u32) ((pll->hfdiv * rf) * 2), (u32) pll->hfdiv, (u32) rf);
1392 dprintk("FE %d REFDIV: %d, FREF: %d", (u32) fe->id, (u32) 1, (u32) state->config->io.clock_khz);
1393 dprintk("FE %d FBDIV: %d, Rest: %d", (u32) fe->id, (u32) dib0090_read_reg(state, 0x15), (u32) dib0090_read_reg(state, 0x17));
1394 dprintk("FE %d Num: %d, Den: %d, SD: %d", (u32) fe->id, (u32) dib0090_read_reg(state, 0x17),
1395 (u32) (dib0090_read_reg(state, 0x16) >> 8), (u32) dib0090_read_reg(state, 0x1c) & 0x3);
1396
1397 c = 4;
1398 i = 3;
1399#if defined(CONFIG_BAND_LBAND) || defined(CONFIG_BAND_SBAND)
1400 if ((state->current_band == BAND_LBAND) || (state->current_band == BAND_SBAND)) {
1401 c = 2;
1402 i = 2;
1403 }
1404#endif
1405 dib0090_write_reg(state, 0x10, (c << 13) | (i << 11) | (WBD
1406#ifdef CONFIG_DIB0090_USE_PWM_AGC
1407 | (state->config->use_pwm_agc << 1)
1408#endif
1409 ));
1410 dib0090_write_reg(state, 0x09, (tune->lna_tune << 5) | (tune->lna_bias << 0));
1411 dib0090_write_reg(state, 0x0c, tune->v2i);
1412 dib0090_write_reg(state, 0x0d, tune->mix);
1413 dib0090_write_reg(state, 0x0e, tune->load);
1414
1415 *tune_state = CT_TUNER_STEP_5;
1416 } else if (*tune_state == CT_TUNER_STEP_5) {
1417
1418 /* initialize the lt gain register */
1419 state->rf_lt_def = 0x7c00;
1420 dib0090_write_reg(state, 0x0f, state->rf_lt_def);
1421
1422 dib0090_set_bandwidth(state);
1423 state->tuner_is_tuned = 1;
1424 *tune_state = CT_TUNER_STOP;
1425 } else
1426 ret = FE_CALLBACK_TIME_NEVER;
1427 return ret;
1428}
1429
1430static int dib0090_release(struct dvb_frontend *fe)
1431{
1432 kfree(fe->tuner_priv);
1433 fe->tuner_priv = NULL;
1434 return 0;
1435}
1436
1437enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe)
1438{
1439 struct dib0090_state *state = fe->tuner_priv;
1440
1441 return state->tune_state;
1442}
1443EXPORT_SYMBOL(dib0090_get_tune_state);
1444
1445int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1446{
1447 struct dib0090_state *state = fe->tuner_priv;
1448
1449 state->tune_state = tune_state;
1450 return 0;
1451}
1452EXPORT_SYMBOL(dib0090_set_tune_state);
1453
1454static int dib0090_get_frequency(struct dvb_frontend *fe, u32 * frequency)
1455{
1456 struct dib0090_state *state = fe->tuner_priv;
1457
1458 *frequency = 1000 * state->current_rf;
1459 return 0;
1460}
1461
1462static int dib0090_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
1463{
1464 struct dib0090_state *state = fe->tuner_priv;
1465 uint32_t ret;
1466
1467 state->tune_state = CT_TUNER_START;
1468
1469 do {
1470 ret = dib0090_tune(fe);
1471 if (ret != FE_CALLBACK_TIME_NEVER)
1472 msleep(ret / 10);
1473 else
1474 break;
1475 } while (state->tune_state != CT_TUNER_STOP);
1476
1477 return 0;
1478}
1479
1480static const struct dvb_tuner_ops dib0090_ops = {
1481 .info = {
1482 .name = "DiBcom DiB0090",
1483 .frequency_min = 45000000,
1484 .frequency_max = 860000000,
1485 .frequency_step = 1000,
1486 },
1487 .release = dib0090_release,
1488
1489 .init = dib0090_wakeup,
1490 .sleep = dib0090_sleep,
1491 .set_params = dib0090_set_params,
1492 .get_frequency = dib0090_get_frequency,
1493};
1494
1495struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config)
1496{
1497 struct dib0090_state *st = kzalloc(sizeof(struct dib0090_state), GFP_KERNEL);
1498 if (st == NULL)
1499 return NULL;
1500
1501 st->config = config;
1502 st->i2c = i2c;
1503 st->fe = fe;
1504 fe->tuner_priv = st;
1505
1506 if (dib0090_reset(fe) != 0)
1507 goto free_mem;
1508
1509 printk(KERN_INFO "DiB0090: successfully identified\n");
1510 memcpy(&fe->ops.tuner_ops, &dib0090_ops, sizeof(struct dvb_tuner_ops));
1511
1512 return fe;
1513 free_mem:
1514 kfree(st);
1515 fe->tuner_priv = NULL;
1516 return NULL;
1517}
1518EXPORT_SYMBOL(dib0090_register);
1519
1520MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
1521MODULE_AUTHOR("Olivier Grenie <olivier.grenie@dibcom.fr>");
1522MODULE_DESCRIPTION("Driver for the DiBcom 0090 base-band RF Tuner");
1523MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/dib0090.h b/drivers/media/dvb/frontends/dib0090.h
new file mode 100644
index 000000000000..aa7711e88776
--- /dev/null
+++ b/drivers/media/dvb/frontends/dib0090.h
@@ -0,0 +1,108 @@
1/*
2 * Linux-DVB Driver for DiBcom's DiB0090 base-band RF Tuner.
3 *
4 * Copyright (C) 2005-7 DiBcom (http://www.dibcom.fr/)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
9 */
10#ifndef DIB0090_H
11#define DIB0090_H
12
13struct dvb_frontend;
14struct i2c_adapter;
15
16#define DEFAULT_DIB0090_I2C_ADDRESS 0x60
17
18struct dib0090_io_config {
19 u32 clock_khz;
20
21 u8 pll_bypass:1;
22 u8 pll_range:1;
23 u8 pll_prediv:6;
24 u8 pll_loopdiv:6;
25
26 u8 adc_clock_ratio; /* valid is 8, 7 ,6 */
27 u16 pll_int_loop_filt;
28};
29
30struct dib0090_config {
31 struct dib0090_io_config io;
32 int (*reset) (struct dvb_frontend *, int);
33 int (*sleep) (struct dvb_frontend *, int);
34
35 /* offset in kHz */
36 int freq_offset_khz_uhf;
37 int freq_offset_khz_vhf;
38
39 int (*get_adc_power) (struct dvb_frontend *);
40
41 u8 clkouttobamse:1; /* activate or deactivate clock output */
42 u8 analog_output;
43
44 u8 i2c_address;
45 /* add drives and other things if necessary */
46 u16 wbd_vhf_offset;
47 u16 wbd_cband_offset;
48 u8 use_pwm_agc;
49 u8 clkoutdrive;
50};
51
52#if defined(CONFIG_DVB_TUNER_DIB0090) || (defined(CONFIG_DVB_TUNER_DIB0090_MODULE) && defined(MODULE))
53extern struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config);
54extern void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast);
55extern void dib0090_pwm_gain_reset(struct dvb_frontend *fe);
56extern u16 dib0090_get_wbd_offset(struct dvb_frontend *tuner);
57extern int dib0090_gain_control(struct dvb_frontend *fe);
58extern enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe);
59extern int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state);
60extern void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt);
61#else
62static inline struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0090_config *config)
63{
64 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
65 return NULL;
66}
67
68static inline void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast)
69{
70 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
71}
72
73static inline void dib0090_pwm_gain_reset(struct dvb_frontend *fe)
74{
75 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
76}
77
78static inline u16 dib0090_get_wbd_offset(struct dvb_frontend *tuner)
79{
80 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
81 return 0;
82}
83
84static inline int dib0090_gain_control(struct dvb_frontend *fe)
85{
86 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
87 return -ENODEV;
88}
89
90static inline enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe)
91{
92 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
93 return CT_DONE;
94}
95
96static inline int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
97{
98 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
99 return -ENODEV;
100}
101
102static inline void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt)
103{
104 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
105}
106#endif
107
108#endif
diff --git a/drivers/media/dvb/frontends/dib3000mb.c b/drivers/media/dvb/frontends/dib3000mb.c
index 136b9d2164d7..ad4c8cfd8090 100644
--- a/drivers/media/dvb/frontends/dib3000mb.c
+++ b/drivers/media/dvb/frontends/dib3000mb.c
@@ -154,7 +154,7 @@ static int dib3000mb_set_frontend(struct dvb_frontend* fe,
154 case BANDWIDTH_AUTO: 154 case BANDWIDTH_AUTO:
155 return -EOPNOTSUPP; 155 return -EOPNOTSUPP;
156 default: 156 default:
157 err("unkown bandwidth value."); 157 err("unknown bandwidth value.");
158 return -EINVAL; 158 return -EINVAL;
159 } 159 }
160 } 160 }
diff --git a/drivers/media/dvb/frontends/dib3000mc.c b/drivers/media/dvb/frontends/dib3000mc.c
index fa851601e7d4..40a099810279 100644
--- a/drivers/media/dvb/frontends/dib3000mc.c
+++ b/drivers/media/dvb/frontends/dib3000mc.c
@@ -12,6 +12,7 @@
12 */ 12 */
13 13
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/slab.h>
15#include <linux/i2c.h> 16#include <linux/i2c.h>
16 17
17#include "dvb_frontend.h" 18#include "dvb_frontend.h"
diff --git a/drivers/media/dvb/frontends/dib7000m.c b/drivers/media/dvb/frontends/dib7000m.c
index 0109720353bd..0f09fd31cb29 100644
--- a/drivers/media/dvb/frontends/dib7000m.c
+++ b/drivers/media/dvb/frontends/dib7000m.c
@@ -9,6 +9,7 @@
9 * published by the Free Software Foundation, version 2. 9 * published by the Free Software Foundation, version 2.
10 */ 10 */
11#include <linux/kernel.h> 11#include <linux/kernel.h>
12#include <linux/slab.h>
12#include <linux/i2c.h> 13#include <linux/i2c.h>
13 14
14#include "dvb_frontend.h" 15#include "dvb_frontend.h"
diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c
index 0781f94e05d2..85468a45c344 100644
--- a/drivers/media/dvb/frontends/dib7000p.c
+++ b/drivers/media/dvb/frontends/dib7000p.c
@@ -8,6 +8,7 @@
8 * published by the Free Software Foundation, version 2. 8 * published by the Free Software Foundation, version 2.
9 */ 9 */
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/slab.h>
11#include <linux/i2c.h> 12#include <linux/i2c.h>
12 13
13#include "dvb_math.h" 14#include "dvb_math.h"
@@ -108,7 +109,7 @@ static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode)
108 109
109 outreg = 0; 110 outreg = 0;
110 fifo_threshold = 1792; 111 fifo_threshold = 1792;
111 smo_mode = (dib7000p_read_word(state, 235) & 0x0010) | (1 << 1); 112 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
112 113
113 dprintk( "setting output mode for demod %p to %d", 114 dprintk( "setting output mode for demod %p to %d",
114 &state->demod, mode); 115 &state->demod, mode);
@@ -162,18 +163,19 @@ static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff)
162 if (state->div_force_off) { 163 if (state->div_force_off) {
163 dprintk( "diversity combination deactivated - forced by COFDM parameters"); 164 dprintk( "diversity combination deactivated - forced by COFDM parameters");
164 onoff = 0; 165 onoff = 0;
165 } 166 dib7000p_write_word(state, 207, 0);
167 } else
168 dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
169
166 state->div_state = (u8)onoff; 170 state->div_state = (u8)onoff;
167 171
168 if (onoff) { 172 if (onoff) {
169 dib7000p_write_word(state, 204, 6); 173 dib7000p_write_word(state, 204, 6);
170 dib7000p_write_word(state, 205, 16); 174 dib7000p_write_word(state, 205, 16);
171 /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */ 175 /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */
172 dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
173 } else { 176 } else {
174 dib7000p_write_word(state, 204, 1); 177 dib7000p_write_word(state, 204, 1);
175 dib7000p_write_word(state, 205, 0); 178 dib7000p_write_word(state, 205, 0);
176 dib7000p_write_word(state, 207, 0);
177 } 179 }
178 180
179 return 0; 181 return 0;
@@ -1188,7 +1190,7 @@ static int dib7000p_read_status(struct dvb_frontend *fe, fe_status_t *stat)
1188 *stat |= FE_HAS_VITERBI; 1190 *stat |= FE_HAS_VITERBI;
1189 if (lock & 0x0010) 1191 if (lock & 0x0010)
1190 *stat |= FE_HAS_SYNC; 1192 *stat |= FE_HAS_SYNC;
1191 if (lock & 0x0008) 1193 if ((lock & 0x0038) == 0x38)
1192 *stat |= FE_HAS_LOCK; 1194 *stat |= FE_HAS_LOCK;
1193 1195
1194 return 0; 1196 return 0;
@@ -1302,6 +1304,24 @@ struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *demod, enum di
1302} 1304}
1303EXPORT_SYMBOL(dib7000p_get_i2c_master); 1305EXPORT_SYMBOL(dib7000p_get_i2c_master);
1304 1306
1307int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1308{
1309 struct dib7000p_state *state = fe->demodulator_priv;
1310 u16 val = dib7000p_read_word(state, 235) & 0xffef;
1311 val |= (onoff & 0x1) << 4;
1312 dprintk("PID filter enabled %d", onoff);
1313 return dib7000p_write_word(state, 235, val);
1314}
1315EXPORT_SYMBOL(dib7000p_pid_filter_ctrl);
1316
1317int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1318{
1319 struct dib7000p_state *state = fe->demodulator_priv;
1320 dprintk("PID filter: index %x, PID %d, OnOff %d", id, pid, onoff);
1321 return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0);
1322}
1323EXPORT_SYMBOL(dib7000p_pid_filter);
1324
1305int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]) 1325int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
1306{ 1326{
1307 struct dib7000p_state st = { .i2c_adap = i2c }; 1327 struct dib7000p_state st = { .i2c_adap = i2c };
@@ -1314,8 +1334,10 @@ int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 defau
1314 /* designated i2c address */ 1334 /* designated i2c address */
1315 new_addr = (0x40 + k) << 1; 1335 new_addr = (0x40 + k) << 1;
1316 st.i2c_addr = new_addr; 1336 st.i2c_addr = new_addr;
1337 dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */
1317 if (dib7000p_identify(&st) != 0) { 1338 if (dib7000p_identify(&st) != 0) {
1318 st.i2c_addr = default_addr; 1339 st.i2c_addr = default_addr;
1340 dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */
1319 if (dib7000p_identify(&st) != 0) { 1341 if (dib7000p_identify(&st) != 0) {
1320 dprintk("DiB7000P #%d: not identified\n", k); 1342 dprintk("DiB7000P #%d: not identified\n", k);
1321 return -EIO; 1343 return -EIO;
@@ -1372,6 +1394,8 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr,
1372 demod->demodulator_priv = st; 1394 demod->demodulator_priv = st;
1373 memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops)); 1395 memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
1374 1396
1397 dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */
1398
1375 if (dib7000p_identify(st) != 0) 1399 if (dib7000p_identify(st) != 0)
1376 goto error; 1400 goto error;
1377 1401
diff --git a/drivers/media/dvb/frontends/dib7000p.h b/drivers/media/dvb/frontends/dib7000p.h
index 02a4c82f0c70..805dd13a97ee 100644
--- a/drivers/media/dvb/frontends/dib7000p.h
+++ b/drivers/media/dvb/frontends/dib7000p.h
@@ -51,6 +51,8 @@ extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c,
51extern int dib7000p_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); 51extern int dib7000p_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val);
52extern int dib7000p_set_wbd_ref(struct dvb_frontend *, u16 value); 52extern int dib7000p_set_wbd_ref(struct dvb_frontend *, u16 value);
53extern int dib7000pc_detection(struct i2c_adapter *i2c_adap); 53extern int dib7000pc_detection(struct i2c_adapter *i2c_adap);
54extern int dib7000p_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff);
55extern int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff);
54#else 56#else
55static inline 57static inline
56struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, 58struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr,
@@ -95,6 +97,17 @@ static inline int dib7000pc_detection(struct i2c_adapter *i2c_adap)
95 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 97 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
96 return -ENODEV; 98 return -ENODEV;
97} 99}
100static inline int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
101{
102 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
103 return -ENODEV;
104}
105
106static inline int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, uint8_t onoff)
107{
108 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
109 return -ENODEV;
110}
98#endif 111#endif
99 112
100#endif 113#endif
diff --git a/drivers/media/dvb/frontends/dib8000.c b/drivers/media/dvb/frontends/dib8000.c
index 852c790d09d9..df17b91b3250 100644
--- a/drivers/media/dvb/frontends/dib8000.c
+++ b/drivers/media/dvb/frontends/dib8000.c
@@ -8,6 +8,7 @@
8 * published by the Free Software Foundation, version 2. 8 * published by the Free Software Foundation, version 2.
9 */ 9 */
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/slab.h>
11#include <linux/i2c.h> 12#include <linux/i2c.h>
12#include "dvb_math.h" 13#include "dvb_math.h"
13 14
@@ -28,18 +29,6 @@ MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
28 29
29#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0) 30#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0)
30 31
31enum frontend_tune_state {
32 CT_AGC_START = 20,
33 CT_AGC_STEP_0,
34 CT_AGC_STEP_1,
35 CT_AGC_STEP_2,
36 CT_AGC_STEP_3,
37 CT_AGC_STEP_4,
38 CT_AGC_STOP,
39
40 CT_DEMOD_START = 30,
41};
42
43#define FE_STATUS_TUNE_FAILED 0 32#define FE_STATUS_TUNE_FAILED 0
44 33
45struct i2c_device { 34struct i2c_device {
@@ -133,104 +122,104 @@ static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
133 return dib8000_i2c_write16(&state->i2c, reg, val); 122 return dib8000_i2c_write16(&state->i2c, reg, val);
134} 123}
135 124
136const int16_t coeff_2k_sb_1seg_dqpsk[8] = { 125static const int16_t coeff_2k_sb_1seg_dqpsk[8] = {
137 (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c, 126 (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c,
138 (920 << 5) | 0x09 127 (920 << 5) | 0x09
139}; 128};
140 129
141const int16_t coeff_2k_sb_1seg[8] = { 130static const int16_t coeff_2k_sb_1seg[8] = {
142 (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f 131 (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f
143}; 132};
144 133
145const int16_t coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = { 134static const int16_t coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = {
146 (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11, 135 (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11,
147 (-931 << 5) | 0x0f 136 (-931 << 5) | 0x0f
148}; 137};
149 138
150const int16_t coeff_2k_sb_3seg_0dqpsk[8] = { 139static const int16_t coeff_2k_sb_3seg_0dqpsk[8] = {
151 (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e, 140 (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e,
152 (982 << 5) | 0x0c 141 (982 << 5) | 0x0c
153}; 142};
154 143
155const int16_t coeff_2k_sb_3seg_1dqpsk[8] = { 144static const int16_t coeff_2k_sb_3seg_1dqpsk[8] = {
156 (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12, 145 (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12,
157 (-720 << 5) | 0x0d 146 (-720 << 5) | 0x0d
158}; 147};
159 148
160const int16_t coeff_2k_sb_3seg[8] = { 149static const int16_t coeff_2k_sb_3seg[8] = {
161 (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e, 150 (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e,
162 (-610 << 5) | 0x0a 151 (-610 << 5) | 0x0a
163}; 152};
164 153
165const int16_t coeff_4k_sb_1seg_dqpsk[8] = { 154static const int16_t coeff_4k_sb_1seg_dqpsk[8] = {
166 (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f, 155 (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f,
167 (-922 << 5) | 0x0d 156 (-922 << 5) | 0x0d
168}; 157};
169 158
170const int16_t coeff_4k_sb_1seg[8] = { 159static const int16_t coeff_4k_sb_1seg[8] = {
171 (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d, 160 (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d,
172 (-655 << 5) | 0x0a 161 (-655 << 5) | 0x0a
173}; 162};
174 163
175const int16_t coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = { 164static const int16_t coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = {
176 (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14, 165 (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14,
177 (-958 << 5) | 0x13 166 (-958 << 5) | 0x13
178}; 167};
179 168
180const int16_t coeff_4k_sb_3seg_0dqpsk[8] = { 169static const int16_t coeff_4k_sb_3seg_0dqpsk[8] = {
181 (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12, 170 (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12,
182 (-568 << 5) | 0x0f 171 (-568 << 5) | 0x0f
183}; 172};
184 173
185const int16_t coeff_4k_sb_3seg_1dqpsk[8] = { 174static const int16_t coeff_4k_sb_3seg_1dqpsk[8] = {
186 (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14, 175 (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14,
187 (-848 << 5) | 0x13 176 (-848 << 5) | 0x13
188}; 177};
189 178
190const int16_t coeff_4k_sb_3seg[8] = { 179static const int16_t coeff_4k_sb_3seg[8] = {
191 (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12, 180 (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12,
192 (-869 << 5) | 0x13 181 (-869 << 5) | 0x13
193}; 182};
194 183
195const int16_t coeff_8k_sb_1seg_dqpsk[8] = { 184static const int16_t coeff_8k_sb_1seg_dqpsk[8] = {
196 (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13, 185 (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13,
197 (-598 << 5) | 0x10 186 (-598 << 5) | 0x10
198}; 187};
199 188
200const int16_t coeff_8k_sb_1seg[8] = { 189static const int16_t coeff_8k_sb_1seg[8] = {
201 (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f, 190 (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f,
202 (585 << 5) | 0x0f 191 (585 << 5) | 0x0f
203}; 192};
204 193
205const int16_t coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = { 194static const int16_t coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = {
206 (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18, 195 (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18,
207 (0 << 5) | 0x14 196 (0 << 5) | 0x14
208}; 197};
209 198
210const int16_t coeff_8k_sb_3seg_0dqpsk[8] = { 199static const int16_t coeff_8k_sb_3seg_0dqpsk[8] = {
211 (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15, 200 (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15,
212 (-877 << 5) | 0x15 201 (-877 << 5) | 0x15
213}; 202};
214 203
215const int16_t coeff_8k_sb_3seg_1dqpsk[8] = { 204static const int16_t coeff_8k_sb_3seg_1dqpsk[8] = {
216 (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18, 205 (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18,
217 (-921 << 5) | 0x14 206 (-921 << 5) | 0x14
218}; 207};
219 208
220const int16_t coeff_8k_sb_3seg[8] = { 209static const int16_t coeff_8k_sb_3seg[8] = {
221 (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15, 210 (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15,
222 (690 << 5) | 0x14 211 (690 << 5) | 0x14
223}; 212};
224 213
225const int16_t ana_fe_coeff_3seg[24] = { 214static const int16_t ana_fe_coeff_3seg[24] = {
226 81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017 215 81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017
227}; 216};
228 217
229const int16_t ana_fe_coeff_1seg[24] = { 218static const int16_t ana_fe_coeff_1seg[24] = {
230 249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003 219 249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003
231}; 220};
232 221
233const int16_t ana_fe_coeff_13seg[24] = { 222static const int16_t ana_fe_coeff_13seg[24] = {
234 396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1 223 396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1
235}; 224};
236 225
@@ -852,6 +841,14 @@ static int dib8000_set_agc_config(struct dib8000_state *state, u8 band)
852 return 0; 841 return 0;
853} 842}
854 843
844void dib8000_pwm_agc_reset(struct dvb_frontend *fe)
845{
846 struct dib8000_state *state = fe->demodulator_priv;
847 dib8000_set_adc_state(state, DIBX000_ADC_ON);
848 dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000)));
849}
850EXPORT_SYMBOL(dib8000_pwm_agc_reset);
851
855static int dib8000_agc_soft_split(struct dib8000_state *state) 852static int dib8000_agc_soft_split(struct dib8000_state *state)
856{ 853{
857 u16 agc, split_offset; 854 u16 agc, split_offset;
@@ -939,6 +936,32 @@ static int dib8000_agc_startup(struct dvb_frontend *fe)
939 936
940} 937}
941 938
939static const int32_t lut_1000ln_mant[] =
940{
941 908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
942};
943
944int32_t dib8000_get_adc_power(struct dvb_frontend *fe, uint8_t mode)
945{
946 struct dib8000_state *state = fe->demodulator_priv;
947 uint32_t ix = 0, tmp_val = 0, exp = 0, mant = 0;
948 int32_t val;
949
950 val = dib8000_read32(state, 384);
951 /* mode = 1 : ln_agcpower calc using mant-exp conversion and mantis look up table */
952 if (mode) {
953 tmp_val = val;
954 while (tmp_val >>= 1)
955 exp++;
956 mant = (val * 1000 / (1<<exp));
957 ix = (uint8_t)((mant-1000)/100); /* index of the LUT */
958 val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908); /* 1000 * ln(adcpower_real) ; 693 = 1000ln(2) ; 6908 = 1000*ln(1000) ; 20 comes from adc_real = adc_pow_int / 2**20 */
959 val = (val*256)/1000;
960 }
961 return val;
962}
963EXPORT_SYMBOL(dib8000_get_adc_power);
964
942static void dib8000_update_timf(struct dib8000_state *state) 965static void dib8000_update_timf(struct dib8000_state *state)
943{ 966{
944 u32 timf = state->timf = dib8000_read32(state, 435); 967 u32 timf = state->timf = dib8000_read32(state, 435);
@@ -954,7 +977,7 @@ static void dib8000_set_channel(struct dib8000_state *state, u8 seq, u8 autosear
954 u8 guard, crate, constellation, timeI; 977 u8 guard, crate, constellation, timeI;
955 u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 }; 978 u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
956 u16 i, coeff[4], P_cfr_left_edge = 0, P_cfr_right_edge = 0, seg_mask13 = 0x1fff; // All 13 segments enabled 979 u16 i, coeff[4], P_cfr_left_edge = 0, P_cfr_right_edge = 0, seg_mask13 = 0x1fff; // All 13 segments enabled
957 const s16 *ncoeff, *ana_fe; 980 const s16 *ncoeff = NULL, *ana_fe;
958 u16 tmcc_pow = 0; 981 u16 tmcc_pow = 0;
959 u16 coff_pow = 0x2800; 982 u16 coff_pow = 0x2800;
960 u16 init_prbs = 0xfff; 983 u16 init_prbs = 0xfff;
@@ -1401,10 +1424,9 @@ static void dib8000_set_channel(struct dib8000_state *state, u8 seq, u8 autosear
1401 } 1424 }
1402 break; 1425 break;
1403 } 1426 }
1404 }
1405 if (state->fe.dtv_property_cache.isdbt_sb_mode == 1)
1406 for (i = 0; i < 8; i++) 1427 for (i = 0; i < 8; i++)
1407 dib8000_write_word(state, 343 + i, ncoeff[i]); 1428 dib8000_write_word(state, 343 + i, ncoeff[i]);
1429 }
1408 1430
1409 // P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 1431 // P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5
1410 dib8000_write_word(state, 351, 1432 dib8000_write_word(state, 351,
@@ -1854,6 +1876,24 @@ static int dib8000_sleep(struct dvb_frontend *fe)
1854 } 1876 }
1855} 1877}
1856 1878
1879enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
1880{
1881 struct dib8000_state *state = fe->demodulator_priv;
1882 return state->tune_state;
1883}
1884EXPORT_SYMBOL(dib8000_get_tune_state);
1885
1886int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1887{
1888 struct dib8000_state *state = fe->demodulator_priv;
1889 state->tune_state = tune_state;
1890 return 0;
1891}
1892EXPORT_SYMBOL(dib8000_set_tune_state);
1893
1894
1895
1896
1857static int dib8000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) 1897static int dib8000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1858{ 1898{
1859 struct dib8000_state *state = fe->demodulator_priv; 1899 struct dib8000_state *state = fe->demodulator_priv;
@@ -1960,6 +2000,8 @@ static int dib8000_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par
1960 struct dib8000_state *state = fe->demodulator_priv; 2000 struct dib8000_state *state = fe->demodulator_priv;
1961 int time, ret; 2001 int time, ret;
1962 2002
2003 fe->dtv_property_cache.delivery_system = SYS_ISDBT;
2004
1963 dib8000_set_output_mode(state, OUTMODE_HIGH_Z); 2005 dib8000_set_output_mode(state, OUTMODE_HIGH_Z);
1964 2006
1965 if (fe->ops.tuner_ops.set_params) 2007 if (fe->ops.tuner_ops.set_params)
@@ -2043,29 +2085,31 @@ static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
2043 2085
2044 *stat = 0; 2086 *stat = 0;
2045 2087
2046 if ((lock >> 14) & 1) // AGC 2088 if ((lock >> 13) & 1)
2047 *stat |= FE_HAS_SIGNAL; 2089 *stat |= FE_HAS_SIGNAL;
2048 2090
2049 if ((lock >> 8) & 1) // Equal 2091 if ((lock >> 8) & 1) /* Equal */
2050 *stat |= FE_HAS_CARRIER; 2092 *stat |= FE_HAS_CARRIER;
2051 2093
2052 if ((lock >> 3) & 1) // TMCC_SYNC 2094 if (((lock >> 1) & 0xf) == 0xf) /* TMCC_SYNC */
2053 *stat |= FE_HAS_SYNC; 2095 *stat |= FE_HAS_SYNC;
2054 2096
2055 if ((lock >> 5) & 7) // FEC MPEG 2097 if (((lock >> 12) & 1) && ((lock >> 5) & 7)) /* FEC MPEG */
2056 *stat |= FE_HAS_LOCK; 2098 *stat |= FE_HAS_LOCK;
2057 2099
2058 lock = dib8000_read_word(state, 554); // Viterbi Layer A 2100 if ((lock >> 12) & 1) {
2059 if (lock & 0x01) 2101 lock = dib8000_read_word(state, 554); /* Viterbi Layer A */
2060 *stat |= FE_HAS_VITERBI; 2102 if (lock & 0x01)
2103 *stat |= FE_HAS_VITERBI;
2061 2104
2062 lock = dib8000_read_word(state, 555); // Viterbi Layer B 2105 lock = dib8000_read_word(state, 555); /* Viterbi Layer B */
2063 if (lock & 0x01) 2106 if (lock & 0x01)
2064 *stat |= FE_HAS_VITERBI; 2107 *stat |= FE_HAS_VITERBI;
2065 2108
2066 lock = dib8000_read_word(state, 556); // Viterbi Layer C 2109 lock = dib8000_read_word(state, 556); /* Viterbi Layer C */
2067 if (lock & 0x01) 2110 if (lock & 0x01)
2068 *stat |= FE_HAS_VITERBI; 2111 *stat |= FE_HAS_VITERBI;
2112 }
2069 2113
2070 return 0; 2114 return 0;
2071} 2115}
@@ -2121,7 +2165,7 @@ static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
2121 else 2165 else
2122 result -= intlog10(2) * 10 * noise_exp - 100; 2166 result -= intlog10(2) * 10 * noise_exp - 100;
2123 2167
2124 *snr = result / (1 << 24); 2168 *snr = result / ((1 << 24) / 10);
2125 return 0; 2169 return 0;
2126} 2170}
2127 2171
@@ -2195,6 +2239,25 @@ struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000
2195 2239
2196EXPORT_SYMBOL(dib8000_get_i2c_master); 2240EXPORT_SYMBOL(dib8000_get_i2c_master);
2197 2241
2242int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
2243{
2244 struct dib8000_state *st = fe->demodulator_priv;
2245 u16 val = dib8000_read_word(st, 299) & 0xffef;
2246 val |= (onoff & 0x1) << 4;
2247
2248 dprintk("pid filter enabled %d", onoff);
2249 return dib8000_write_word(st, 299, val);
2250}
2251EXPORT_SYMBOL(dib8000_pid_filter_ctrl);
2252
2253int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
2254{
2255 struct dib8000_state *st = fe->demodulator_priv;
2256 dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
2257 return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
2258}
2259EXPORT_SYMBOL(dib8000_pid_filter);
2260
2198static const struct dvb_frontend_ops dib8000_ops = { 2261static const struct dvb_frontend_ops dib8000_ops = {
2199 .info = { 2262 .info = {
2200 .name = "DiBcom 8000 ISDB-T", 2263 .name = "DiBcom 8000 ISDB-T",
diff --git a/drivers/media/dvb/frontends/dib8000.h b/drivers/media/dvb/frontends/dib8000.h
index a86de340dd54..b1ee20799639 100644
--- a/drivers/media/dvb/frontends/dib8000.h
+++ b/drivers/media/dvb/frontends/dib8000.h
@@ -44,6 +44,12 @@ extern int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u
44 44
45extern int dib8000_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); 45extern int dib8000_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val);
46extern int dib8000_set_wbd_ref(struct dvb_frontend *, u16 value); 46extern int dib8000_set_wbd_ref(struct dvb_frontend *, u16 value);
47extern int dib8000_pid_filter_ctrl(struct dvb_frontend *, u8 onoff);
48extern int dib8000_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff);
49extern int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state);
50extern enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe);
51extern void dib8000_pwm_agc_reset(struct dvb_frontend *fe);
52extern s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode);
47#else 53#else
48static inline struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg) 54static inline struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
49{ 55{
@@ -57,23 +63,53 @@ static inline struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe
57 return NULL; 63 return NULL;
58} 64}
59 65
60int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 default_addr, u8 first_addr) 66static inline int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 default_addr, u8 first_addr)
61{ 67{
62 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 68 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
63 return -ENODEV; 69 return -ENODEV;
64} 70}
65 71
66int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val) 72static inline int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
67{ 73{
68 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 74 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
69 return -ENODEV; 75 return -ENODEV;
70} 76}
71 77
72int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value) 78static inline int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value)
73{ 79{
74 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 80 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
75 return -ENODEV; 81 return -ENODEV;
76} 82}
83
84static inline int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
85{
86 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
87 return -ENODEV;
88}
89
90static inline int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
91{
92 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
93 return -ENODEV;
94}
95static inline int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
96{
97 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
98 return -ENODEV;
99}
100static inline enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
101{
102 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
103 return CT_SHUTDOWN;
104}
105static inline void dib8000_pwm_agc_reset(struct dvb_frontend *fe)
106{
107 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
108}
109static inline s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode)
110{
111 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
112}
77#endif 113#endif
78 114
79#endif 115#endif
diff --git a/drivers/media/dvb/frontends/dibx000_common.c b/drivers/media/dvb/frontends/dibx000_common.c
index 4efca30d2127..980e02f1575e 100644
--- a/drivers/media/dvb/frontends/dibx000_common.c
+++ b/drivers/media/dvb/frontends/dibx000_common.c
@@ -6,7 +6,7 @@ static int debug;
6module_param(debug, int, 0644); 6module_param(debug, int, 0644);
7MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); 7MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
8 8
9#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiBX000: "); printk(args); } } while (0) 9#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiBX000: "); printk(args); printk("\n"); } } while (0)
10 10
11static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val) 11static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val)
12{ 12{
@@ -25,7 +25,7 @@ static int dibx000_i2c_select_interface(struct dibx000_i2c_master *mst,
25 enum dibx000_i2c_interface intf) 25 enum dibx000_i2c_interface intf)
26{ 26{
27 if (mst->device_rev > DIB3000MC && mst->selected_interface != intf) { 27 if (mst->device_rev > DIB3000MC && mst->selected_interface != intf) {
28 dprintk("selecting interface: %d\n", intf); 28 dprintk("selecting interface: %d", intf);
29 mst->selected_interface = intf; 29 mst->selected_interface = intf;
30 return dibx000_write_word(mst, mst->base_reg + 4, intf); 30 return dibx000_write_word(mst, mst->base_reg + 4, intf);
31 } 31 }
@@ -171,9 +171,18 @@ void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst)
171{ 171{
172 i2c_del_adapter(&mst->gated_tuner_i2c_adap); 172 i2c_del_adapter(&mst->gated_tuner_i2c_adap);
173} 173}
174
175EXPORT_SYMBOL(dibx000_exit_i2c_master); 174EXPORT_SYMBOL(dibx000_exit_i2c_master);
176 175
176
177u32 systime(void)
178{
179 struct timespec t;
180
181 t = current_kernel_time();
182 return (t.tv_sec * 10000) + (t.tv_nsec / 100000);
183}
184EXPORT_SYMBOL(systime);
185
177MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>"); 186MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
178MODULE_DESCRIPTION("Common function the DiBcom demodulator family"); 187MODULE_DESCRIPTION("Common function the DiBcom demodulator family");
179MODULE_LICENSE("GPL"); 188MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/dibx000_common.h b/drivers/media/dvb/frontends/dibx000_common.h
index 5be10eca07c0..4f5d141a308d 100644
--- a/drivers/media/dvb/frontends/dibx000_common.h
+++ b/drivers/media/dvb/frontends/dibx000_common.h
@@ -36,13 +36,17 @@ extern struct i2c_adapter *dibx000_get_i2c_adapter(struct dibx000_i2c_master
36extern void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst); 36extern void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst);
37extern void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst); 37extern void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst);
38 38
39extern u32 systime(void);
40
39#define BAND_LBAND 0x01 41#define BAND_LBAND 0x01
40#define BAND_UHF 0x02 42#define BAND_UHF 0x02
41#define BAND_VHF 0x04 43#define BAND_VHF 0x04
42#define BAND_SBAND 0x08 44#define BAND_SBAND 0x08
43#define BAND_FM 0x10 45#define BAND_FM 0x10
46#define BAND_CBAND 0x20
44 47
45#define BAND_OF_FREQUENCY(freq_kHz) ( (freq_kHz) <= 115000 ? BAND_FM : \ 48#define BAND_OF_FREQUENCY(freq_kHz) ((freq_kHz) <= 170000 ? BAND_CBAND : \
49 (freq_kHz) <= 115000 ? BAND_FM : \
46 (freq_kHz) <= 250000 ? BAND_VHF : \ 50 (freq_kHz) <= 250000 ? BAND_VHF : \
47 (freq_kHz) <= 863000 ? BAND_UHF : \ 51 (freq_kHz) <= 863000 ? BAND_UHF : \
48 (freq_kHz) <= 2000000 ? BAND_LBAND : BAND_SBAND ) 52 (freq_kHz) <= 2000000 ? BAND_LBAND : BAND_SBAND )
@@ -149,4 +153,67 @@ enum dibx000_adc_states {
149#define OUTMODE_MPEG2_FIFO 5 153#define OUTMODE_MPEG2_FIFO 5
150#define OUTMODE_ANALOG_ADC 6 154#define OUTMODE_ANALOG_ADC 6
151 155
156enum frontend_tune_state {
157 CT_TUNER_START = 10,
158 CT_TUNER_STEP_0,
159 CT_TUNER_STEP_1,
160 CT_TUNER_STEP_2,
161 CT_TUNER_STEP_3,
162 CT_TUNER_STEP_4,
163 CT_TUNER_STEP_5,
164 CT_TUNER_STEP_6,
165 CT_TUNER_STEP_7,
166 CT_TUNER_STOP,
167
168 CT_AGC_START = 20,
169 CT_AGC_STEP_0,
170 CT_AGC_STEP_1,
171 CT_AGC_STEP_2,
172 CT_AGC_STEP_3,
173 CT_AGC_STEP_4,
174 CT_AGC_STOP,
175
176 CT_DEMOD_START = 30,
177 CT_DEMOD_STEP_1,
178 CT_DEMOD_STEP_2,
179 CT_DEMOD_STEP_3,
180 CT_DEMOD_STEP_4,
181 CT_DEMOD_STEP_5,
182 CT_DEMOD_STEP_6,
183 CT_DEMOD_STEP_7,
184 CT_DEMOD_STEP_8,
185 CT_DEMOD_STEP_9,
186 CT_DEMOD_STEP_10,
187 CT_DEMOD_SEARCH_NEXT = 41,
188 CT_DEMOD_STEP_LOCKED,
189 CT_DEMOD_STOP,
190
191 CT_DONE = 100,
192 CT_SHUTDOWN,
193
194};
195
196struct dvb_frontend_parametersContext {
197#define CHANNEL_STATUS_PARAMETERS_UNKNOWN 0x01
198#define CHANNEL_STATUS_PARAMETERS_SET 0x02
199 u8 status;
200 u32 tune_time_estimation[2];
201 s32 tps_available;
202 u16 tps[9];
203};
204
205#define FE_STATUS_TUNE_FAILED 0
206#define FE_STATUS_TUNE_TIMED_OUT -1
207#define FE_STATUS_TUNE_TIME_TOO_SHORT -2
208#define FE_STATUS_TUNE_PENDING -3
209#define FE_STATUS_STD_SUCCESS -4
210#define FE_STATUS_FFT_SUCCESS -5
211#define FE_STATUS_DEMOD_SUCCESS -6
212#define FE_STATUS_LOCKED -7
213#define FE_STATUS_DATA_LOCKED -8
214
215#define FE_CALLBACK_TIME_NEVER 0xffffffff
216
217#define ABS(x) ((x < 0) ? (-x) : (x))
218
152#endif 219#endif
diff --git a/drivers/media/dvb/frontends/drx397xD.c b/drivers/media/dvb/frontends/drx397xD.c
index 010075535221..f74cca6dc26b 100644
--- a/drivers/media/dvb/frontends/drx397xD.c
+++ b/drivers/media/dvb/frontends/drx397xD.c
@@ -26,6 +26,7 @@
26#include <linux/delay.h> 26#include <linux/delay.h>
27#include <linux/string.h> 27#include <linux/string.h>
28#include <linux/firmware.h> 28#include <linux/firmware.h>
29#include <linux/slab.h>
29#include <asm/div64.h> 30#include <asm/div64.h>
30 31
31#include "dvb_frontend.h" 32#include "dvb_frontend.h"
@@ -81,7 +82,7 @@ static struct {
81#include "drx397xD_fw.h" 82#include "drx397xD_fw.h"
82}; 83};
83 84
84/* use only with writer lock aquired */ 85/* use only with writer lock acquired */
85static void _drx_release_fw(struct drx397xD_state *s, enum fw_ix ix) 86static void _drx_release_fw(struct drx397xD_state *s, enum fw_ix ix)
86{ 87{
87 memset(&fw[ix].data[0], 0, sizeof(fw[0].data)); 88 memset(&fw[ix].data[0], 0, sizeof(fw[0].data));
diff --git a/drivers/media/dvb/frontends/ds3000.c b/drivers/media/dvb/frontends/ds3000.c
new file mode 100644
index 000000000000..cff3535566fe
--- /dev/null
+++ b/drivers/media/dvb/frontends/ds3000.c
@@ -0,0 +1,1367 @@
1/*
2 Montage Technology DS3000/TS2020 - DVBS/S2 Demodulator/Tuner driver
3 Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
4
5 Copyright (C) 2009 TurboSight.com
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include <linux/slab.h>
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/init.h>
27#include <linux/firmware.h>
28
29#include "dvb_frontend.h"
30#include "ds3000.h"
31
32static int debug;
33
34#define dprintk(args...) \
35 do { \
36 if (debug) \
37 printk(args); \
38 } while (0)
39
40/* as of March 2009 current DS3000 firmware version is 1.78 */
41/* DS3000 FW v1.78 MD5: a32d17910c4f370073f9346e71d34b80 */
42#define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
43
44#define DS3000_SAMPLE_RATE 96000 /* in kHz */
45#define DS3000_XTAL_FREQ 27000 /* in kHz */
46
47/* Register values to initialise the demod in DVB-S mode */
48static u8 ds3000_dvbs_init_tab[] = {
49 0x23, 0x05,
50 0x08, 0x03,
51 0x0c, 0x00,
52 0x21, 0x54,
53 0x25, 0x82,
54 0x27, 0x31,
55 0x30, 0x08,
56 0x31, 0x40,
57 0x32, 0x32,
58 0x33, 0x35,
59 0x35, 0xff,
60 0x3a, 0x00,
61 0x37, 0x10,
62 0x38, 0x10,
63 0x39, 0x02,
64 0x42, 0x60,
65 0x4a, 0x40,
66 0x4b, 0x04,
67 0x4d, 0x91,
68 0x5d, 0xc8,
69 0x50, 0x77,
70 0x51, 0x77,
71 0x52, 0x36,
72 0x53, 0x36,
73 0x56, 0x01,
74 0x63, 0x43,
75 0x64, 0x30,
76 0x65, 0x40,
77 0x68, 0x26,
78 0x69, 0x4c,
79 0x70, 0x20,
80 0x71, 0x70,
81 0x72, 0x04,
82 0x73, 0x00,
83 0x70, 0x40,
84 0x71, 0x70,
85 0x72, 0x04,
86 0x73, 0x00,
87 0x70, 0x60,
88 0x71, 0x70,
89 0x72, 0x04,
90 0x73, 0x00,
91 0x70, 0x80,
92 0x71, 0x70,
93 0x72, 0x04,
94 0x73, 0x00,
95 0x70, 0xa0,
96 0x71, 0x70,
97 0x72, 0x04,
98 0x73, 0x00,
99 0x70, 0x1f,
100 0x76, 0x00,
101 0x77, 0xd1,
102 0x78, 0x0c,
103 0x79, 0x80,
104 0x7f, 0x04,
105 0x7c, 0x00,
106 0x80, 0x86,
107 0x81, 0xa6,
108 0x85, 0x04,
109 0xcd, 0xf4,
110 0x90, 0x33,
111 0xa0, 0x44,
112 0xc0, 0x18,
113 0xc3, 0x10,
114 0xc4, 0x08,
115 0xc5, 0x80,
116 0xc6, 0x80,
117 0xc7, 0x0a,
118 0xc8, 0x1a,
119 0xc9, 0x80,
120 0xfe, 0x92,
121 0xe0, 0xf8,
122 0xe6, 0x8b,
123 0xd0, 0x40,
124 0xf8, 0x20,
125 0xfa, 0x0f,
126 0xfd, 0x20,
127 0xad, 0x20,
128 0xae, 0x07,
129 0xb8, 0x00,
130};
131
132/* Register values to initialise the demod in DVB-S2 mode */
133static u8 ds3000_dvbs2_init_tab[] = {
134 0x23, 0x0f,
135 0x08, 0x07,
136 0x0c, 0x00,
137 0x21, 0x54,
138 0x25, 0x82,
139 0x27, 0x31,
140 0x30, 0x08,
141 0x31, 0x32,
142 0x32, 0x32,
143 0x33, 0x35,
144 0x35, 0xff,
145 0x3a, 0x00,
146 0x37, 0x10,
147 0x38, 0x10,
148 0x39, 0x02,
149 0x42, 0x60,
150 0x4a, 0x80,
151 0x4b, 0x04,
152 0x4d, 0x81,
153 0x5d, 0x88,
154 0x50, 0x36,
155 0x51, 0x36,
156 0x52, 0x36,
157 0x53, 0x36,
158 0x63, 0x60,
159 0x64, 0x10,
160 0x65, 0x10,
161 0x68, 0x04,
162 0x69, 0x29,
163 0x70, 0x20,
164 0x71, 0x70,
165 0x72, 0x04,
166 0x73, 0x00,
167 0x70, 0x40,
168 0x71, 0x70,
169 0x72, 0x04,
170 0x73, 0x00,
171 0x70, 0x60,
172 0x71, 0x70,
173 0x72, 0x04,
174 0x73, 0x00,
175 0x70, 0x80,
176 0x71, 0x70,
177 0x72, 0x04,
178 0x73, 0x00,
179 0x70, 0xa0,
180 0x71, 0x70,
181 0x72, 0x04,
182 0x73, 0x00,
183 0x70, 0x1f,
184 0xa0, 0x44,
185 0xc0, 0x08,
186 0xc1, 0x10,
187 0xc2, 0x08,
188 0xc3, 0x10,
189 0xc4, 0x08,
190 0xc5, 0xf0,
191 0xc6, 0xf0,
192 0xc7, 0x0a,
193 0xc8, 0x1a,
194 0xc9, 0x80,
195 0xca, 0x23,
196 0xcb, 0x24,
197 0xce, 0x74,
198 0x90, 0x03,
199 0x76, 0x80,
200 0x77, 0x42,
201 0x78, 0x0a,
202 0x79, 0x80,
203 0xad, 0x40,
204 0xae, 0x07,
205 0x7f, 0xd4,
206 0x7c, 0x00,
207 0x80, 0xa8,
208 0x81, 0xda,
209 0x7c, 0x01,
210 0x80, 0xda,
211 0x81, 0xec,
212 0x7c, 0x02,
213 0x80, 0xca,
214 0x81, 0xeb,
215 0x7c, 0x03,
216 0x80, 0xba,
217 0x81, 0xdb,
218 0x85, 0x08,
219 0x86, 0x00,
220 0x87, 0x02,
221 0x89, 0x80,
222 0x8b, 0x44,
223 0x8c, 0xaa,
224 0x8a, 0x10,
225 0xba, 0x00,
226 0xf5, 0x04,
227 0xfe, 0x44,
228 0xd2, 0x32,
229 0xb8, 0x00,
230};
231
232/* DS3000 doesn't need some parameters as input and auto-detects them */
233/* save input from the application of those parameters */
234struct ds3000_tuning {
235 u32 frequency;
236 u32 symbol_rate;
237 fe_spectral_inversion_t inversion;
238 enum fe_code_rate fec;
239
240 /* input values */
241 u8 inversion_val;
242 fe_modulation_t delivery;
243 u8 rolloff;
244};
245
246struct ds3000_state {
247 struct i2c_adapter *i2c;
248 const struct ds3000_config *config;
249
250 struct dvb_frontend frontend;
251
252 struct ds3000_tuning dcur;
253 struct ds3000_tuning dnxt;
254
255 u8 skip_fw_load;
256
257 /* previous uncorrected block counter for DVB-S2 */
258 u16 prevUCBS2;
259};
260
261static int ds3000_writereg(struct ds3000_state *state, int reg, int data)
262{
263 u8 buf[] = { reg, data };
264 struct i2c_msg msg = { .addr = state->config->demod_address,
265 .flags = 0, .buf = buf, .len = 2 };
266 int err;
267
268 dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
269
270 err = i2c_transfer(state->i2c, &msg, 1);
271 if (err != 1) {
272 printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x,"
273 " value == 0x%02x)\n", __func__, err, reg, data);
274 return -EREMOTEIO;
275 }
276
277 return 0;
278}
279
280static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data)
281{
282 u8 buf[] = { reg, data };
283 struct i2c_msg msg = { .addr = 0x60,
284 .flags = 0, .buf = buf, .len = 2 };
285 int err;
286
287 dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
288
289 ds3000_writereg(state, 0x03, 0x11);
290 err = i2c_transfer(state->i2c, &msg, 1);
291 if (err != 1) {
292 printk("%s: writereg error(err == %i, reg == 0x%02x,"
293 " value == 0x%02x)\n", __func__, err, reg, data);
294 return -EREMOTEIO;
295 }
296
297 return 0;
298}
299
300/* I2C write for 8k firmware load */
301static int ds3000_writeFW(struct ds3000_state *state, int reg,
302 const u8 *data, u16 len)
303{
304 int i, ret = -EREMOTEIO;
305 struct i2c_msg msg;
306 u8 *buf;
307
308 buf = kmalloc(3, GFP_KERNEL);
309 if (buf == NULL) {
310 printk(KERN_ERR "Unable to kmalloc\n");
311 ret = -ENOMEM;
312 goto error;
313 }
314
315 *(buf) = reg;
316
317 msg.addr = state->config->demod_address;
318 msg.flags = 0;
319 msg.buf = buf;
320 msg.len = 3;
321
322 for (i = 0; i < len; i += 2) {
323 memcpy(buf + 1, data + i, 2);
324
325 dprintk("%s: write reg 0x%02x, len = %d\n", __func__, reg, len);
326
327 ret = i2c_transfer(state->i2c, &msg, 1);
328 if (ret != 1) {
329 printk(KERN_ERR "%s: write error(err == %i, "
330 "reg == 0x%02x\n", __func__, ret, reg);
331 ret = -EREMOTEIO;
332 }
333 }
334
335error:
336 kfree(buf);
337
338 return ret;
339}
340
341static int ds3000_readreg(struct ds3000_state *state, u8 reg)
342{
343 int ret;
344 u8 b0[] = { reg };
345 u8 b1[] = { 0 };
346 struct i2c_msg msg[] = {
347 {
348 .addr = state->config->demod_address,
349 .flags = 0,
350 .buf = b0,
351 .len = 1
352 }, {
353 .addr = state->config->demod_address,
354 .flags = I2C_M_RD,
355 .buf = b1,
356 .len = 1
357 }
358 };
359
360 ret = i2c_transfer(state->i2c, msg, 2);
361
362 if (ret != 2) {
363 printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
364 return ret;
365 }
366
367 dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
368
369 return b1[0];
370}
371
372static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg)
373{
374 int ret;
375 u8 b0[] = { reg };
376 u8 b1[] = { 0 };
377 struct i2c_msg msg[] = {
378 {
379 .addr = 0x60,
380 .flags = 0,
381 .buf = b0,
382 .len = 1
383 }, {
384 .addr = 0x60,
385 .flags = I2C_M_RD,
386 .buf = b1,
387 .len = 1
388 }
389 };
390
391 ds3000_writereg(state, 0x03, 0x12);
392 ret = i2c_transfer(state->i2c, msg, 2);
393
394 if (ret != 2) {
395 printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
396 return ret;
397 }
398
399 dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
400
401 return b1[0];
402}
403
404static int ds3000_set_inversion(struct ds3000_state *state,
405 fe_spectral_inversion_t inversion)
406{
407 dprintk("%s(%d)\n", __func__, inversion);
408
409 switch (inversion) {
410 case INVERSION_OFF:
411 case INVERSION_ON:
412 case INVERSION_AUTO:
413 break;
414 default:
415 return -EINVAL;
416 }
417
418 state->dnxt.inversion = inversion;
419
420 return 0;
421}
422
423static int ds3000_set_symbolrate(struct ds3000_state *state, u32 rate)
424{
425 int ret = 0;
426
427 dprintk("%s()\n", __func__);
428
429 dprintk("%s() symbol_rate = %d\n", __func__, state->dnxt.symbol_rate);
430
431 /* check if symbol rate is within limits */
432 if ((state->dnxt.symbol_rate >
433 state->frontend.ops.info.symbol_rate_max) ||
434 (state->dnxt.symbol_rate <
435 state->frontend.ops.info.symbol_rate_min))
436 ret = -EOPNOTSUPP;
437
438 state->dnxt.symbol_rate = rate;
439
440 return ret;
441}
442
443static int ds3000_load_firmware(struct dvb_frontend *fe,
444 const struct firmware *fw);
445
446static int ds3000_firmware_ondemand(struct dvb_frontend *fe)
447{
448 struct ds3000_state *state = fe->demodulator_priv;
449 const struct firmware *fw;
450 int ret = 0;
451
452 dprintk("%s()\n", __func__);
453
454 if (ds3000_readreg(state, 0xb2) <= 0)
455 return ret;
456
457 if (state->skip_fw_load)
458 return 0;
459 /* Load firmware */
460 /* request the firmware, this will block until someone uploads it */
461 printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__,
462 DS3000_DEFAULT_FIRMWARE);
463 ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
464 state->i2c->dev.parent);
465 printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__);
466 if (ret) {
467 printk(KERN_ERR "%s: No firmware uploaded (timeout or file not "
468 "found?)\n", __func__);
469 return ret;
470 }
471
472 /* Make sure we don't recurse back through here during loading */
473 state->skip_fw_load = 1;
474
475 ret = ds3000_load_firmware(fe, fw);
476 if (ret)
477 printk("%s: Writing firmware to device failed\n", __func__);
478
479 release_firmware(fw);
480
481 dprintk("%s: Firmware upload %s\n", __func__,
482 ret == 0 ? "complete" : "failed");
483
484 /* Ensure firmware is always loaded if required */
485 state->skip_fw_load = 0;
486
487 return ret;
488}
489
490static int ds3000_load_firmware(struct dvb_frontend *fe,
491 const struct firmware *fw)
492{
493 struct ds3000_state *state = fe->demodulator_priv;
494
495 dprintk("%s\n", __func__);
496 dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
497 fw->size,
498 fw->data[0],
499 fw->data[1],
500 fw->data[fw->size - 2],
501 fw->data[fw->size - 1]);
502
503 /* Begin the firmware load process */
504 ds3000_writereg(state, 0xb2, 0x01);
505 /* write the entire firmware */
506 ds3000_writeFW(state, 0xb0, fw->data, fw->size);
507 ds3000_writereg(state, 0xb2, 0x00);
508
509 return 0;
510}
511
512static void ds3000_dump_registers(struct dvb_frontend *fe)
513{
514 struct ds3000_state *state = fe->demodulator_priv;
515 int x, y, reg = 0, val;
516
517 for (y = 0; y < 16; y++) {
518 dprintk("%s: %02x: ", __func__, y);
519 for (x = 0; x < 16; x++) {
520 reg = (y << 4) + x;
521 val = ds3000_readreg(state, reg);
522 if (x != 15)
523 dprintk("%02x ", val);
524 else
525 dprintk("%02x\n", val);
526 }
527 }
528 dprintk("%s: -- DS3000 DUMP DONE --\n", __func__);
529}
530
531static int ds3000_read_status(struct dvb_frontend *fe, fe_status_t* status)
532{
533 struct ds3000_state *state = fe->demodulator_priv;
534 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
535 int lock;
536
537 *status = 0;
538
539 switch (c->delivery_system) {
540 case SYS_DVBS:
541 lock = ds3000_readreg(state, 0xd1);
542 if ((lock & 0x07) == 0x07)
543 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
544 FE_HAS_VITERBI | FE_HAS_SYNC |
545 FE_HAS_LOCK;
546
547 break;
548 case SYS_DVBS2:
549 lock = ds3000_readreg(state, 0x0d);
550 if ((lock & 0x8f) == 0x8f)
551 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
552 FE_HAS_VITERBI | FE_HAS_SYNC |
553 FE_HAS_LOCK;
554
555 break;
556 default:
557 return 1;
558 }
559
560 dprintk("%s: status = 0x%02x\n", __func__, lock);
561
562 return 0;
563}
564
565#define FE_IS_TUNED (FE_HAS_SIGNAL + FE_HAS_LOCK)
566static int ds3000_is_tuned(struct dvb_frontend *fe)
567{
568 fe_status_t tunerstat;
569
570 ds3000_read_status(fe, &tunerstat);
571
572 return ((tunerstat & FE_IS_TUNED) == FE_IS_TUNED);
573}
574
575/* read DS3000 BER value */
576static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber)
577{
578 struct ds3000_state *state = fe->demodulator_priv;
579 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
580 u8 data;
581 u32 ber_reading, lpdc_frames;
582
583 dprintk("%s()\n", __func__);
584
585 switch (c->delivery_system) {
586 case SYS_DVBS:
587 /* set the number of bytes checked during
588 BER estimation */
589 ds3000_writereg(state, 0xf9, 0x04);
590 /* read BER estimation status */
591 data = ds3000_readreg(state, 0xf8);
592 /* check if BER estimation is ready */
593 if ((data & 0x10) == 0) {
594 /* this is the number of error bits,
595 to calculate the bit error rate
596 divide to 8388608 */
597 *ber = (ds3000_readreg(state, 0xf7) << 8) |
598 ds3000_readreg(state, 0xf6);
599 /* start counting error bits */
600 /* need to be set twice
601 otherwise it fails sometimes */
602 data |= 0x10;
603 ds3000_writereg(state, 0xf8, data);
604 ds3000_writereg(state, 0xf8, data);
605 } else
606 /* used to indicate that BER estimation
607 is not ready, i.e. BER is unknown */
608 *ber = 0xffffffff;
609 break;
610 case SYS_DVBS2:
611 /* read the number of LPDC decoded frames */
612 lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) |
613 (ds3000_readreg(state, 0xd6) << 8) |
614 ds3000_readreg(state, 0xd5);
615 /* read the number of packets with bad CRC */
616 ber_reading = (ds3000_readreg(state, 0xf8) << 8) |
617 ds3000_readreg(state, 0xf7);
618 if (lpdc_frames > 750) {
619 /* clear LPDC frame counters */
620 ds3000_writereg(state, 0xd1, 0x01);
621 /* clear bad packets counter */
622 ds3000_writereg(state, 0xf9, 0x01);
623 /* enable bad packets counter */
624 ds3000_writereg(state, 0xf9, 0x00);
625 /* enable LPDC frame counters */
626 ds3000_writereg(state, 0xd1, 0x00);
627 *ber = ber_reading;
628 } else
629 /* used to indicate that BER estimation is not ready,
630 i.e. BER is unknown */
631 *ber = 0xffffffff;
632 break;
633 default:
634 return 1;
635 }
636
637 return 0;
638}
639
640/* read TS2020 signal strength */
641static int ds3000_read_signal_strength(struct dvb_frontend *fe,
642 u16 *signal_strength)
643{
644 struct ds3000_state *state = fe->demodulator_priv;
645 u16 sig_reading, sig_strength;
646 u8 rfgain, bbgain;
647
648 dprintk("%s()\n", __func__);
649
650 rfgain = ds3000_tuner_readreg(state, 0x3d) & 0x1f;
651 bbgain = ds3000_tuner_readreg(state, 0x21) & 0x1f;
652
653 if (rfgain > 15)
654 rfgain = 15;
655 if (bbgain > 13)
656 bbgain = 13;
657
658 sig_reading = rfgain * 2 + bbgain * 3;
659
660 sig_strength = 40 + (64 - sig_reading) * 50 / 64 ;
661
662 /* cook the value to be suitable for szap-s2 human readable output */
663 *signal_strength = sig_strength * 1000;
664
665 dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", __func__,
666 sig_reading, *signal_strength);
667
668 return 0;
669}
670
671/* calculate DS3000 snr value in dB */
672static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr)
673{
674 struct ds3000_state *state = fe->demodulator_priv;
675 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
676 u8 snr_reading, snr_value;
677 u32 dvbs2_signal_reading, dvbs2_noise_reading, tmp;
678 static const u16 dvbs_snr_tab[] = { /* 20 x Table (rounded up) */
679 0x0000, 0x1b13, 0x2aea, 0x3627, 0x3ede, 0x45fe, 0x4c03,
680 0x513a, 0x55d4, 0x59f2, 0x5dab, 0x6111, 0x6431, 0x6717,
681 0x69c9, 0x6c4e, 0x6eac, 0x70e8, 0x7304, 0x7505
682 };
683 static const u16 dvbs2_snr_tab[] = { /* 80 x Table (rounded up) */
684 0x0000, 0x0bc2, 0x12a3, 0x1785, 0x1b4e, 0x1e65, 0x2103,
685 0x2347, 0x2546, 0x2710, 0x28ae, 0x2a28, 0x2b83, 0x2cc5,
686 0x2df1, 0x2f09, 0x3010, 0x3109, 0x31f4, 0x32d2, 0x33a6,
687 0x3470, 0x3531, 0x35ea, 0x369b, 0x3746, 0x37ea, 0x3888,
688 0x3920, 0x39b3, 0x3a42, 0x3acc, 0x3b51, 0x3bd3, 0x3c51,
689 0x3ccb, 0x3d42, 0x3db6, 0x3e27, 0x3e95, 0x3f00, 0x3f68,
690 0x3fcf, 0x4033, 0x4094, 0x40f4, 0x4151, 0x41ac, 0x4206,
691 0x425e, 0x42b4, 0x4308, 0x435b, 0x43ac, 0x43fc, 0x444a,
692 0x4497, 0x44e2, 0x452d, 0x4576, 0x45bd, 0x4604, 0x4649,
693 0x468e, 0x46d1, 0x4713, 0x4755, 0x4795, 0x47d4, 0x4813,
694 0x4851, 0x488d, 0x48c9, 0x4904, 0x493f, 0x4978, 0x49b1,
695 0x49e9, 0x4a20, 0x4a57
696 };
697
698 dprintk("%s()\n", __func__);
699
700 switch (c->delivery_system) {
701 case SYS_DVBS:
702 snr_reading = ds3000_readreg(state, 0xff);
703 snr_reading /= 8;
704 if (snr_reading == 0)
705 *snr = 0x0000;
706 else {
707 if (snr_reading > 20)
708 snr_reading = 20;
709 snr_value = dvbs_snr_tab[snr_reading - 1] * 10 / 23026;
710 /* cook the value to be suitable for szap-s2
711 human readable output */
712 *snr = snr_value * 8 * 655;
713 }
714 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
715 snr_reading, *snr);
716 break;
717 case SYS_DVBS2:
718 dvbs2_noise_reading = (ds3000_readreg(state, 0x8c) & 0x3f) +
719 (ds3000_readreg(state, 0x8d) << 4);
720 dvbs2_signal_reading = ds3000_readreg(state, 0x8e);
721 tmp = dvbs2_signal_reading * dvbs2_signal_reading >> 1;
722 if (dvbs2_signal_reading == 0) {
723 *snr = 0x0000;
724 return 0;
725 }
726 if (dvbs2_noise_reading == 0) {
727 snr_value = 0x0013;
728 /* cook the value to be suitable for szap-s2
729 human readable output */
730 *snr = 0xffff;
731 return 0;
732 }
733 if (tmp > dvbs2_noise_reading) {
734 snr_reading = tmp / dvbs2_noise_reading;
735 if (snr_reading > 80)
736 snr_reading = 80;
737 snr_value = dvbs2_snr_tab[snr_reading - 1] / 1000;
738 /* cook the value to be suitable for szap-s2
739 human readable output */
740 *snr = snr_value * 5 * 655;
741 } else {
742 snr_reading = dvbs2_noise_reading / tmp;
743 if (snr_reading > 80)
744 snr_reading = 80;
745 *snr = -(dvbs2_snr_tab[snr_reading] / 1000);
746 }
747 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
748 snr_reading, *snr);
749 break;
750 default:
751 return 1;
752 }
753
754 return 0;
755}
756
757/* read DS3000 uncorrected blocks */
758static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
759{
760 struct ds3000_state *state = fe->demodulator_priv;
761 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
762 u8 data;
763 u16 _ucblocks;
764
765 dprintk("%s()\n", __func__);
766
767 switch (c->delivery_system) {
768 case SYS_DVBS:
769 *ucblocks = (ds3000_readreg(state, 0xf5) << 8) |
770 ds3000_readreg(state, 0xf4);
771 data = ds3000_readreg(state, 0xf8);
772 /* clear packet counters */
773 data &= ~0x20;
774 ds3000_writereg(state, 0xf8, data);
775 /* enable packet counters */
776 data |= 0x20;
777 ds3000_writereg(state, 0xf8, data);
778 break;
779 case SYS_DVBS2:
780 _ucblocks = (ds3000_readreg(state, 0xe2) << 8) |
781 ds3000_readreg(state, 0xe1);
782 if (_ucblocks > state->prevUCBS2)
783 *ucblocks = _ucblocks - state->prevUCBS2;
784 else
785 *ucblocks = state->prevUCBS2 - _ucblocks;
786 state->prevUCBS2 = _ucblocks;
787 break;
788 default:
789 return 1;
790 }
791
792 return 0;
793}
794
795/* Overwrite the current tuning params, we are about to tune */
796static void ds3000_clone_params(struct dvb_frontend *fe)
797{
798 struct ds3000_state *state = fe->demodulator_priv;
799 memcpy(&state->dcur, &state->dnxt, sizeof(state->dcur));
800}
801
802static int ds3000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
803{
804 struct ds3000_state *state = fe->demodulator_priv;
805 u8 data;
806
807 dprintk("%s(%d)\n", __func__, tone);
808 if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
809 printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
810 return -EINVAL;
811 }
812
813 data = ds3000_readreg(state, 0xa2);
814 data &= ~0xc0;
815 ds3000_writereg(state, 0xa2, data);
816
817 switch (tone) {
818 case SEC_TONE_ON:
819 dprintk("%s: setting tone on\n", __func__);
820 data = ds3000_readreg(state, 0xa1);
821 data &= ~0x43;
822 data |= 0x04;
823 ds3000_writereg(state, 0xa1, data);
824 break;
825 case SEC_TONE_OFF:
826 dprintk("%s: setting tone off\n", __func__);
827 data = ds3000_readreg(state, 0xa2);
828 data |= 0x80;
829 ds3000_writereg(state, 0xa2, data);
830 break;
831 }
832
833 return 0;
834}
835
836static int ds3000_send_diseqc_msg(struct dvb_frontend *fe,
837 struct dvb_diseqc_master_cmd *d)
838{
839 struct ds3000_state *state = fe->demodulator_priv;
840 int i;
841 u8 data;
842
843 /* Dump DiSEqC message */
844 dprintk("%s(", __func__);
845 for (i = 0 ; i < d->msg_len;) {
846 dprintk("0x%02x", d->msg[i]);
847 if (++i < d->msg_len)
848 dprintk(", ");
849 }
850
851 /* enable DiSEqC message send pin */
852 data = ds3000_readreg(state, 0xa2);
853 data &= ~0xc0;
854 ds3000_writereg(state, 0xa2, data);
855
856 /* DiSEqC message */
857 for (i = 0; i < d->msg_len; i++)
858 ds3000_writereg(state, 0xa3 + i, d->msg[i]);
859
860 data = ds3000_readreg(state, 0xa1);
861 /* clear DiSEqC message length and status,
862 enable DiSEqC message send */
863 data &= ~0xf8;
864 /* set DiSEqC mode, modulation active during 33 pulses,
865 set DiSEqC message length */
866 data |= ((d->msg_len - 1) << 3) | 0x07;
867 ds3000_writereg(state, 0xa1, data);
868
869 /* wait up to 150ms for DiSEqC transmission to complete */
870 for (i = 0; i < 15; i++) {
871 data = ds3000_readreg(state, 0xa1);
872 if ((data & 0x40) == 0)
873 break;
874 msleep(10);
875 }
876
877 /* DiSEqC timeout after 150ms */
878 if (i == 15) {
879 data = ds3000_readreg(state, 0xa1);
880 data &= ~0x80;
881 data |= 0x40;
882 ds3000_writereg(state, 0xa1, data);
883
884 data = ds3000_readreg(state, 0xa2);
885 data &= ~0xc0;
886 data |= 0x80;
887 ds3000_writereg(state, 0xa2, data);
888
889 return 1;
890 }
891
892 data = ds3000_readreg(state, 0xa2);
893 data &= ~0xc0;
894 data |= 0x80;
895 ds3000_writereg(state, 0xa2, data);
896
897 return 0;
898}
899
900/* Send DiSEqC burst */
901static int ds3000_diseqc_send_burst(struct dvb_frontend *fe,
902 fe_sec_mini_cmd_t burst)
903{
904 struct ds3000_state *state = fe->demodulator_priv;
905 int i;
906 u8 data;
907
908 dprintk("%s()\n", __func__);
909
910 data = ds3000_readreg(state, 0xa2);
911 data &= ~0xc0;
912 ds3000_writereg(state, 0xa2, data);
913
914 /* DiSEqC burst */
915 if (burst == SEC_MINI_A)
916 /* Unmodulated tone burst */
917 ds3000_writereg(state, 0xa1, 0x02);
918 else if (burst == SEC_MINI_B)
919 /* Modulated tone burst */
920 ds3000_writereg(state, 0xa1, 0x01);
921 else
922 return -EINVAL;
923
924 msleep(13);
925 for (i = 0; i < 5; i++) {
926 data = ds3000_readreg(state, 0xa1);
927 if ((data & 0x40) == 0)
928 break;
929 msleep(1);
930 }
931
932 if (i == 5) {
933 data = ds3000_readreg(state, 0xa1);
934 data &= ~0x80;
935 data |= 0x40;
936 ds3000_writereg(state, 0xa1, data);
937
938 data = ds3000_readreg(state, 0xa2);
939 data &= ~0xc0;
940 data |= 0x80;
941 ds3000_writereg(state, 0xa2, data);
942
943 return 1;
944 }
945
946 data = ds3000_readreg(state, 0xa2);
947 data &= ~0xc0;
948 data |= 0x80;
949 ds3000_writereg(state, 0xa2, data);
950
951 return 0;
952}
953
954static void ds3000_release(struct dvb_frontend *fe)
955{
956 struct ds3000_state *state = fe->demodulator_priv;
957 dprintk("%s\n", __func__);
958 kfree(state);
959}
960
961static struct dvb_frontend_ops ds3000_ops;
962
963struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
964 struct i2c_adapter *i2c)
965{
966 struct ds3000_state *state = NULL;
967 int ret;
968
969 dprintk("%s\n", __func__);
970
971 /* allocate memory for the internal state */
972 state = kmalloc(sizeof(struct ds3000_state), GFP_KERNEL);
973 if (state == NULL) {
974 printk(KERN_ERR "Unable to kmalloc\n");
975 goto error2;
976 }
977
978 /* setup the state */
979 memset(state, 0, sizeof(struct ds3000_state));
980
981 state->config = config;
982 state->i2c = i2c;
983 state->prevUCBS2 = 0;
984
985 /* check if the demod is present */
986 ret = ds3000_readreg(state, 0x00) & 0xfe;
987 if (ret != 0xe0) {
988 printk(KERN_ERR "Invalid probe, probably not a DS3000\n");
989 goto error3;
990 }
991
992 printk(KERN_INFO "DS3000 chip version: %d.%d attached.\n",
993 ds3000_readreg(state, 0x02),
994 ds3000_readreg(state, 0x01));
995
996 memcpy(&state->frontend.ops, &ds3000_ops,
997 sizeof(struct dvb_frontend_ops));
998 state->frontend.demodulator_priv = state;
999 return &state->frontend;
1000
1001error3:
1002 kfree(state);
1003error2:
1004 return NULL;
1005}
1006EXPORT_SYMBOL(ds3000_attach);
1007
1008static int ds3000_set_property(struct dvb_frontend *fe,
1009 struct dtv_property *tvp)
1010{
1011 dprintk("%s(..)\n", __func__);
1012 return 0;
1013}
1014
1015static int ds3000_get_property(struct dvb_frontend *fe,
1016 struct dtv_property *tvp)
1017{
1018 dprintk("%s(..)\n", __func__);
1019 return 0;
1020}
1021
1022static int ds3000_tune(struct dvb_frontend *fe,
1023 struct dvb_frontend_parameters *p)
1024{
1025 struct ds3000_state *state = fe->demodulator_priv;
1026 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1027
1028 int ret = 0, retune, i;
1029 u8 status, mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf;
1030 u16 value, ndiv;
1031 u32 f3db;
1032
1033 dprintk("%s() ", __func__);
1034
1035 /* Load the firmware if required */
1036 ret = ds3000_firmware_ondemand(fe);
1037 if (ret != 0) {
1038 printk(KERN_ERR "%s: Unable initialise the firmware\n",
1039 __func__);
1040 return ret;
1041 }
1042
1043 state->dnxt.delivery = c->modulation;
1044 state->dnxt.frequency = c->frequency;
1045 state->dnxt.rolloff = 2; /* fixme */
1046 state->dnxt.fec = c->fec_inner;
1047
1048 ret = ds3000_set_inversion(state, p->inversion);
1049 if (ret != 0)
1050 return ret;
1051
1052 ret = ds3000_set_symbolrate(state, c->symbol_rate);
1053 if (ret != 0)
1054 return ret;
1055
1056 /* discard the 'current' tuning parameters and prepare to tune */
1057 ds3000_clone_params(fe);
1058
1059 retune = 1; /* try 1 times */
1060 dprintk("%s: retune = %d\n", __func__, retune);
1061 dprintk("%s: frequency = %d\n", __func__, state->dcur.frequency);
1062 dprintk("%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1063 dprintk("%s: FEC = %d \n", __func__,
1064 state->dcur.fec);
1065 dprintk("%s: Inversion = %d\n", __func__, state->dcur.inversion);
1066
1067 do {
1068 /* Reset status register */
1069 status = 0;
1070 /* Tune */
1071 /* TS2020 init */
1072 ds3000_tuner_writereg(state, 0x42, 0x73);
1073 ds3000_tuner_writereg(state, 0x05, 0x01);
1074 ds3000_tuner_writereg(state, 0x62, 0xf5);
1075 /* unknown */
1076 ds3000_tuner_writereg(state, 0x07, 0x02);
1077 ds3000_tuner_writereg(state, 0x10, 0x00);
1078 ds3000_tuner_writereg(state, 0x60, 0x79);
1079 ds3000_tuner_writereg(state, 0x08, 0x01);
1080 ds3000_tuner_writereg(state, 0x00, 0x01);
1081 /* calculate and set freq divider */
1082 if (state->dcur.frequency < 1146000) {
1083 ds3000_tuner_writereg(state, 0x10, 0x11);
1084 ndiv = ((state->dcur.frequency * (6 + 8) * 4) +
1085 (DS3000_XTAL_FREQ / 2)) /
1086 DS3000_XTAL_FREQ - 1024;
1087 } else {
1088 ds3000_tuner_writereg(state, 0x10, 0x01);
1089 ndiv = ((state->dcur.frequency * (6 + 8) * 2) +
1090 (DS3000_XTAL_FREQ / 2)) /
1091 DS3000_XTAL_FREQ - 1024;
1092 }
1093
1094 ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8);
1095 ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff);
1096
1097 /* set pll */
1098 ds3000_tuner_writereg(state, 0x03, 0x06);
1099 ds3000_tuner_writereg(state, 0x51, 0x0f);
1100 ds3000_tuner_writereg(state, 0x51, 0x1f);
1101 ds3000_tuner_writereg(state, 0x50, 0x10);
1102 ds3000_tuner_writereg(state, 0x50, 0x00);
1103 msleep(5);
1104
1105 /* unknown */
1106 ds3000_tuner_writereg(state, 0x51, 0x17);
1107 ds3000_tuner_writereg(state, 0x51, 0x1f);
1108 ds3000_tuner_writereg(state, 0x50, 0x08);
1109 ds3000_tuner_writereg(state, 0x50, 0x00);
1110 msleep(5);
1111
1112 value = ds3000_tuner_readreg(state, 0x3d);
1113 value &= 0x0f;
1114 if ((value > 4) && (value < 15)) {
1115 value -= 3;
1116 if (value < 4)
1117 value = 4;
1118 value = ((value << 3) | 0x01) & 0x79;
1119 }
1120
1121 ds3000_tuner_writereg(state, 0x60, value);
1122 ds3000_tuner_writereg(state, 0x51, 0x17);
1123 ds3000_tuner_writereg(state, 0x51, 0x1f);
1124 ds3000_tuner_writereg(state, 0x50, 0x08);
1125 ds3000_tuner_writereg(state, 0x50, 0x00);
1126
1127 /* set low-pass filter period */
1128 ds3000_tuner_writereg(state, 0x04, 0x2e);
1129 ds3000_tuner_writereg(state, 0x51, 0x1b);
1130 ds3000_tuner_writereg(state, 0x51, 0x1f);
1131 ds3000_tuner_writereg(state, 0x50, 0x04);
1132 ds3000_tuner_writereg(state, 0x50, 0x00);
1133 msleep(5);
1134
1135 f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000;
1136 if ((state->dcur.symbol_rate / 1000) < 5000)
1137 f3db += 3000;
1138 if (f3db < 7000)
1139 f3db = 7000;
1140 if (f3db > 40000)
1141 f3db = 40000;
1142
1143 /* set low-pass filter baseband */
1144 value = ds3000_tuner_readreg(state, 0x26);
1145 mlpf = 0x2e * 207 / ((value << 1) + 151);
1146 mlpf_max = mlpf * 135 / 100;
1147 mlpf_min = mlpf * 78 / 100;
1148 if (mlpf_max > 63)
1149 mlpf_max = 63;
1150
1151 /* rounded to the closest integer */
1152 nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2))
1153 / (2766 * DS3000_XTAL_FREQ);
1154 if (nlpf > 23)
1155 nlpf = 23;
1156 if (nlpf < 1)
1157 nlpf = 1;
1158
1159 /* rounded to the closest integer */
1160 mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1161 (1000 * f3db / 2)) / (1000 * f3db);
1162
1163 if (mlpf_new < mlpf_min) {
1164 nlpf++;
1165 mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1166 (1000 * f3db / 2)) / (1000 * f3db);
1167 }
1168
1169 if (mlpf_new > mlpf_max)
1170 mlpf_new = mlpf_max;
1171
1172 ds3000_tuner_writereg(state, 0x04, mlpf_new);
1173 ds3000_tuner_writereg(state, 0x06, nlpf);
1174 ds3000_tuner_writereg(state, 0x51, 0x1b);
1175 ds3000_tuner_writereg(state, 0x51, 0x1f);
1176 ds3000_tuner_writereg(state, 0x50, 0x04);
1177 ds3000_tuner_writereg(state, 0x50, 0x00);
1178 msleep(5);
1179
1180 /* unknown */
1181 ds3000_tuner_writereg(state, 0x51, 0x1e);
1182 ds3000_tuner_writereg(state, 0x51, 0x1f);
1183 ds3000_tuner_writereg(state, 0x50, 0x01);
1184 ds3000_tuner_writereg(state, 0x50, 0x00);
1185 msleep(60);
1186
1187 /* ds3000 global reset */
1188 ds3000_writereg(state, 0x07, 0x80);
1189 ds3000_writereg(state, 0x07, 0x00);
1190 /* ds3000 build-in uC reset */
1191 ds3000_writereg(state, 0xb2, 0x01);
1192 /* ds3000 software reset */
1193 ds3000_writereg(state, 0x00, 0x01);
1194
1195 switch (c->delivery_system) {
1196 case SYS_DVBS:
1197 /* initialise the demod in DVB-S mode */
1198 for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
1199 ds3000_writereg(state,
1200 ds3000_dvbs_init_tab[i],
1201 ds3000_dvbs_init_tab[i + 1]);
1202 value = ds3000_readreg(state, 0xfe);
1203 value &= 0xc0;
1204 value |= 0x1b;
1205 ds3000_writereg(state, 0xfe, value);
1206 break;
1207 case SYS_DVBS2:
1208 /* initialise the demod in DVB-S2 mode */
1209 for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
1210 ds3000_writereg(state,
1211 ds3000_dvbs2_init_tab[i],
1212 ds3000_dvbs2_init_tab[i + 1]);
1213 ds3000_writereg(state, 0xfe, 0x54);
1214 break;
1215 default:
1216 return 1;
1217 }
1218
1219 /* enable 27MHz clock output */
1220 ds3000_writereg(state, 0x29, 0x80);
1221 /* enable ac coupling */
1222 ds3000_writereg(state, 0x25, 0x8a);
1223
1224 /* enhance symbol rate performance */
1225 if ((state->dcur.symbol_rate / 1000) <= 5000) {
1226 value = 29777 / (state->dcur.symbol_rate / 1000) + 1;
1227 if (value % 2 != 0)
1228 value++;
1229 ds3000_writereg(state, 0xc3, 0x0d);
1230 ds3000_writereg(state, 0xc8, value);
1231 ds3000_writereg(state, 0xc4, 0x10);
1232 ds3000_writereg(state, 0xc7, 0x0e);
1233 } else if ((state->dcur.symbol_rate / 1000) <= 10000) {
1234 value = 92166 / (state->dcur.symbol_rate / 1000) + 1;
1235 if (value % 2 != 0)
1236 value++;
1237 ds3000_writereg(state, 0xc3, 0x07);
1238 ds3000_writereg(state, 0xc8, value);
1239 ds3000_writereg(state, 0xc4, 0x09);
1240 ds3000_writereg(state, 0xc7, 0x12);
1241 } else if ((state->dcur.symbol_rate / 1000) <= 20000) {
1242 value = 64516 / (state->dcur.symbol_rate / 1000) + 1;
1243 ds3000_writereg(state, 0xc3, value);
1244 ds3000_writereg(state, 0xc8, 0x0e);
1245 ds3000_writereg(state, 0xc4, 0x07);
1246 ds3000_writereg(state, 0xc7, 0x18);
1247 } else {
1248 value = 129032 / (state->dcur.symbol_rate / 1000) + 1;
1249 ds3000_writereg(state, 0xc3, value);
1250 ds3000_writereg(state, 0xc8, 0x0a);
1251 ds3000_writereg(state, 0xc4, 0x05);
1252 ds3000_writereg(state, 0xc7, 0x24);
1253 }
1254
1255 /* normalized symbol rate rounded to the closest integer */
1256 value = (((state->dcur.symbol_rate / 1000) << 16) +
1257 (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
1258 ds3000_writereg(state, 0x61, value & 0x00ff);
1259 ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
1260
1261 /* co-channel interference cancellation disabled */
1262 ds3000_writereg(state, 0x56, 0x00);
1263
1264 /* equalizer disabled */
1265 ds3000_writereg(state, 0x76, 0x00);
1266
1267 /*ds3000_writereg(state, 0x08, 0x03);
1268 ds3000_writereg(state, 0xfd, 0x22);
1269 ds3000_writereg(state, 0x08, 0x07);
1270 ds3000_writereg(state, 0xfd, 0x42);
1271 ds3000_writereg(state, 0x08, 0x07);*/
1272
1273 /* ds3000 out of software reset */
1274 ds3000_writereg(state, 0x00, 0x00);
1275 /* start ds3000 build-in uC */
1276 ds3000_writereg(state, 0xb2, 0x00);
1277
1278 /* TODO: calculate and set carrier offset */
1279
1280 /* wait before retrying */
1281 for (i = 0; i < 30 ; i++) {
1282 if (ds3000_is_tuned(fe)) {
1283 dprintk("%s: Tuned\n", __func__);
1284 ds3000_dump_registers(fe);
1285 goto tuned;
1286 }
1287 msleep(1);
1288 }
1289
1290 dprintk("%s: Not tuned\n", __func__);
1291 ds3000_dump_registers(fe);
1292
1293 } while (--retune);
1294
1295tuned:
1296 return ret;
1297}
1298
1299static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
1300{
1301 dprintk("%s()\n", __func__);
1302 return DVBFE_ALGO_SW;
1303}
1304
1305/*
1306 * Initialise or wake up device
1307 *
1308 * Power config will reset and load initial firmware if required
1309 */
1310static int ds3000_initfe(struct dvb_frontend *fe)
1311{
1312 dprintk("%s()\n", __func__);
1313 return 0;
1314}
1315
1316/* Put device to sleep */
1317static int ds3000_sleep(struct dvb_frontend *fe)
1318{
1319 dprintk("%s()\n", __func__);
1320 return 0;
1321}
1322
1323static struct dvb_frontend_ops ds3000_ops = {
1324
1325 .info = {
1326 .name = "Montage Technology DS3000/TS2020",
1327 .type = FE_QPSK,
1328 .frequency_min = 950000,
1329 .frequency_max = 2150000,
1330 .frequency_stepsize = 1011, /* kHz for QPSK frontends */
1331 .frequency_tolerance = 5000,
1332 .symbol_rate_min = 1000000,
1333 .symbol_rate_max = 45000000,
1334 .caps = FE_CAN_INVERSION_AUTO |
1335 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1336 FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1337 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1338 FE_CAN_2G_MODULATION |
1339 FE_CAN_QPSK | FE_CAN_RECOVER
1340 },
1341
1342 .release = ds3000_release,
1343
1344 .init = ds3000_initfe,
1345 .sleep = ds3000_sleep,
1346 .read_status = ds3000_read_status,
1347 .read_ber = ds3000_read_ber,
1348 .read_signal_strength = ds3000_read_signal_strength,
1349 .read_snr = ds3000_read_snr,
1350 .read_ucblocks = ds3000_read_ucblocks,
1351 .set_tone = ds3000_set_tone,
1352 .diseqc_send_master_cmd = ds3000_send_diseqc_msg,
1353 .diseqc_send_burst = ds3000_diseqc_send_burst,
1354 .get_frontend_algo = ds3000_get_algo,
1355
1356 .set_property = ds3000_set_property,
1357 .get_property = ds3000_get_property,
1358 .set_frontend = ds3000_tune,
1359};
1360
1361module_param(debug, int, 0644);
1362MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
1363
1364MODULE_DESCRIPTION("DVB Frontend module for Montage Technology "
1365 "DS3000/TS2020 hardware");
1366MODULE_AUTHOR("Konstantin Dimitrov");
1367MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/ds3000.h b/drivers/media/dvb/frontends/ds3000.h
new file mode 100644
index 000000000000..67f67038740a
--- /dev/null
+++ b/drivers/media/dvb/frontends/ds3000.h
@@ -0,0 +1,45 @@
1/*
2 Montage Technology DS3000/TS2020 - DVBS/S2 Satellite demod/tuner driver
3 Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
4
5 Copyright (C) 2009 TurboSight.com
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*/
21
22#ifndef DS3000_H
23#define DS3000_H
24
25#include <linux/dvb/frontend.h>
26
27struct ds3000_config {
28 /* the demodulator's i2c address */
29 u8 demod_address;
30};
31
32#if defined(CONFIG_DVB_DS3000) || \
33 (defined(CONFIG_DVB_DS3000_MODULE) && defined(MODULE))
34extern struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
35 struct i2c_adapter *i2c);
36#else
37static inline
38struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
39 struct i2c_adapter *i2c)
40{
41 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
42 return NULL;
43}
44#endif /* CONFIG_DVB_DS3000 */
45#endif /* DS3000_H */
diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c
index 6d865d6161d7..4d4d0bb5920a 100644
--- a/drivers/media/dvb/frontends/dvb-pll.c
+++ b/drivers/media/dvb/frontends/dvb-pll.c
@@ -18,6 +18,7 @@
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */ 19 */
20 20
21#include <linux/slab.h>
21#include <linux/module.h> 22#include <linux/module.h>
22#include <linux/dvb/frontend.h> 23#include <linux/dvb/frontend.h>
23#include <asm/types.h> 24#include <asm/types.h>
diff --git a/drivers/media/dvb/frontends/ec100.c b/drivers/media/dvb/frontends/ec100.c
new file mode 100644
index 000000000000..2414dc6ee5d9
--- /dev/null
+++ b/drivers/media/dvb/frontends/ec100.c
@@ -0,0 +1,335 @@
1/*
2 * E3C EC100 demodulator driver
3 *
4 * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 */
21
22#include "dvb_frontend.h"
23#include "ec100_priv.h"
24#include "ec100.h"
25
26int ec100_debug;
27module_param_named(debug, ec100_debug, int, 0644);
28MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
29
30struct ec100_state {
31 struct i2c_adapter *i2c;
32 struct dvb_frontend frontend;
33 struct ec100_config config;
34
35 u16 ber;
36};
37
38/* write single register */
39static int ec100_write_reg(struct ec100_state *state, u8 reg, u8 val)
40{
41 u8 buf[2] = {reg, val};
42 struct i2c_msg msg = {
43 .addr = state->config.demod_address,
44 .flags = 0,
45 .len = 2,
46 .buf = buf};
47
48 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
49 warn("I2C write failed reg:%02x", reg);
50 return -EREMOTEIO;
51 }
52 return 0;
53}
54
55/* read single register */
56static int ec100_read_reg(struct ec100_state *state, u8 reg, u8 *val)
57{
58 struct i2c_msg msg[2] = {
59 {
60 .addr = state->config.demod_address,
61 .flags = 0,
62 .len = 1,
63 .buf = &reg
64 }, {
65 .addr = state->config.demod_address,
66 .flags = I2C_M_RD,
67 .len = 1,
68 .buf = val
69 }
70 };
71
72 if (i2c_transfer(state->i2c, msg, 2) != 2) {
73 warn("I2C read failed reg:%02x", reg);
74 return -EREMOTEIO;
75 }
76 return 0;
77}
78
79static int ec100_set_frontend(struct dvb_frontend *fe,
80 struct dvb_frontend_parameters *params)
81{
82 struct ec100_state *state = fe->demodulator_priv;
83 int ret;
84 u8 tmp, tmp2;
85
86 deb_info("%s: freq:%d bw:%d\n", __func__, params->frequency,
87 params->u.ofdm.bandwidth);
88
89 /* program tuner */
90 if (fe->ops.tuner_ops.set_params)
91 fe->ops.tuner_ops.set_params(fe, params);
92
93 ret = ec100_write_reg(state, 0x04, 0x06);
94 if (ret)
95 goto error;
96 ret = ec100_write_reg(state, 0x67, 0x58);
97 if (ret)
98 goto error;
99 ret = ec100_write_reg(state, 0x05, 0x18);
100 if (ret)
101 goto error;
102
103 /* reg/bw | 6 | 7 | 8
104 -------+------+------+------
105 A 0x1b | 0xa1 | 0xe7 | 0x2c
106 A 0x1c | 0x55 | 0x63 | 0x72
107 -------+------+------+------
108 B 0x1b | 0xb7 | 0x00 | 0x49
109 B 0x1c | 0x55 | 0x64 | 0x72 */
110
111 switch (params->u.ofdm.bandwidth) {
112 case BANDWIDTH_6_MHZ:
113 tmp = 0xb7;
114 tmp2 = 0x55;
115 break;
116 case BANDWIDTH_7_MHZ:
117 tmp = 0x00;
118 tmp2 = 0x64;
119 break;
120 case BANDWIDTH_8_MHZ:
121 default:
122 tmp = 0x49;
123 tmp2 = 0x72;
124 }
125
126 ret = ec100_write_reg(state, 0x1b, tmp);
127 if (ret)
128 goto error;
129 ret = ec100_write_reg(state, 0x1c, tmp2);
130 if (ret)
131 goto error;
132
133 ret = ec100_write_reg(state, 0x0c, 0xbb); /* if freq */
134 if (ret)
135 goto error;
136 ret = ec100_write_reg(state, 0x0d, 0x31); /* if freq */
137 if (ret)
138 goto error;
139
140 ret = ec100_write_reg(state, 0x08, 0x24);
141 if (ret)
142 goto error;
143
144 ret = ec100_write_reg(state, 0x00, 0x00); /* go */
145 if (ret)
146 goto error;
147 ret = ec100_write_reg(state, 0x00, 0x20); /* go */
148 if (ret)
149 goto error;
150
151 return ret;
152error:
153 deb_info("%s: failed:%d\n", __func__, ret);
154 return ret;
155}
156
157static int ec100_get_tune_settings(struct dvb_frontend *fe,
158 struct dvb_frontend_tune_settings *fesettings)
159{
160 fesettings->min_delay_ms = 300;
161 fesettings->step_size = 0;
162 fesettings->max_drift = 0;
163
164 return 0;
165}
166
167static int ec100_read_status(struct dvb_frontend *fe, fe_status_t *status)
168{
169 struct ec100_state *state = fe->demodulator_priv;
170 int ret;
171 u8 tmp;
172 *status = 0;
173
174 ret = ec100_read_reg(state, 0x42, &tmp);
175 if (ret)
176 goto error;
177
178 if (tmp & 0x80) {
179 /* bit7 set - have lock */
180 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
181 FE_HAS_SYNC | FE_HAS_LOCK;
182 } else {
183 ret = ec100_read_reg(state, 0x01, &tmp);
184 if (ret)
185 goto error;
186
187 if (tmp & 0x10) {
188 /* bit4 set - have signal */
189 *status |= FE_HAS_SIGNAL;
190 if (!(tmp & 0x01)) {
191 /* bit0 clear - have ~valid signal */
192 *status |= FE_HAS_CARRIER | FE_HAS_VITERBI;
193 }
194 }
195 }
196
197 return ret;
198error:
199 deb_info("%s: failed:%d\n", __func__, ret);
200 return ret;
201}
202
203static int ec100_read_ber(struct dvb_frontend *fe, u32 *ber)
204{
205 struct ec100_state *state = fe->demodulator_priv;
206 int ret;
207 u8 tmp, tmp2;
208 u16 ber2;
209
210 *ber = 0;
211
212 ret = ec100_read_reg(state, 0x65, &tmp);
213 if (ret)
214 goto error;
215 ret = ec100_read_reg(state, 0x66, &tmp2);
216 if (ret)
217 goto error;
218
219 ber2 = (tmp2 << 8) | tmp;
220
221 /* if counter overflow or clear */
222 if (ber2 < state->ber)
223 *ber = ber2;
224 else
225 *ber = ber2 - state->ber;
226
227 state->ber = ber2;
228
229 return ret;
230error:
231 deb_info("%s: failed:%d\n", __func__, ret);
232 return ret;
233}
234
235static int ec100_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
236{
237 struct ec100_state *state = fe->demodulator_priv;
238 int ret;
239 u8 tmp;
240
241 ret = ec100_read_reg(state, 0x24, &tmp);
242 if (ret) {
243 *strength = 0;
244 goto error;
245 }
246
247 *strength = ((tmp << 8) | tmp);
248
249 return ret;
250error:
251 deb_info("%s: failed:%d\n", __func__, ret);
252 return ret;
253}
254
255static int ec100_read_snr(struct dvb_frontend *fe, u16 *snr)
256{
257 *snr = 0;
258 return 0;
259}
260
261static int ec100_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
262{
263 *ucblocks = 0;
264 return 0;
265}
266
267static void ec100_release(struct dvb_frontend *fe)
268{
269 struct ec100_state *state = fe->demodulator_priv;
270 kfree(state);
271}
272
273static struct dvb_frontend_ops ec100_ops;
274
275struct dvb_frontend *ec100_attach(const struct ec100_config *config,
276 struct i2c_adapter *i2c)
277{
278 int ret;
279 struct ec100_state *state = NULL;
280 u8 tmp;
281
282 /* allocate memory for the internal state */
283 state = kzalloc(sizeof(struct ec100_state), GFP_KERNEL);
284 if (state == NULL)
285 goto error;
286
287 /* setup the state */
288 state->i2c = i2c;
289 memcpy(&state->config, config, sizeof(struct ec100_config));
290
291 /* check if the demod is there */
292 ret = ec100_read_reg(state, 0x33, &tmp);
293 if (ret || tmp != 0x0b)
294 goto error;
295
296 /* create dvb_frontend */
297 memcpy(&state->frontend.ops, &ec100_ops,
298 sizeof(struct dvb_frontend_ops));
299 state->frontend.demodulator_priv = state;
300
301 return &state->frontend;
302error:
303 kfree(state);
304 return NULL;
305}
306EXPORT_SYMBOL(ec100_attach);
307
308static struct dvb_frontend_ops ec100_ops = {
309 .info = {
310 .name = "E3C EC100 DVB-T",
311 .type = FE_OFDM,
312 .caps =
313 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
314 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
315 FE_CAN_QPSK | FE_CAN_QAM_16 |
316 FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
317 FE_CAN_TRANSMISSION_MODE_AUTO |
318 FE_CAN_GUARD_INTERVAL_AUTO |
319 FE_CAN_HIERARCHY_AUTO |
320 FE_CAN_MUTE_TS
321 },
322
323 .release = ec100_release,
324 .set_frontend = ec100_set_frontend,
325 .get_tune_settings = ec100_get_tune_settings,
326 .read_status = ec100_read_status,
327 .read_ber = ec100_read_ber,
328 .read_signal_strength = ec100_read_signal_strength,
329 .read_snr = ec100_read_snr,
330 .read_ucblocks = ec100_read_ucblocks,
331};
332
333MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
334MODULE_DESCRIPTION("E3C EC100 DVB-T demodulator driver");
335MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/ec100.h b/drivers/media/dvb/frontends/ec100.h
new file mode 100644
index 000000000000..ee8e52417958
--- /dev/null
+++ b/drivers/media/dvb/frontends/ec100.h
@@ -0,0 +1,46 @@
1/*
2 * E3C EC100 demodulator driver
3 *
4 * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 */
21
22#ifndef EC100_H
23#define EC100_H
24
25#include <linux/dvb/frontend.h>
26
27struct ec100_config {
28 /* demodulator's I2C address */
29 u8 demod_address;
30};
31
32
33#if defined(CONFIG_DVB_EC100) || \
34 (defined(CONFIG_DVB_EC100_MODULE) && defined(MODULE))
35extern struct dvb_frontend *ec100_attach(const struct ec100_config *config,
36 struct i2c_adapter *i2c);
37#else
38static inline struct dvb_frontend *ec100_attach(
39 const struct ec100_config *config, struct i2c_adapter *i2c)
40{
41 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
42 return NULL;
43}
44#endif
45
46#endif /* EC100_H */
diff --git a/drivers/media/dvb/frontends/ec100_priv.h b/drivers/media/dvb/frontends/ec100_priv.h
new file mode 100644
index 000000000000..5c990144bc47
--- /dev/null
+++ b/drivers/media/dvb/frontends/ec100_priv.h
@@ -0,0 +1,39 @@
1/*
2 * E3C EC100 demodulator driver
3 *
4 * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 */
21
22#ifndef EC100_PRIV
23#define EC100_PRIV
24
25#define LOG_PREFIX "ec100"
26
27#define dprintk(var, level, args...) \
28 do { if ((var & level)) printk(args); } while (0)
29
30#define deb_info(args...) dprintk(ec100_debug, 0x01, args)
31
32#undef err
33#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
34#undef info
35#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
36#undef warn
37#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
38
39#endif /* EC100_PRIV */
diff --git a/drivers/media/dvb/frontends/itd1000.c b/drivers/media/dvb/frontends/itd1000.c
index 600dad6b41ea..f7a40a18777a 100644
--- a/drivers/media/dvb/frontends/itd1000.c
+++ b/drivers/media/dvb/frontends/itd1000.c
@@ -24,6 +24,7 @@
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/dvb/frontend.h> 25#include <linux/dvb/frontend.h>
26#include <linux/i2c.h> 26#include <linux/i2c.h>
27#include <linux/slab.h>
27 28
28#include "dvb_frontend.h" 29#include "dvb_frontend.h"
29 30
diff --git a/drivers/media/dvb/frontends/l64781.c b/drivers/media/dvb/frontends/l64781.c
index 3051b64aa17c..445fa1068064 100644
--- a/drivers/media/dvb/frontends/l64781.c
+++ b/drivers/media/dvb/frontends/l64781.c
@@ -192,8 +192,8 @@ static int apply_frontend_param (struct dvb_frontend* fe, struct dvb_frontend_pa
192 spi_bias *= qam_tab[p->constellation]; 192 spi_bias *= qam_tab[p->constellation];
193 spi_bias /= p->code_rate_HP + 1; 193 spi_bias /= p->code_rate_HP + 1;
194 spi_bias /= (guard_tab[p->guard_interval] + 32); 194 spi_bias /= (guard_tab[p->guard_interval] + 32);
195 spi_bias *= 1000ULL; 195 spi_bias *= 1000;
196 spi_bias /= 1000ULL + ppm/1000; 196 spi_bias /= 1000 + ppm/1000;
197 spi_bias *= p->code_rate_HP; 197 spi_bias *= p->code_rate_HP;
198 198
199 val0x04 = (p->transmission_mode << 2) | p->guard_interval; 199 val0x04 = (p->transmission_mode << 2) | p->guard_interval;
diff --git a/drivers/media/dvb/frontends/lgdt3304.c b/drivers/media/dvb/frontends/lgdt3304.c
index e334b5d4e578..45a529b06b9d 100644
--- a/drivers/media/dvb/frontends/lgdt3304.c
+++ b/drivers/media/dvb/frontends/lgdt3304.c
@@ -7,6 +7,7 @@
7 7
8#include <linux/kernel.h> 8#include <linux/kernel.h>
9#include <linux/module.h> 9#include <linux/module.h>
10#include <linux/slab.h>
10#include <linux/delay.h> 11#include <linux/delay.h>
11#include "dvb_frontend.h" 12#include "dvb_frontend.h"
12#include "lgdt3304.h" 13#include "lgdt3304.h"
diff --git a/drivers/media/dvb/frontends/lgdt3305.c b/drivers/media/dvb/frontends/lgdt3305.c
index fde8c59700fb..d69c775f8645 100644
--- a/drivers/media/dvb/frontends/lgdt3305.c
+++ b/drivers/media/dvb/frontends/lgdt3305.c
@@ -21,6 +21,7 @@
21 21
22#include <asm/div64.h> 22#include <asm/div64.h>
23#include <linux/dvb/frontend.h> 23#include <linux/dvb/frontend.h>
24#include <linux/slab.h>
24#include "dvb_math.h" 25#include "dvb_math.h"
25#include "lgdt3305.h" 26#include "lgdt3305.h"
26 27
diff --git a/drivers/media/dvb/frontends/lgdt3305.h b/drivers/media/dvb/frontends/lgdt3305.h
index 4fa6e52d1fe8..9cb11c9cae53 100644
--- a/drivers/media/dvb/frontends/lgdt3305.h
+++ b/drivers/media/dvb/frontends/lgdt3305.h
@@ -54,13 +54,13 @@ struct lgdt3305_config {
54 u16 usref_qam256; /* default: 0x2a80 */ 54 u16 usref_qam256; /* default: 0x2a80 */
55 55
56 /* disable i2c repeater - 0:repeater enabled 1:repeater disabled */ 56 /* disable i2c repeater - 0:repeater enabled 1:repeater disabled */
57 int deny_i2c_rptr:1; 57 unsigned int deny_i2c_rptr:1;
58 58
59 /* spectral inversion - 0:disabled 1:enabled */ 59 /* spectral inversion - 0:disabled 1:enabled */
60 int spectral_inversion:1; 60 unsigned int spectral_inversion:1;
61 61
62 /* use RF AGC loop - 0:disabled 1:enabled */ 62 /* use RF AGC loop - 0:disabled 1:enabled */
63 int rf_agc_loop:1; 63 unsigned int rf_agc_loop:1;
64 64
65 enum lgdt3305_mpeg_mode mpeg_mode; 65 enum lgdt3305_mpeg_mode mpeg_mode;
66 enum lgdt3305_tp_clock_edge tpclk_edge; 66 enum lgdt3305_tp_clock_edge tpclk_edge;
diff --git a/drivers/media/dvb/frontends/lgdt330x.c b/drivers/media/dvb/frontends/lgdt330x.c
index 056387b41a8f..43971e63baa7 100644
--- a/drivers/media/dvb/frontends/lgdt330x.c
+++ b/drivers/media/dvb/frontends/lgdt330x.c
@@ -479,7 +479,7 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
479 switch (state->current_modulation) { 479 switch (state->current_modulation) {
480 case QAM_256: 480 case QAM_256:
481 case QAM_64: 481 case QAM_64:
482 /* Need to undestand why there are 3 lock levels here */ 482 /* Need to understand why there are 3 lock levels here */
483 if ((buf[0] & 0x07) == 0x07) 483 if ((buf[0] & 0x07) == 0x07)
484 *status |= FE_HAS_CARRIER; 484 *status |= FE_HAS_CARRIER;
485 break; 485 break;
@@ -520,7 +520,7 @@ static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
520 switch (state->current_modulation) { 520 switch (state->current_modulation) {
521 case QAM_256: 521 case QAM_256:
522 case QAM_64: 522 case QAM_64:
523 /* Need to undestand why there are 3 lock levels here */ 523 /* Need to understand why there are 3 lock levels here */
524 if ((buf[0] & 0x07) == 0x07) 524 if ((buf[0] & 0x07) == 0x07)
525 *status |= FE_HAS_CARRIER; 525 *status |= FE_HAS_CARRIER;
526 else 526 else
diff --git a/drivers/media/dvb/frontends/lgs8gxx.c b/drivers/media/dvb/frontends/lgs8gxx.c
index eabcadc425d5..dee53960e7e8 100644
--- a/drivers/media/dvb/frontends/lgs8gxx.c
+++ b/drivers/media/dvb/frontends/lgs8gxx.c
@@ -199,7 +199,7 @@ static int lgs8gxx_set_if_freq(struct lgs8gxx_state *priv, u32 freq /*in kHz*/)
199 199
200 val = freq; 200 val = freq;
201 if (freq != 0) { 201 if (freq != 0) {
202 val *= (u64)1 << 32; 202 val <<= 32;
203 if (if_clk != 0) 203 if (if_clk != 0)
204 do_div(val, if_clk); 204 do_div(val, if_clk);
205 v32 = val & 0xFFFFFFFF; 205 v32 = val & 0xFFFFFFFF;
@@ -246,7 +246,7 @@ static int lgs8gxx_get_afc_phase(struct lgs8gxx_state *priv)
246 246
247 val = v32; 247 val = v32;
248 val *= priv->config->if_clk_freq; 248 val *= priv->config->if_clk_freq;
249 val /= (u64)1 << 32; 249 val >>= 32;
250 dprintk("AFC = %u kHz\n", (u32)val); 250 dprintk("AFC = %u kHz\n", (u32)val);
251 return 0; 251 return 0;
252} 252}
diff --git a/drivers/media/dvb/frontends/lnbp21.c b/drivers/media/dvb/frontends/lnbp21.c
index 71f607fe8fc7..13437259eeac 100644
--- a/drivers/media/dvb/frontends/lnbp21.c
+++ b/drivers/media/dvb/frontends/lnbp21.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * lnbp21.c - driver for lnb supply and control ic lnbp21 2 * lnbp21.c - driver for lnb supply and control ic lnbp21
3 * 3 *
4 * Copyright (C) 2006 Oliver Endriss 4 * Copyright (C) 2006, 2009 Oliver Endriss <o.endriss@gmx.de>
5 * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru> 5 * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru>
6 * 6 *
7 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
@@ -91,6 +91,31 @@ static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg)
91 return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO; 91 return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO;
92} 92}
93 93
94static int lnbp21_set_tone(struct dvb_frontend *fe,
95 fe_sec_tone_mode_t tone)
96{
97 struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->sec_priv;
98 struct i2c_msg msg = { .addr = lnbp21->i2c_addr, .flags = 0,
99 .buf = &lnbp21->config,
100 .len = sizeof(lnbp21->config) };
101
102 switch (tone) {
103 case SEC_TONE_OFF:
104 lnbp21->config &= ~LNBP21_TEN;
105 break;
106 case SEC_TONE_ON:
107 lnbp21->config |= LNBP21_TEN;
108 break;
109 default:
110 return -EINVAL;
111 };
112
113 lnbp21->config |= lnbp21->override_or;
114 lnbp21->config &= lnbp21->override_and;
115
116 return (i2c_transfer(lnbp21->i2c, &msg, 1) == 1) ? 0 : -EIO;
117}
118
94static void lnbp21_release(struct dvb_frontend *fe) 119static void lnbp21_release(struct dvb_frontend *fe)
95{ 120{
96 /* LNBP power off */ 121 /* LNBP power off */
@@ -133,6 +158,8 @@ static struct dvb_frontend *lnbx2x_attach(struct dvb_frontend *fe,
133 /* override frontend ops */ 158 /* override frontend ops */
134 fe->ops.set_voltage = lnbp21_set_voltage; 159 fe->ops.set_voltage = lnbp21_set_voltage;
135 fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; 160 fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage;
161 if (!(override_clear & LNBH24_TEN)) /*22kHz logic controlled by demod*/
162 fe->ops.set_tone = lnbp21_set_tone;
136 printk(KERN_INFO "LNBx2x attached on addr=%x\n", lnbp21->i2c_addr); 163 printk(KERN_INFO "LNBx2x attached on addr=%x\n", lnbp21->i2c_addr);
137 164
138 return fe; 165 return fe;
diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
new file mode 100644
index 000000000000..599d1aa519a3
--- /dev/null
+++ b/drivers/media/dvb/frontends/mb86a16.c
@@ -0,0 +1,1879 @@
1/*
2 Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/init.h>
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/slab.h>
26
27#include "dvb_frontend.h"
28#include "mb86a16.h"
29#include "mb86a16_priv.h"
30
31unsigned int verbose = 5;
32module_param(verbose, int, 0644);
33
34#define ABS(x) ((x) < 0 ? (-x) : (x))
35
36struct mb86a16_state {
37 struct i2c_adapter *i2c_adap;
38 const struct mb86a16_config *config;
39 struct dvb_frontend frontend;
40
41 /* tuning parameters */
42 int frequency;
43 int srate;
44
45 /* Internal stuff */
46 int master_clk;
47 int deci;
48 int csel;
49 int rsel;
50};
51
52#define MB86A16_ERROR 0
53#define MB86A16_NOTICE 1
54#define MB86A16_INFO 2
55#define MB86A16_DEBUG 3
56
57#define dprintk(x, y, z, format, arg...) do { \
58 if (z) { \
59 if ((x > MB86A16_ERROR) && (x > y)) \
60 printk(KERN_ERR "%s: " format "\n", __func__, ##arg); \
61 else if ((x > MB86A16_NOTICE) && (x > y)) \
62 printk(KERN_NOTICE "%s: " format "\n", __func__, ##arg); \
63 else if ((x > MB86A16_INFO) && (x > y)) \
64 printk(KERN_INFO "%s: " format "\n", __func__, ##arg); \
65 else if ((x > MB86A16_DEBUG) && (x > y)) \
66 printk(KERN_DEBUG "%s: " format "\n", __func__, ##arg); \
67 } else { \
68 if (x > y) \
69 printk(format, ##arg); \
70 } \
71} while (0)
72
73#define TRACE_IN dprintk(verbose, MB86A16_DEBUG, 1, "-->()")
74#define TRACE_OUT dprintk(verbose, MB86A16_DEBUG, 1, "()-->")
75
76static int mb86a16_write(struct mb86a16_state *state, u8 reg, u8 val)
77{
78 int ret;
79 u8 buf[] = { reg, val };
80
81 struct i2c_msg msg = {
82 .addr = state->config->demod_address,
83 .flags = 0,
84 .buf = buf,
85 .len = 2
86 };
87
88 dprintk(verbose, MB86A16_DEBUG, 1,
89 "writing to [0x%02x],Reg[0x%02x],Data[0x%02x]",
90 state->config->demod_address, buf[0], buf[1]);
91
92 ret = i2c_transfer(state->i2c_adap, &msg, 1);
93
94 return (ret != 1) ? -EREMOTEIO : 0;
95}
96
97static int mb86a16_read(struct mb86a16_state *state, u8 reg, u8 *val)
98{
99 int ret;
100 u8 b0[] = { reg };
101 u8 b1[] = { 0 };
102
103 struct i2c_msg msg[] = {
104 {
105 .addr = state->config->demod_address,
106 .flags = 0,
107 .buf = b0,
108 .len = 1
109 }, {
110 .addr = state->config->demod_address,
111 .flags = I2C_M_RD,
112 .buf = b1,
113 .len = 1
114 }
115 };
116 ret = i2c_transfer(state->i2c_adap, msg, 2);
117 if (ret != 2) {
118 dprintk(verbose, MB86A16_ERROR, 1, "read error(reg=0x%02x, ret=0x%i)",
119 reg, ret);
120
121 return -EREMOTEIO;
122 }
123 *val = b1[0];
124
125 return ret;
126}
127
128static int CNTM_set(struct mb86a16_state *state,
129 unsigned char timint1,
130 unsigned char timint2,
131 unsigned char cnext)
132{
133 unsigned char val;
134
135 val = (timint1 << 4) | (timint2 << 2) | cnext;
136 if (mb86a16_write(state, MB86A16_CNTMR, val) < 0)
137 goto err;
138
139 return 0;
140
141err:
142 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
143 return -EREMOTEIO;
144}
145
146static int smrt_set(struct mb86a16_state *state, int rate)
147{
148 int tmp ;
149 int m ;
150 unsigned char STOFS0, STOFS1;
151
152 m = 1 << state->deci;
153 tmp = (8192 * state->master_clk - 2 * m * rate * 8192 + state->master_clk / 2) / state->master_clk;
154
155 STOFS0 = tmp & 0x0ff;
156 STOFS1 = (tmp & 0xf00) >> 8;
157
158 if (mb86a16_write(state, MB86A16_SRATE1, (state->deci << 2) |
159 (state->csel << 1) |
160 state->rsel) < 0)
161 goto err;
162 if (mb86a16_write(state, MB86A16_SRATE2, STOFS0) < 0)
163 goto err;
164 if (mb86a16_write(state, MB86A16_SRATE3, STOFS1) < 0)
165 goto err;
166
167 return 0;
168err:
169 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
170 return -1;
171}
172
173static int srst(struct mb86a16_state *state)
174{
175 if (mb86a16_write(state, MB86A16_RESET, 0x04) < 0)
176 goto err;
177
178 return 0;
179err:
180 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
181 return -EREMOTEIO;
182
183}
184
185static int afcex_data_set(struct mb86a16_state *state,
186 unsigned char AFCEX_L,
187 unsigned char AFCEX_H)
188{
189 if (mb86a16_write(state, MB86A16_AFCEXL, AFCEX_L) < 0)
190 goto err;
191 if (mb86a16_write(state, MB86A16_AFCEXH, AFCEX_H) < 0)
192 goto err;
193
194 return 0;
195err:
196 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
197
198 return -1;
199}
200
201static int afcofs_data_set(struct mb86a16_state *state,
202 unsigned char AFCEX_L,
203 unsigned char AFCEX_H)
204{
205 if (mb86a16_write(state, 0x58, AFCEX_L) < 0)
206 goto err;
207 if (mb86a16_write(state, 0x59, AFCEX_H) < 0)
208 goto err;
209
210 return 0;
211err:
212 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
213 return -EREMOTEIO;
214}
215
216static int stlp_set(struct mb86a16_state *state,
217 unsigned char STRAS,
218 unsigned char STRBS)
219{
220 if (mb86a16_write(state, MB86A16_STRFILTCOEF1, (STRBS << 3) | (STRAS)) < 0)
221 goto err;
222
223 return 0;
224err:
225 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
226 return -EREMOTEIO;
227}
228
229static int Vi_set(struct mb86a16_state *state, unsigned char ETH, unsigned char VIA)
230{
231 if (mb86a16_write(state, MB86A16_VISET2, 0x04) < 0)
232 goto err;
233 if (mb86a16_write(state, MB86A16_VISET3, 0xf5) < 0)
234 goto err;
235
236 return 0;
237err:
238 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
239 return -EREMOTEIO;
240}
241
242static int initial_set(struct mb86a16_state *state)
243{
244 if (stlp_set(state, 5, 7))
245 goto err;
246
247 udelay(100);
248 if (afcex_data_set(state, 0, 0))
249 goto err;
250
251 udelay(100);
252 if (afcofs_data_set(state, 0, 0))
253 goto err;
254
255 udelay(100);
256 if (mb86a16_write(state, MB86A16_CRLFILTCOEF1, 0x16) < 0)
257 goto err;
258 if (mb86a16_write(state, 0x2f, 0x21) < 0)
259 goto err;
260 if (mb86a16_write(state, MB86A16_VIMAG, 0x38) < 0)
261 goto err;
262 if (mb86a16_write(state, MB86A16_FAGCS1, 0x00) < 0)
263 goto err;
264 if (mb86a16_write(state, MB86A16_FAGCS2, 0x1c) < 0)
265 goto err;
266 if (mb86a16_write(state, MB86A16_FAGCS3, 0x20) < 0)
267 goto err;
268 if (mb86a16_write(state, MB86A16_FAGCS4, 0x1e) < 0)
269 goto err;
270 if (mb86a16_write(state, MB86A16_FAGCS5, 0x23) < 0)
271 goto err;
272 if (mb86a16_write(state, 0x54, 0xff) < 0)
273 goto err;
274 if (mb86a16_write(state, MB86A16_TSOUT, 0x00) < 0)
275 goto err;
276
277 return 0;
278
279err:
280 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
281 return -EREMOTEIO;
282}
283
284static int S01T_set(struct mb86a16_state *state,
285 unsigned char s1t,
286 unsigned s0t)
287{
288 if (mb86a16_write(state, 0x33, (s1t << 3) | s0t) < 0)
289 goto err;
290
291 return 0;
292err:
293 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
294 return -EREMOTEIO;
295}
296
297
298static int EN_set(struct mb86a16_state *state,
299 int cren,
300 int afcen)
301{
302 unsigned char val;
303
304 val = 0x7a | (cren << 7) | (afcen << 2);
305 if (mb86a16_write(state, 0x49, val) < 0)
306 goto err;
307
308 return 0;
309err:
310 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
311 return -EREMOTEIO;
312}
313
314static int AFCEXEN_set(struct mb86a16_state *state,
315 int afcexen,
316 int smrt)
317{
318 unsigned char AFCA ;
319
320 if (smrt > 18875)
321 AFCA = 4;
322 else if (smrt > 9375)
323 AFCA = 3;
324 else if (smrt > 2250)
325 AFCA = 2;
326 else
327 AFCA = 1;
328
329 if (mb86a16_write(state, 0x2a, 0x02 | (afcexen << 5) | (AFCA << 2)) < 0)
330 goto err;
331
332 return 0;
333
334err:
335 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
336 return -EREMOTEIO;
337}
338
339static int DAGC_data_set(struct mb86a16_state *state,
340 unsigned char DAGCA,
341 unsigned char DAGCW)
342{
343 if (mb86a16_write(state, 0x2d, (DAGCA << 3) | DAGCW) < 0)
344 goto err;
345
346 return 0;
347
348err:
349 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
350 return -EREMOTEIO;
351}
352
353static void smrt_info_get(struct mb86a16_state *state, int rate)
354{
355 if (rate >= 37501) {
356 state->deci = 0; state->csel = 0; state->rsel = 0;
357 } else if (rate >= 30001) {
358 state->deci = 0; state->csel = 0; state->rsel = 1;
359 } else if (rate >= 26251) {
360 state->deci = 0; state->csel = 1; state->rsel = 0;
361 } else if (rate >= 22501) {
362 state->deci = 0; state->csel = 1; state->rsel = 1;
363 } else if (rate >= 18751) {
364 state->deci = 1; state->csel = 0; state->rsel = 0;
365 } else if (rate >= 15001) {
366 state->deci = 1; state->csel = 0; state->rsel = 1;
367 } else if (rate >= 13126) {
368 state->deci = 1; state->csel = 1; state->rsel = 0;
369 } else if (rate >= 11251) {
370 state->deci = 1; state->csel = 1; state->rsel = 1;
371 } else if (rate >= 9376) {
372 state->deci = 2; state->csel = 0; state->rsel = 0;
373 } else if (rate >= 7501) {
374 state->deci = 2; state->csel = 0; state->rsel = 1;
375 } else if (rate >= 6563) {
376 state->deci = 2; state->csel = 1; state->rsel = 0;
377 } else if (rate >= 5626) {
378 state->deci = 2; state->csel = 1; state->rsel = 1;
379 } else if (rate >= 4688) {
380 state->deci = 3; state->csel = 0; state->rsel = 0;
381 } else if (rate >= 3751) {
382 state->deci = 3; state->csel = 0; state->rsel = 1;
383 } else if (rate >= 3282) {
384 state->deci = 3; state->csel = 1; state->rsel = 0;
385 } else if (rate >= 2814) {
386 state->deci = 3; state->csel = 1; state->rsel = 1;
387 } else if (rate >= 2344) {
388 state->deci = 4; state->csel = 0; state->rsel = 0;
389 } else if (rate >= 1876) {
390 state->deci = 4; state->csel = 0; state->rsel = 1;
391 } else if (rate >= 1641) {
392 state->deci = 4; state->csel = 1; state->rsel = 0;
393 } else if (rate >= 1407) {
394 state->deci = 4; state->csel = 1; state->rsel = 1;
395 } else if (rate >= 1172) {
396 state->deci = 5; state->csel = 0; state->rsel = 0;
397 } else if (rate >= 939) {
398 state->deci = 5; state->csel = 0; state->rsel = 1;
399 } else if (rate >= 821) {
400 state->deci = 5; state->csel = 1; state->rsel = 0;
401 } else {
402 state->deci = 5; state->csel = 1; state->rsel = 1;
403 }
404
405 if (state->csel == 0)
406 state->master_clk = 92000;
407 else
408 state->master_clk = 61333;
409
410}
411
412static int signal_det(struct mb86a16_state *state,
413 int smrt,
414 unsigned char *SIG)
415{
416
417 int ret ;
418 int smrtd ;
419 int wait_sym ;
420
421 u32 wait_t;
422 unsigned char S[3] ;
423 int i ;
424
425 if (*SIG > 45) {
426 if (CNTM_set(state, 2, 1, 2) < 0) {
427 dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
428 return -1;
429 }
430 wait_sym = 40000;
431 } else {
432 if (CNTM_set(state, 3, 1, 2) < 0) {
433 dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
434 return -1;
435 }
436 wait_sym = 80000;
437 }
438 for (i = 0; i < 3; i++) {
439 if (i == 0)
440 smrtd = smrt * 98 / 100;
441 else if (i == 1)
442 smrtd = smrt;
443 else
444 smrtd = smrt * 102 / 100;
445 smrt_info_get(state, smrtd);
446 smrt_set(state, smrtd);
447 srst(state);
448 wait_t = (wait_sym + 99 * smrtd / 100) / smrtd;
449 if (wait_t == 0)
450 wait_t = 1;
451 msleep_interruptible(10);
452 if (mb86a16_read(state, 0x37, &(S[i])) != 2) {
453 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
454 return -EREMOTEIO;
455 }
456 }
457 if ((S[1] > S[0] * 112 / 100) &&
458 (S[1] > S[2] * 112 / 100)) {
459
460 ret = 1;
461 } else {
462 ret = 0;
463 }
464 *SIG = S[1];
465
466 if (CNTM_set(state, 0, 1, 2) < 0) {
467 dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
468 return -1;
469 }
470
471 return ret;
472}
473
474static int rf_val_set(struct mb86a16_state *state,
475 int f,
476 int smrt,
477 unsigned char R)
478{
479 unsigned char C, F, B;
480 int M;
481 unsigned char rf_val[5];
482 int ack = -1;
483
484 if (smrt > 37750)
485 C = 1;
486 else if (smrt > 18875)
487 C = 2;
488 else if (smrt > 5500)
489 C = 3;
490 else
491 C = 4;
492
493 if (smrt > 30500)
494 F = 3;
495 else if (smrt > 9375)
496 F = 1;
497 else if (smrt > 4625)
498 F = 0;
499 else
500 F = 2;
501
502 if (f < 1060)
503 B = 0;
504 else if (f < 1175)
505 B = 1;
506 else if (f < 1305)
507 B = 2;
508 else if (f < 1435)
509 B = 3;
510 else if (f < 1570)
511 B = 4;
512 else if (f < 1715)
513 B = 5;
514 else if (f < 1845)
515 B = 6;
516 else if (f < 1980)
517 B = 7;
518 else if (f < 2080)
519 B = 8;
520 else
521 B = 9;
522
523 M = f * (1 << R) / 2;
524
525 rf_val[0] = 0x01 | (C << 3) | (F << 1);
526 rf_val[1] = (R << 5) | ((M & 0x1f000) >> 12);
527 rf_val[2] = (M & 0x00ff0) >> 4;
528 rf_val[3] = ((M & 0x0000f) << 4) | B;
529
530 /* Frequency Set */
531 if (mb86a16_write(state, 0x21, rf_val[0]) < 0)
532 ack = 0;
533 if (mb86a16_write(state, 0x22, rf_val[1]) < 0)
534 ack = 0;
535 if (mb86a16_write(state, 0x23, rf_val[2]) < 0)
536 ack = 0;
537 if (mb86a16_write(state, 0x24, rf_val[3]) < 0)
538 ack = 0;
539 if (mb86a16_write(state, 0x25, 0x01) < 0)
540 ack = 0;
541 if (ack == 0) {
542 dprintk(verbose, MB86A16_ERROR, 1, "RF Setup - I2C transfer error");
543 return -EREMOTEIO;
544 }
545
546 return 0;
547}
548
549static int afcerr_chk(struct mb86a16_state *state)
550{
551 unsigned char AFCM_L, AFCM_H ;
552 int AFCM ;
553 int afcm, afcerr ;
554
555 if (mb86a16_read(state, 0x0e, &AFCM_L) != 2)
556 goto err;
557 if (mb86a16_read(state, 0x0f, &AFCM_H) != 2)
558 goto err;
559
560 AFCM = (AFCM_H << 8) + AFCM_L;
561
562 if (AFCM > 2048)
563 afcm = AFCM - 4096;
564 else
565 afcm = AFCM;
566 afcerr = afcm * state->master_clk / 8192;
567
568 return afcerr;
569
570err:
571 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
572 return -EREMOTEIO;
573}
574
575static int dagcm_val_get(struct mb86a16_state *state)
576{
577 int DAGCM;
578 unsigned char DAGCM_H, DAGCM_L;
579
580 if (mb86a16_read(state, 0x45, &DAGCM_L) != 2)
581 goto err;
582 if (mb86a16_read(state, 0x46, &DAGCM_H) != 2)
583 goto err;
584
585 DAGCM = (DAGCM_H << 8) + DAGCM_L;
586
587 return DAGCM;
588
589err:
590 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
591 return -EREMOTEIO;
592}
593
594static int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status)
595{
596 u8 stat, stat2;
597 struct mb86a16_state *state = fe->demodulator_priv;
598
599 *status = 0;
600
601 if (mb86a16_read(state, MB86A16_SIG1, &stat) != 2)
602 goto err;
603 if (mb86a16_read(state, MB86A16_SIG2, &stat2) != 2)
604 goto err;
605 if ((stat > 25) && (stat2 > 25))
606 *status |= FE_HAS_SIGNAL;
607 if ((stat > 45) && (stat2 > 45))
608 *status |= FE_HAS_CARRIER;
609
610 if (mb86a16_read(state, MB86A16_STATUS, &stat) != 2)
611 goto err;
612
613 if (stat & 0x01)
614 *status |= FE_HAS_SYNC;
615 if (stat & 0x01)
616 *status |= FE_HAS_VITERBI;
617
618 if (mb86a16_read(state, MB86A16_FRAMESYNC, &stat) != 2)
619 goto err;
620
621 if ((stat & 0x0f) && (*status & FE_HAS_VITERBI))
622 *status |= FE_HAS_LOCK;
623
624 return 0;
625
626err:
627 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
628 return -EREMOTEIO;
629}
630
631static int sync_chk(struct mb86a16_state *state,
632 unsigned char *VIRM)
633{
634 unsigned char val;
635 int sync;
636
637 if (mb86a16_read(state, 0x0d, &val) != 2)
638 goto err;
639
640 dprintk(verbose, MB86A16_INFO, 1, "Status = %02x,", val);
641 sync = val & 0x01;
642 *VIRM = (val & 0x1c) >> 2;
643
644 return sync;
645err:
646 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
647 return -EREMOTEIO;
648
649}
650
651static int freqerr_chk(struct mb86a16_state *state,
652 int fTP,
653 int smrt,
654 int unit)
655{
656 unsigned char CRM, AFCML, AFCMH;
657 unsigned char temp1, temp2, temp3;
658 int crm, afcm, AFCM;
659 int crrerr, afcerr; /* kHz */
660 int frqerr; /* MHz */
661 int afcen, afcexen = 0;
662 int R, M, fOSC, fOSC_OFS;
663
664 if (mb86a16_read(state, 0x43, &CRM) != 2)
665 goto err;
666
667 if (CRM > 127)
668 crm = CRM - 256;
669 else
670 crm = CRM;
671
672 crrerr = smrt * crm / 256;
673 if (mb86a16_read(state, 0x49, &temp1) != 2)
674 goto err;
675
676 afcen = (temp1 & 0x04) >> 2;
677 if (afcen == 0) {
678 if (mb86a16_read(state, 0x2a, &temp1) != 2)
679 goto err;
680 afcexen = (temp1 & 0x20) >> 5;
681 }
682
683 if (afcen == 1) {
684 if (mb86a16_read(state, 0x0e, &AFCML) != 2)
685 goto err;
686 if (mb86a16_read(state, 0x0f, &AFCMH) != 2)
687 goto err;
688 } else if (afcexen == 1) {
689 if (mb86a16_read(state, 0x2b, &AFCML) != 2)
690 goto err;
691 if (mb86a16_read(state, 0x2c, &AFCMH) != 2)
692 goto err;
693 }
694 if ((afcen == 1) || (afcexen == 1)) {
695 smrt_info_get(state, smrt);
696 AFCM = ((AFCMH & 0x01) << 8) + AFCML;
697 if (AFCM > 255)
698 afcm = AFCM - 512;
699 else
700 afcm = AFCM;
701
702 afcerr = afcm * state->master_clk / 8192;
703 } else
704 afcerr = 0;
705
706 if (mb86a16_read(state, 0x22, &temp1) != 2)
707 goto err;
708 if (mb86a16_read(state, 0x23, &temp2) != 2)
709 goto err;
710 if (mb86a16_read(state, 0x24, &temp3) != 2)
711 goto err;
712
713 R = (temp1 & 0xe0) >> 5;
714 M = ((temp1 & 0x1f) << 12) + (temp2 << 4) + (temp3 >> 4);
715 if (R == 0)
716 fOSC = 2 * M;
717 else
718 fOSC = M;
719
720 fOSC_OFS = fOSC - fTP;
721
722 if (unit == 0) { /* MHz */
723 if (crrerr + afcerr + fOSC_OFS * 1000 >= 0)
724 frqerr = (crrerr + afcerr + fOSC_OFS * 1000 + 500) / 1000;
725 else
726 frqerr = (crrerr + afcerr + fOSC_OFS * 1000 - 500) / 1000;
727 } else { /* kHz */
728 frqerr = crrerr + afcerr + fOSC_OFS * 1000;
729 }
730
731 return frqerr;
732err:
733 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
734 return -EREMOTEIO;
735}
736
737static unsigned char vco_dev_get(struct mb86a16_state *state, int smrt)
738{
739 unsigned char R;
740
741 if (smrt > 9375)
742 R = 0;
743 else
744 R = 1;
745
746 return R;
747}
748
749static void swp_info_get(struct mb86a16_state *state,
750 int fOSC_start,
751 int smrt,
752 int v, int R,
753 int swp_ofs,
754 int *fOSC,
755 int *afcex_freq,
756 unsigned char *AFCEX_L,
757 unsigned char *AFCEX_H)
758{
759 int AFCEX ;
760 int crnt_swp_freq ;
761
762 crnt_swp_freq = fOSC_start * 1000 + v * swp_ofs;
763
764 if (R == 0)
765 *fOSC = (crnt_swp_freq + 1000) / 2000 * 2;
766 else
767 *fOSC = (crnt_swp_freq + 500) / 1000;
768
769 if (*fOSC >= crnt_swp_freq)
770 *afcex_freq = *fOSC * 1000 - crnt_swp_freq;
771 else
772 *afcex_freq = crnt_swp_freq - *fOSC * 1000;
773
774 AFCEX = *afcex_freq * 8192 / state->master_clk;
775 *AFCEX_L = AFCEX & 0x00ff;
776 *AFCEX_H = (AFCEX & 0x0f00) >> 8;
777}
778
779
780static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V, int vmax, int vmin,
781 int SIGMIN, int fOSC, int afcex_freq, int swp_ofs, unsigned char *SIG1)
782{
783 int swp_freq ;
784
785 if ((i % 2 == 1) && (v <= vmax)) {
786 /* positive v (case 1) */
787 if ((v - 1 == vmin) &&
788 (*(V + 30 + v) >= 0) &&
789 (*(V + 30 + v - 1) >= 0) &&
790 (*(V + 30 + v - 1) > *(V + 30 + v)) &&
791 (*(V + 30 + v - 1) > SIGMIN)) {
792
793 swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
794 *SIG1 = *(V + 30 + v - 1);
795 } else if ((v == vmax) &&
796 (*(V + 30 + v) >= 0) &&
797 (*(V + 30 + v - 1) >= 0) &&
798 (*(V + 30 + v) > *(V + 30 + v - 1)) &&
799 (*(V + 30 + v) > SIGMIN)) {
800 /* (case 2) */
801 swp_freq = fOSC * 1000 + afcex_freq;
802 *SIG1 = *(V + 30 + v);
803 } else if ((*(V + 30 + v) > 0) &&
804 (*(V + 30 + v - 1) > 0) &&
805 (*(V + 30 + v - 2) > 0) &&
806 (*(V + 30 + v - 3) > 0) &&
807 (*(V + 30 + v - 1) > *(V + 30 + v)) &&
808 (*(V + 30 + v - 2) > *(V + 30 + v - 3)) &&
809 ((*(V + 30 + v - 1) > SIGMIN) ||
810 (*(V + 30 + v - 2) > SIGMIN))) {
811 /* (case 3) */
812 if (*(V + 30 + v - 1) >= *(V + 30 + v - 2)) {
813 swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
814 *SIG1 = *(V + 30 + v - 1);
815 } else {
816 swp_freq = fOSC * 1000 + afcex_freq - swp_ofs * 2;
817 *SIG1 = *(V + 30 + v - 2);
818 }
819 } else if ((v == vmax) &&
820 (*(V + 30 + v) >= 0) &&
821 (*(V + 30 + v - 1) >= 0) &&
822 (*(V + 30 + v - 2) >= 0) &&
823 (*(V + 30 + v) > *(V + 30 + v - 2)) &&
824 (*(V + 30 + v - 1) > *(V + 30 + v - 2)) &&
825 ((*(V + 30 + v) > SIGMIN) ||
826 (*(V + 30 + v - 1) > SIGMIN))) {
827 /* (case 4) */
828 if (*(V + 30 + v) >= *(V + 30 + v - 1)) {
829 swp_freq = fOSC * 1000 + afcex_freq;
830 *SIG1 = *(V + 30 + v);
831 } else {
832 swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
833 *SIG1 = *(V + 30 + v - 1);
834 }
835 } else {
836 swp_freq = -1 ;
837 }
838 } else if ((i % 2 == 0) && (v >= vmin)) {
839 /* Negative v (case 1) */
840 if ((*(V + 30 + v) > 0) &&
841 (*(V + 30 + v + 1) > 0) &&
842 (*(V + 30 + v + 2) > 0) &&
843 (*(V + 30 + v + 1) > *(V + 30 + v)) &&
844 (*(V + 30 + v + 1) > *(V + 30 + v + 2)) &&
845 (*(V + 30 + v + 1) > SIGMIN)) {
846
847 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
848 *SIG1 = *(V + 30 + v + 1);
849 } else if ((v + 1 == vmax) &&
850 (*(V + 30 + v) >= 0) &&
851 (*(V + 30 + v + 1) >= 0) &&
852 (*(V + 30 + v + 1) > *(V + 30 + v)) &&
853 (*(V + 30 + v + 1) > SIGMIN)) {
854 /* (case 2) */
855 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
856 *SIG1 = *(V + 30 + v);
857 } else if ((v == vmin) &&
858 (*(V + 30 + v) > 0) &&
859 (*(V + 30 + v + 1) > 0) &&
860 (*(V + 30 + v + 2) > 0) &&
861 (*(V + 30 + v) > *(V + 30 + v + 1)) &&
862 (*(V + 30 + v) > *(V + 30 + v + 2)) &&
863 (*(V + 30 + v) > SIGMIN)) {
864 /* (case 3) */
865 swp_freq = fOSC * 1000 + afcex_freq;
866 *SIG1 = *(V + 30 + v);
867 } else if ((*(V + 30 + v) >= 0) &&
868 (*(V + 30 + v + 1) >= 0) &&
869 (*(V + 30 + v + 2) >= 0) &&
870 (*(V + 30 + v + 3) >= 0) &&
871 (*(V + 30 + v + 1) > *(V + 30 + v)) &&
872 (*(V + 30 + v + 2) > *(V + 30 + v + 3)) &&
873 ((*(V + 30 + v + 1) > SIGMIN) ||
874 (*(V + 30 + v + 2) > SIGMIN))) {
875 /* (case 4) */
876 if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
877 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
878 *SIG1 = *(V + 30 + v + 1);
879 } else {
880 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2;
881 *SIG1 = *(V + 30 + v + 2);
882 }
883 } else if ((*(V + 30 + v) >= 0) &&
884 (*(V + 30 + v + 1) >= 0) &&
885 (*(V + 30 + v + 2) >= 0) &&
886 (*(V + 30 + v + 3) >= 0) &&
887 (*(V + 30 + v) > *(V + 30 + v + 2)) &&
888 (*(V + 30 + v + 1) > *(V + 30 + v + 2)) &&
889 (*(V + 30 + v) > *(V + 30 + v + 3)) &&
890 (*(V + 30 + v + 1) > *(V + 30 + v + 3)) &&
891 ((*(V + 30 + v) > SIGMIN) ||
892 (*(V + 30 + v + 1) > SIGMIN))) {
893 /* (case 5) */
894 if (*(V + 30 + v) >= *(V + 30 + v + 1)) {
895 swp_freq = fOSC * 1000 + afcex_freq;
896 *SIG1 = *(V + 30 + v);
897 } else {
898 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
899 *SIG1 = *(V + 30 + v + 1);
900 }
901 } else if ((v + 2 == vmin) &&
902 (*(V + 30 + v) >= 0) &&
903 (*(V + 30 + v + 1) >= 0) &&
904 (*(V + 30 + v + 2) >= 0) &&
905 (*(V + 30 + v + 1) > *(V + 30 + v)) &&
906 (*(V + 30 + v + 2) > *(V + 30 + v)) &&
907 ((*(V + 30 + v + 1) > SIGMIN) ||
908 (*(V + 30 + v + 2) > SIGMIN))) {
909 /* (case 6) */
910 if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
911 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
912 *SIG1 = *(V + 30 + v + 1);
913 } else {
914 swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2;
915 *SIG1 = *(V + 30 + v + 2);
916 }
917 } else if ((vmax == 0) && (vmin == 0) && (*(V + 30 + v) > SIGMIN)) {
918 swp_freq = fOSC * 1000;
919 *SIG1 = *(V + 30 + v);
920 } else
921 swp_freq = -1;
922 } else
923 swp_freq = -1;
924
925 return swp_freq;
926}
927
928static void swp_info_get2(struct mb86a16_state *state,
929 int smrt,
930 int R,
931 int swp_freq,
932 int *afcex_freq,
933 int *fOSC,
934 unsigned char *AFCEX_L,
935 unsigned char *AFCEX_H)
936{
937 int AFCEX ;
938
939 if (R == 0)
940 *fOSC = (swp_freq + 1000) / 2000 * 2;
941 else
942 *fOSC = (swp_freq + 500) / 1000;
943
944 if (*fOSC >= swp_freq)
945 *afcex_freq = *fOSC * 1000 - swp_freq;
946 else
947 *afcex_freq = swp_freq - *fOSC * 1000;
948
949 AFCEX = *afcex_freq * 8192 / state->master_clk;
950 *AFCEX_L = AFCEX & 0x00ff;
951 *AFCEX_H = (AFCEX & 0x0f00) >> 8;
952}
953
954static void afcex_info_get(struct mb86a16_state *state,
955 int afcex_freq,
956 unsigned char *AFCEX_L,
957 unsigned char *AFCEX_H)
958{
959 int AFCEX ;
960
961 AFCEX = afcex_freq * 8192 / state->master_clk;
962 *AFCEX_L = AFCEX & 0x00ff;
963 *AFCEX_H = (AFCEX & 0x0f00) >> 8;
964}
965
966static int SEQ_set(struct mb86a16_state *state, unsigned char loop)
967{
968 /* SLOCK0 = 0 */
969 if (mb86a16_write(state, 0x32, 0x02 | (loop << 2)) < 0) {
970 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
971 return -EREMOTEIO;
972 }
973
974 return 0;
975}
976
977static int iq_vt_set(struct mb86a16_state *state, unsigned char IQINV)
978{
979 /* Viterbi Rate, IQ Settings */
980 if (mb86a16_write(state, 0x06, 0xdf | (IQINV << 5)) < 0) {
981 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
982 return -EREMOTEIO;
983 }
984
985 return 0;
986}
987
988static int FEC_srst(struct mb86a16_state *state)
989{
990 if (mb86a16_write(state, MB86A16_RESET, 0x02) < 0) {
991 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
992 return -EREMOTEIO;
993 }
994
995 return 0;
996}
997
998static int S2T_set(struct mb86a16_state *state, unsigned char S2T)
999{
1000 if (mb86a16_write(state, 0x34, 0x70 | S2T) < 0) {
1001 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1002 return -EREMOTEIO;
1003 }
1004
1005 return 0;
1006}
1007
1008static int S45T_set(struct mb86a16_state *state, unsigned char S4T, unsigned char S5T)
1009{
1010 if (mb86a16_write(state, 0x35, 0x00 | (S5T << 4) | S4T) < 0) {
1011 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1012 return -EREMOTEIO;
1013 }
1014
1015 return 0;
1016}
1017
1018
1019static int mb86a16_set_fe(struct mb86a16_state *state)
1020{
1021 u8 agcval, cnmval;
1022
1023 int i, j;
1024 int fOSC = 0;
1025 int fOSC_start = 0;
1026 int wait_t;
1027 int fcp;
1028 int swp_ofs;
1029 int V[60];
1030 u8 SIG1MIN;
1031
1032 unsigned char CREN, AFCEN, AFCEXEN;
1033 unsigned char SIG1;
1034 unsigned char TIMINT1, TIMINT2, TIMEXT;
1035 unsigned char S0T, S1T;
1036 unsigned char S2T;
1037/* unsigned char S2T, S3T; */
1038 unsigned char S4T, S5T;
1039 unsigned char AFCEX_L, AFCEX_H;
1040 unsigned char R;
1041 unsigned char VIRM;
1042 unsigned char ETH, VIA;
1043 unsigned char junk;
1044
1045 int loop;
1046 int ftemp;
1047 int v, vmax, vmin;
1048 int vmax_his, vmin_his;
1049 int swp_freq, prev_swp_freq[20];
1050 int prev_freq_num;
1051 int signal_dupl;
1052 int afcex_freq;
1053 int signal;
1054 int afcerr;
1055 int temp_freq, delta_freq;
1056 int dagcm[4];
1057 int smrt_d;
1058/* int freq_err; */
1059 int n;
1060 int ret = -1;
1061 int sync;
1062
1063 dprintk(verbose, MB86A16_INFO, 1, "freq=%d Mhz, symbrt=%d Ksps", state->frequency, state->srate);
1064
1065 fcp = 3000;
1066 swp_ofs = state->srate / 4;
1067
1068 for (i = 0; i < 60; i++)
1069 V[i] = -1;
1070
1071 for (i = 0; i < 20; i++)
1072 prev_swp_freq[i] = 0;
1073
1074 SIG1MIN = 25;
1075
1076 for (n = 0; ((n < 3) && (ret == -1)); n++) {
1077 SEQ_set(state, 0);
1078 iq_vt_set(state, 0);
1079
1080 CREN = 0;
1081 AFCEN = 0;
1082 AFCEXEN = 1;
1083 TIMINT1 = 0;
1084 TIMINT2 = 1;
1085 TIMEXT = 2;
1086 S1T = 0;
1087 S0T = 0;
1088
1089 if (initial_set(state) < 0) {
1090 dprintk(verbose, MB86A16_ERROR, 1, "initial set failed");
1091 return -1;
1092 }
1093 if (DAGC_data_set(state, 3, 2) < 0) {
1094 dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
1095 return -1;
1096 }
1097 if (EN_set(state, CREN, AFCEN) < 0) {
1098 dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
1099 return -1; /* (0, 0) */
1100 }
1101 if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
1102 dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
1103 return -1; /* (1, smrt) = (1, symbolrate) */
1104 }
1105 if (CNTM_set(state, TIMINT1, TIMINT2, TIMEXT) < 0) {
1106 dprintk(verbose, MB86A16_ERROR, 1, "CNTM set error");
1107 return -1; /* (0, 1, 2) */
1108 }
1109 if (S01T_set(state, S1T, S0T) < 0) {
1110 dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
1111 return -1; /* (0, 0) */
1112 }
1113 smrt_info_get(state, state->srate);
1114 if (smrt_set(state, state->srate) < 0) {
1115 dprintk(verbose, MB86A16_ERROR, 1, "smrt info get error");
1116 return -1;
1117 }
1118
1119 R = vco_dev_get(state, state->srate);
1120 if (R == 1)
1121 fOSC_start = state->frequency;
1122
1123 else if (R == 0) {
1124 if (state->frequency % 2 == 0) {
1125 fOSC_start = state->frequency;
1126 } else {
1127 fOSC_start = state->frequency + 1;
1128 if (fOSC_start > 2150)
1129 fOSC_start = state->frequency - 1;
1130 }
1131 }
1132 loop = 1;
1133 ftemp = fOSC_start * 1000;
1134 vmax = 0 ;
1135 while (loop == 1) {
1136 ftemp = ftemp + swp_ofs;
1137 vmax++;
1138
1139 /* Upper bound */
1140 if (ftemp > 2150000) {
1141 loop = 0;
1142 vmax--;
1143 } else {
1144 if ((ftemp == 2150000) ||
1145 (ftemp - state->frequency * 1000 >= fcp + state->srate / 4))
1146 loop = 0;
1147 }
1148 }
1149
1150 loop = 1;
1151 ftemp = fOSC_start * 1000;
1152 vmin = 0 ;
1153 while (loop == 1) {
1154 ftemp = ftemp - swp_ofs;
1155 vmin--;
1156
1157 /* Lower bound */
1158 if (ftemp < 950000) {
1159 loop = 0;
1160 vmin++;
1161 } else {
1162 if ((ftemp == 950000) ||
1163 (state->frequency * 1000 - ftemp >= fcp + state->srate / 4))
1164 loop = 0;
1165 }
1166 }
1167
1168 wait_t = (8000 + state->srate / 2) / state->srate;
1169 if (wait_t == 0)
1170 wait_t = 1;
1171
1172 i = 0;
1173 j = 0;
1174 prev_freq_num = 0;
1175 loop = 1;
1176 signal = 0;
1177 vmax_his = 0;
1178 vmin_his = 0;
1179 v = 0;
1180
1181 while (loop == 1) {
1182 swp_info_get(state, fOSC_start, state->srate,
1183 v, R, swp_ofs, &fOSC,
1184 &afcex_freq, &AFCEX_L, &AFCEX_H);
1185
1186 udelay(100);
1187 if (rf_val_set(state, fOSC, state->srate, R) < 0) {
1188 dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
1189 return -1;
1190 }
1191 udelay(100);
1192 if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1193 dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
1194 return -1;
1195 }
1196 if (srst(state) < 0) {
1197 dprintk(verbose, MB86A16_ERROR, 1, "srst error");
1198 return -1;
1199 }
1200 msleep_interruptible(wait_t);
1201
1202 if (mb86a16_read(state, 0x37, &SIG1) != 2) {
1203 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1204 return -1;
1205 }
1206 V[30 + v] = SIG1 ;
1207 swp_freq = swp_freq_calcuation(state, i, v, V, vmax, vmin,
1208 SIG1MIN, fOSC, afcex_freq,
1209 swp_ofs, &SIG1); /* changed */
1210
1211 signal_dupl = 0;
1212 for (j = 0; j < prev_freq_num; j++) {
1213 if ((ABS(prev_swp_freq[j] - swp_freq)) < (swp_ofs * 3 / 2)) {
1214 signal_dupl = 1;
1215 dprintk(verbose, MB86A16_INFO, 1, "Probably Duplicate Signal, j = %d", j);
1216 }
1217 }
1218 if ((signal_dupl == 0) && (swp_freq > 0) && (ABS(swp_freq - state->frequency * 1000) < fcp + state->srate / 6)) {
1219 dprintk(verbose, MB86A16_DEBUG, 1, "------ Signal detect ------ [swp_freq=[%07d, srate=%05d]]", swp_freq, state->srate);
1220 prev_swp_freq[prev_freq_num] = swp_freq;
1221 prev_freq_num++;
1222 swp_info_get2(state, state->srate, R, swp_freq,
1223 &afcex_freq, &fOSC,
1224 &AFCEX_L, &AFCEX_H);
1225
1226 if (rf_val_set(state, fOSC, state->srate, R) < 0) {
1227 dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
1228 return -1;
1229 }
1230 if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1231 dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
1232 return -1;
1233 }
1234 signal = signal_det(state, state->srate, &SIG1);
1235 if (signal == 1) {
1236 dprintk(verbose, MB86A16_ERROR, 1, "***** Signal Found *****");
1237 loop = 0;
1238 } else {
1239 dprintk(verbose, MB86A16_ERROR, 1, "!!!!! No signal !!!!!, try again...");
1240 smrt_info_get(state, state->srate);
1241 if (smrt_set(state, state->srate) < 0) {
1242 dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
1243 return -1;
1244 }
1245 }
1246 }
1247 if (v > vmax)
1248 vmax_his = 1 ;
1249 if (v < vmin)
1250 vmin_his = 1 ;
1251 i++;
1252
1253 if ((i % 2 == 1) && (vmax_his == 1))
1254 i++;
1255 if ((i % 2 == 0) && (vmin_his == 1))
1256 i++;
1257
1258 if (i % 2 == 1)
1259 v = (i + 1) / 2;
1260 else
1261 v = -i / 2;
1262
1263 if ((vmax_his == 1) && (vmin_his == 1))
1264 loop = 0 ;
1265 }
1266
1267 if (signal == 1) {
1268 dprintk(verbose, MB86A16_INFO, 1, " Start Freq Error Check");
1269 S1T = 7 ;
1270 S0T = 1 ;
1271 CREN = 0 ;
1272 AFCEN = 1 ;
1273 AFCEXEN = 0 ;
1274
1275 if (S01T_set(state, S1T, S0T) < 0) {
1276 dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
1277 return -1;
1278 }
1279 smrt_info_get(state, state->srate);
1280 if (smrt_set(state, state->srate) < 0) {
1281 dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
1282 return -1;
1283 }
1284 if (EN_set(state, CREN, AFCEN) < 0) {
1285 dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
1286 return -1;
1287 }
1288 if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
1289 dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
1290 return -1;
1291 }
1292 afcex_info_get(state, afcex_freq, &AFCEX_L, &AFCEX_H);
1293 if (afcofs_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1294 dprintk(verbose, MB86A16_ERROR, 1, "AFCOFS data set error");
1295 return -1;
1296 }
1297 if (srst(state) < 0) {
1298 dprintk(verbose, MB86A16_ERROR, 1, "srst error");
1299 return -1;
1300 }
1301 /* delay 4~200 */
1302 wait_t = 200000 / state->master_clk + 200000 / state->srate;
1303 msleep(wait_t);
1304 afcerr = afcerr_chk(state);
1305 if (afcerr == -1)
1306 return -1;
1307
1308 swp_freq = fOSC * 1000 + afcerr ;
1309 AFCEXEN = 1 ;
1310 if (state->srate >= 1500)
1311 smrt_d = state->srate / 3;
1312 else
1313 smrt_d = state->srate / 2;
1314 smrt_info_get(state, smrt_d);
1315 if (smrt_set(state, smrt_d) < 0) {
1316 dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
1317 return -1;
1318 }
1319 if (AFCEXEN_set(state, AFCEXEN, smrt_d) < 0) {
1320 dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
1321 return -1;
1322 }
1323 R = vco_dev_get(state, smrt_d);
1324 if (DAGC_data_set(state, 2, 0) < 0) {
1325 dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
1326 return -1;
1327 }
1328 for (i = 0; i < 3; i++) {
1329 temp_freq = swp_freq + (i - 1) * state->srate / 8;
1330 swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
1331 if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
1332 dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
1333 return -1;
1334 }
1335 if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1336 dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
1337 return -1;
1338 }
1339 wait_t = 200000 / state->master_clk + 40000 / smrt_d;
1340 msleep(wait_t);
1341 dagcm[i] = dagcm_val_get(state);
1342 }
1343 if ((dagcm[0] > dagcm[1]) &&
1344 (dagcm[0] > dagcm[2]) &&
1345 (dagcm[0] - dagcm[1] > 2 * (dagcm[2] - dagcm[1]))) {
1346
1347 temp_freq = swp_freq - 2 * state->srate / 8;
1348 swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
1349 if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
1350 dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
1351 return -1;
1352 }
1353 if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1354 dprintk(verbose, MB86A16_ERROR, 1, "afcex data set");
1355 return -1;
1356 }
1357 wait_t = 200000 / state->master_clk + 40000 / smrt_d;
1358 msleep(wait_t);
1359 dagcm[3] = dagcm_val_get(state);
1360 if (dagcm[3] > dagcm[1])
1361 delta_freq = (dagcm[2] - dagcm[0] + dagcm[1] - dagcm[3]) * state->srate / 300;
1362 else
1363 delta_freq = 0;
1364 } else if ((dagcm[2] > dagcm[1]) &&
1365 (dagcm[2] > dagcm[0]) &&
1366 (dagcm[2] - dagcm[1] > 2 * (dagcm[0] - dagcm[1]))) {
1367
1368 temp_freq = swp_freq + 2 * state->srate / 8;
1369 swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
1370 if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
1371 dprintk(verbose, MB86A16_ERROR, 1, "rf val set");
1372 return -1;
1373 }
1374 if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1375 dprintk(verbose, MB86A16_ERROR, 1, "afcex data set");
1376 return -1;
1377 }
1378 wait_t = 200000 / state->master_clk + 40000 / smrt_d;
1379 msleep(wait_t);
1380 dagcm[3] = dagcm_val_get(state);
1381 if (dagcm[3] > dagcm[1])
1382 delta_freq = (dagcm[2] - dagcm[0] + dagcm[3] - dagcm[1]) * state->srate / 300;
1383 else
1384 delta_freq = 0 ;
1385
1386 } else {
1387 delta_freq = 0 ;
1388 }
1389 dprintk(verbose, MB86A16_INFO, 1, "SWEEP Frequency = %d", swp_freq);
1390 swp_freq += delta_freq;
1391 dprintk(verbose, MB86A16_INFO, 1, "Adjusting .., DELTA Freq = %d, SWEEP Freq=%d", delta_freq, swp_freq);
1392 if (ABS(state->frequency * 1000 - swp_freq) > 3800) {
1393 dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL !");
1394 } else {
1395
1396 S1T = 0;
1397 S0T = 3;
1398 CREN = 1;
1399 AFCEN = 0;
1400 AFCEXEN = 1;
1401
1402 if (S01T_set(state, S1T, S0T) < 0) {
1403 dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
1404 return -1;
1405 }
1406 if (DAGC_data_set(state, 0, 0) < 0) {
1407 dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
1408 return -1;
1409 }
1410 R = vco_dev_get(state, state->srate);
1411 smrt_info_get(state, state->srate);
1412 if (smrt_set(state, state->srate) < 0) {
1413 dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
1414 return -1;
1415 }
1416 if (EN_set(state, CREN, AFCEN) < 0) {
1417 dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
1418 return -1;
1419 }
1420 if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
1421 dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
1422 return -1;
1423 }
1424 swp_info_get2(state, state->srate, R, swp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
1425 if (rf_val_set(state, fOSC, state->srate, R) < 0) {
1426 dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
1427 return -1;
1428 }
1429 if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
1430 dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
1431 return -1;
1432 }
1433 if (srst(state) < 0) {
1434 dprintk(verbose, MB86A16_ERROR, 1, "srst error");
1435 return -1;
1436 }
1437 wait_t = 7 + (10000 + state->srate / 2) / state->srate;
1438 if (wait_t == 0)
1439 wait_t = 1;
1440 msleep_interruptible(wait_t);
1441 if (mb86a16_read(state, 0x37, &SIG1) != 2) {
1442 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1443 return -EREMOTEIO;
1444 }
1445
1446 if (SIG1 > 110) {
1447 S2T = 4; S4T = 1; S5T = 6; ETH = 4; VIA = 6;
1448 wait_t = 7 + (917504 + state->srate / 2) / state->srate;
1449 } else if (SIG1 > 105) {
1450 S2T = 4; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
1451 wait_t = 7 + (1048576 + state->srate / 2) / state->srate;
1452 } else if (SIG1 > 85) {
1453 S2T = 5; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
1454 wait_t = 7 + (1310720 + state->srate / 2) / state->srate;
1455 } else if (SIG1 > 65) {
1456 S2T = 6; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
1457 wait_t = 7 + (1572864 + state->srate / 2) / state->srate;
1458 } else {
1459 S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
1460 wait_t = 7 + (2097152 + state->srate / 2) / state->srate;
1461 }
1462 wait_t *= 2; /* FOS */
1463 S2T_set(state, S2T);
1464 S45T_set(state, S4T, S5T);
1465 Vi_set(state, ETH, VIA);
1466 srst(state);
1467 msleep_interruptible(wait_t);
1468 sync = sync_chk(state, &VIRM);
1469 dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync);
1470 if (VIRM) {
1471 if (VIRM == 4) {
1472 /* 5/6 */
1473 if (SIG1 > 110)
1474 wait_t = (786432 + state->srate / 2) / state->srate;
1475 else
1476 wait_t = (1572864 + state->srate / 2) / state->srate;
1477 if (state->srate < 5000)
1478 /* FIXME ! , should be a long wait ! */
1479 msleep_interruptible(wait_t);
1480 else
1481 msleep_interruptible(wait_t);
1482
1483 if (sync_chk(state, &junk) == 0) {
1484 iq_vt_set(state, 1);
1485 FEC_srst(state);
1486 }
1487 }
1488 /* 1/2, 2/3, 3/4, 7/8 */
1489 if (SIG1 > 110)
1490 wait_t = (786432 + state->srate / 2) / state->srate;
1491 else
1492 wait_t = (1572864 + state->srate / 2) / state->srate;
1493 msleep_interruptible(wait_t);
1494 SEQ_set(state, 1);
1495 } else {
1496 dprintk(verbose, MB86A16_INFO, 1, "NO -- SYNC");
1497 SEQ_set(state, 1);
1498 ret = -1;
1499 }
1500 }
1501 } else {
1502 dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL");
1503 ret = -1;
1504 }
1505
1506 sync = sync_chk(state, &junk);
1507 if (sync) {
1508 dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******");
1509 freqerr_chk(state, state->frequency, state->srate, 1);
1510 ret = 0;
1511 break;
1512 }
1513 }
1514
1515 mb86a16_read(state, 0x15, &agcval);
1516 mb86a16_read(state, 0x26, &cnmval);
1517 dprintk(verbose, MB86A16_INFO, 1, "AGC = %02x CNM = %02x", agcval, cnmval);
1518
1519 return ret;
1520}
1521
1522static int mb86a16_send_diseqc_msg(struct dvb_frontend *fe,
1523 struct dvb_diseqc_master_cmd *cmd)
1524{
1525 struct mb86a16_state *state = fe->demodulator_priv;
1526 int i;
1527 u8 regs;
1528
1529 if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0)
1530 goto err;
1531 if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0)
1532 goto err;
1533 if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0)
1534 goto err;
1535
1536 regs = 0x18;
1537
1538 if (cmd->msg_len > 5 || cmd->msg_len < 4)
1539 return -EINVAL;
1540
1541 for (i = 0; i < cmd->msg_len; i++) {
1542 if (mb86a16_write(state, regs, cmd->msg[i]) < 0)
1543 goto err;
1544
1545 regs++;
1546 }
1547 i += 0x90;
1548
1549 msleep_interruptible(10);
1550
1551 if (mb86a16_write(state, MB86A16_DCC1, i) < 0)
1552 goto err;
1553 if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
1554 goto err;
1555
1556 return 0;
1557
1558err:
1559 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1560 return -EREMOTEIO;
1561}
1562
1563static int mb86a16_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst)
1564{
1565 struct mb86a16_state *state = fe->demodulator_priv;
1566
1567 switch (burst) {
1568 case SEC_MINI_A:
1569 if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
1570 MB86A16_DCC1_TBEN |
1571 MB86A16_DCC1_TBO) < 0)
1572 goto err;
1573 if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
1574 goto err;
1575 break;
1576 case SEC_MINI_B:
1577 if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
1578 MB86A16_DCC1_TBEN) < 0)
1579 goto err;
1580 if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
1581 goto err;
1582 break;
1583 }
1584
1585 return 0;
1586err:
1587 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1588 return -EREMOTEIO;
1589}
1590
1591static int mb86a16_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
1592{
1593 struct mb86a16_state *state = fe->demodulator_priv;
1594
1595 switch (tone) {
1596 case SEC_TONE_ON:
1597 if (mb86a16_write(state, MB86A16_TONEOUT2, 0x00) < 0)
1598 goto err;
1599 if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
1600 MB86A16_DCC1_CTOE) < 0)
1601
1602 goto err;
1603 if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
1604 goto err;
1605 break;
1606 case SEC_TONE_OFF:
1607 if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0)
1608 goto err;
1609 if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0)
1610 goto err;
1611 if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0)
1612 goto err;
1613 break;
1614 default:
1615 return -EINVAL;
1616 }
1617 return 0;
1618
1619err:
1620 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1621 return -EREMOTEIO;
1622}
1623
1624static enum dvbfe_search mb86a16_search(struct dvb_frontend *fe,
1625 struct dvb_frontend_parameters *p)
1626{
1627 struct mb86a16_state *state = fe->demodulator_priv;
1628
1629 state->frequency = p->frequency / 1000;
1630 state->srate = p->u.qpsk.symbol_rate / 1000;
1631
1632 if (!mb86a16_set_fe(state)) {
1633 dprintk(verbose, MB86A16_ERROR, 1, "Succesfully acquired LOCK");
1634 return DVBFE_ALGO_SEARCH_SUCCESS;
1635 }
1636
1637 dprintk(verbose, MB86A16_ERROR, 1, "Lock acquisition failed!");
1638 return DVBFE_ALGO_SEARCH_FAILED;
1639}
1640
1641static void mb86a16_release(struct dvb_frontend *fe)
1642{
1643 struct mb86a16_state *state = fe->demodulator_priv;
1644 kfree(state);
1645}
1646
1647static int mb86a16_init(struct dvb_frontend *fe)
1648{
1649 return 0;
1650}
1651
1652static int mb86a16_sleep(struct dvb_frontend *fe)
1653{
1654 return 0;
1655}
1656
1657static int mb86a16_read_ber(struct dvb_frontend *fe, u32 *ber)
1658{
1659 u8 ber_mon, ber_tab, ber_lsb, ber_mid, ber_msb, ber_tim, ber_rst;
1660 u32 timer;
1661
1662 struct mb86a16_state *state = fe->demodulator_priv;
1663
1664 *ber = 0;
1665 if (mb86a16_read(state, MB86A16_BERMON, &ber_mon) != 2)
1666 goto err;
1667 if (mb86a16_read(state, MB86A16_BERTAB, &ber_tab) != 2)
1668 goto err;
1669 if (mb86a16_read(state, MB86A16_BERLSB, &ber_lsb) != 2)
1670 goto err;
1671 if (mb86a16_read(state, MB86A16_BERMID, &ber_mid) != 2)
1672 goto err;
1673 if (mb86a16_read(state, MB86A16_BERMSB, &ber_msb) != 2)
1674 goto err;
1675 /* BER monitor invalid when BER_EN = 0 */
1676 if (ber_mon & 0x04) {
1677 /* coarse, fast calculation */
1678 *ber = ber_tab & 0x1f;
1679 dprintk(verbose, MB86A16_DEBUG, 1, "BER coarse=[0x%02x]", *ber);
1680 if (ber_mon & 0x01) {
1681 /*
1682 * BER_SEL = 1, The monitored BER is the estimated
1683 * value with a Reed-Solomon decoder error amount at
1684 * the deinterleaver output.
1685 * monitored BER is expressed as a 20 bit output in total
1686 */
1687 ber_rst = ber_mon >> 3;
1688 *ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb;
1689 if (ber_rst == 0)
1690 timer = 12500000;
1691 if (ber_rst == 1)
1692 timer = 25000000;
1693 if (ber_rst == 2)
1694 timer = 50000000;
1695 if (ber_rst == 3)
1696 timer = 100000000;
1697
1698 *ber /= timer;
1699 dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber);
1700 } else {
1701 /*
1702 * BER_SEL = 0, The monitored BER is the estimated
1703 * value with a Viterbi decoder error amount at the
1704 * QPSK demodulator output.
1705 * monitored BER is expressed as a 24 bit output in total
1706 */
1707 ber_tim = ber_mon >> 1;
1708 *ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb;
1709 if (ber_tim == 0)
1710 timer = 16;
1711 if (ber_tim == 1)
1712 timer = 24;
1713
1714 *ber /= 2 ^ timer;
1715 dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber);
1716 }
1717 }
1718 return 0;
1719err:
1720 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1721 return -EREMOTEIO;
1722}
1723
1724static int mb86a16_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
1725{
1726 u8 agcm = 0;
1727 struct mb86a16_state *state = fe->demodulator_priv;
1728
1729 *strength = 0;
1730 if (mb86a16_read(state, MB86A16_AGCM, &agcm) != 2) {
1731 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1732 return -EREMOTEIO;
1733 }
1734
1735 *strength = ((0xff - agcm) * 100) / 256;
1736 dprintk(verbose, MB86A16_DEBUG, 1, "Signal strength=[%d %%]", (u8) *strength);
1737 *strength = (0xffff - 0xff) + agcm;
1738
1739 return 0;
1740}
1741
1742struct cnr {
1743 u8 cn_reg;
1744 u8 cn_val;
1745};
1746
1747static const struct cnr cnr_tab[] = {
1748 { 35, 2 },
1749 { 40, 3 },
1750 { 50, 4 },
1751 { 60, 5 },
1752 { 70, 6 },
1753 { 80, 7 },
1754 { 92, 8 },
1755 { 103, 9 },
1756 { 115, 10 },
1757 { 138, 12 },
1758 { 162, 15 },
1759 { 180, 18 },
1760 { 185, 19 },
1761 { 189, 20 },
1762 { 195, 22 },
1763 { 199, 24 },
1764 { 201, 25 },
1765 { 202, 26 },
1766 { 203, 27 },
1767 { 205, 28 },
1768 { 208, 30 }
1769};
1770
1771static int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr)
1772{
1773 struct mb86a16_state *state = fe->demodulator_priv;
1774 int i = 0;
1775 int low_tide = 2, high_tide = 30, q_level;
1776 u8 cn;
1777
1778 *snr = 0;
1779 if (mb86a16_read(state, 0x26, &cn) != 2) {
1780 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1781 return -EREMOTEIO;
1782 }
1783
1784 for (i = 0; i < ARRAY_SIZE(cnr_tab); i++) {
1785 if (cn < cnr_tab[i].cn_reg) {
1786 *snr = cnr_tab[i].cn_val;
1787 break;
1788 }
1789 }
1790 q_level = (*snr * 100) / (high_tide - low_tide);
1791 dprintk(verbose, MB86A16_ERROR, 1, "SNR (Quality) = [%d dB], Level=%d %%", *snr, q_level);
1792 *snr = (0xffff - 0xff) + *snr;
1793
1794 return 0;
1795}
1796
1797static int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
1798{
1799 u8 dist;
1800 struct mb86a16_state *state = fe->demodulator_priv;
1801
1802 if (mb86a16_read(state, MB86A16_DISTMON, &dist) != 2) {
1803 dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
1804 return -EREMOTEIO;
1805 }
1806 *ucblocks = dist;
1807
1808 return 0;
1809}
1810
1811static enum dvbfe_algo mb86a16_frontend_algo(struct dvb_frontend *fe)
1812{
1813 return DVBFE_ALGO_CUSTOM;
1814}
1815
1816static struct dvb_frontend_ops mb86a16_ops = {
1817 .info = {
1818 .name = "Fujitsu MB86A16 DVB-S",
1819 .type = FE_QPSK,
1820 .frequency_min = 950000,
1821 .frequency_max = 2150000,
1822 .frequency_stepsize = 3000,
1823 .frequency_tolerance = 0,
1824 .symbol_rate_min = 1000000,
1825 .symbol_rate_max = 45000000,
1826 .symbol_rate_tolerance = 500,
1827 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
1828 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 |
1829 FE_CAN_FEC_7_8 | FE_CAN_QPSK |
1830 FE_CAN_FEC_AUTO
1831 },
1832 .release = mb86a16_release,
1833
1834 .get_frontend_algo = mb86a16_frontend_algo,
1835 .search = mb86a16_search,
1836 .read_status = mb86a16_read_status,
1837 .init = mb86a16_init,
1838 .sleep = mb86a16_sleep,
1839 .read_status = mb86a16_read_status,
1840
1841 .read_ber = mb86a16_read_ber,
1842 .read_signal_strength = mb86a16_read_signal_strength,
1843 .read_snr = mb86a16_read_snr,
1844 .read_ucblocks = mb86a16_read_ucblocks,
1845
1846 .diseqc_send_master_cmd = mb86a16_send_diseqc_msg,
1847 .diseqc_send_burst = mb86a16_send_diseqc_burst,
1848 .set_tone = mb86a16_set_tone,
1849};
1850
1851struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
1852 struct i2c_adapter *i2c_adap)
1853{
1854 u8 dev_id = 0;
1855 struct mb86a16_state *state = NULL;
1856
1857 state = kmalloc(sizeof(struct mb86a16_state), GFP_KERNEL);
1858 if (state == NULL)
1859 goto error;
1860
1861 state->config = config;
1862 state->i2c_adap = i2c_adap;
1863
1864 mb86a16_read(state, 0x7f, &dev_id);
1865 if (dev_id != 0xfe)
1866 goto error;
1867
1868 memcpy(&state->frontend.ops, &mb86a16_ops, sizeof(struct dvb_frontend_ops));
1869 state->frontend.demodulator_priv = state;
1870 state->frontend.ops.set_voltage = state->config->set_voltage;
1871
1872 return &state->frontend;
1873error:
1874 kfree(state);
1875 return NULL;
1876}
1877EXPORT_SYMBOL(mb86a16_attach);
1878MODULE_LICENSE("GPL");
1879MODULE_AUTHOR("Manu Abraham");
diff --git a/drivers/media/dvb/frontends/mb86a16.h b/drivers/media/dvb/frontends/mb86a16.h
new file mode 100644
index 000000000000..6ea8c376394f
--- /dev/null
+++ b/drivers/media/dvb/frontends/mb86a16.h
@@ -0,0 +1,52 @@
1/*
2 Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MB86A16_H
22#define __MB86A16_H
23
24#include <linux/dvb/frontend.h>
25#include "dvb_frontend.h"
26
27
28struct mb86a16_config {
29 u8 demod_address;
30
31 int (*set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
32};
33
34
35
36#if defined(CONFIG_DVB_MB86A16) || (defined(CONFIG_DVB_MB86A16_MODULE) && defined(MODULE))
37
38extern struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
39 struct i2c_adapter *i2c_adap);
40
41#else
42
43static inline struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
44 struct i2c_adapter *i2c_adap)
45{
46 printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__);
47 return NULL;
48}
49
50#endif /* CONFIG_DVB_MB86A16 */
51
52#endif /* __MB86A16_H */
diff --git a/drivers/media/dvb/frontends/mb86a16_priv.h b/drivers/media/dvb/frontends/mb86a16_priv.h
new file mode 100644
index 000000000000..360a35acfe84
--- /dev/null
+++ b/drivers/media/dvb/frontends/mb86a16_priv.h
@@ -0,0 +1,151 @@
1/*
2 Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MB86A16_PRIV_H
22#define __MB86A16_PRIV_H
23
24#define MB86A16_TSOUT 0x00
25#define MB86A16_TSOUT_HIZSEL (0x01 << 5)
26#define MB86A16_TSOUT_HIZCNTI (0x01 << 4)
27#define MB86A16_TSOUT_MODE (0x01 << 3)
28#define MB86A16_TSOUT_ORDER (0x01 << 2)
29#define MB86A16_TSOUT_ERROR (0x01 << 1)
30#define Mb86A16_TSOUT_EDGE (0x01 << 0)
31
32#define MB86A16_FEC 0x01
33#define MB86A16_FEC_FSYNC (0x01 << 5)
34#define MB86A16_FEC_PCKB8 (0x01 << 4)
35#define MB86A16_FEC_DVDS (0x01 << 3)
36#define MB86A16_FEC_EREN (0x01 << 2)
37#define Mb86A16_FEC_RSEN (0x01 << 1)
38#define MB86A16_FEC_DIEN (0x01 << 0)
39
40#define MB86A16_AGC 0x02
41#define MB86A16_AGC_AGMD (0x01 << 6)
42#define MB86A16_AGC_AGCW (0x0f << 2)
43#define MB86A16_AGC_AGCP (0x01 << 1)
44#define MB86A16_AGC_AGCR (0x01 << 0)
45
46#define MB86A16_SRATE1 0x03
47#define MB86A16_SRATE1_DECI (0x07 << 2)
48#define MB86A16_SRATE1_CSEL (0x01 << 1)
49#define MB86A16_SRATE1_RSEL (0x01 << 0)
50
51#define MB86A16_SRATE2 0x04
52#define MB86A16_SRATE2_STOFSL (0xff << 0)
53
54#define MB86A16_SRATE3 0x05
55#define MB86A16_SRATE2_STOFSH (0xff << 0)
56
57#define MB86A16_VITERBI 0x06
58#define MB86A16_FRAMESYNC 0x07
59#define MB86A16_CRLFILTCOEF1 0x08
60#define MB86A16_CRLFILTCOEF2 0x09
61#define MB86A16_STRFILTCOEF1 0x0a
62#define MB86A16_STRFILTCOEF2 0x0b
63#define MB86A16_RESET 0x0c
64#define MB86A16_STATUS 0x0d
65#define MB86A16_AFCML 0x0e
66#define MB86A16_AFCMH 0x0f
67#define MB86A16_BERMON 0x10
68#define MB86A16_BERTAB 0x11
69#define MB86A16_BERLSB 0x12
70#define MB86A16_BERMID 0x13
71#define MB86A16_BERMSB 0x14
72#define MB86A16_AGCM 0x15
73
74#define MB86A16_DCC1 0x16
75#define MB86A16_DCC1_DISTA (0x01 << 7)
76#define MB86A16_DCC1_PRTY (0x01 << 6)
77#define MB86A16_DCC1_CTOE (0x01 << 5)
78#define MB86A16_DCC1_TBEN (0x01 << 4)
79#define MB86A16_DCC1_TBO (0x01 << 3)
80#define MB86A16_DCC1_NUM (0x07 << 0)
81
82#define MB86A16_DCC2 0x17
83#define MB86A16_DCC2_DCBST (0x01 << 0)
84
85#define MB86A16_DCC3 0x18
86#define MB86A16_DCC3_CODE0 (0xff << 0)
87
88#define MB86A16_DCC4 0x19
89#define MB86A16_DCC4_CODE1 (0xff << 0)
90
91#define MB86A16_DCC5 0x1a
92#define MB86A16_DCC5_CODE2 (0xff << 0)
93
94#define MB86A16_DCC6 0x1b
95#define MB86A16_DCC6_CODE3 (0xff << 0)
96
97#define MB86A16_DCC7 0x1c
98#define MB86A16_DCC7_CODE4 (0xff << 0)
99
100#define MB86A16_DCC8 0x1d
101#define MB86A16_DCC8_CODE5 (0xff << 0)
102
103#define MB86A16_DCCOUT 0x1e
104#define MB86A16_DCCOUT_DISEN (0x01 << 0)
105
106#define MB86A16_TONEOUT1 0x1f
107#define MB86A16_TONE_TDIVL (0xff << 0)
108
109#define MB86A16_TONEOUT2 0x20
110#define MB86A16_TONE_TMD (0x03 << 2)
111#define MB86A16_TONE_TDIVH (0x03 << 0)
112
113#define MB86A16_FREQ1 0x21
114#define MB86A16_FREQ2 0x22
115#define MB86A16_FREQ3 0x23
116#define MB86A16_FREQ4 0x24
117#define MB86A16_FREQSET 0x25
118#define MB86A16_CNM 0x26
119#define MB86A16_PORT0 0x27
120#define MB86A16_PORT1 0x28
121#define MB86A16_DRCFILT 0x29
122#define MB86A16_AFC 0x2a
123#define MB86A16_AFCEXL 0x2b
124#define MB86A16_AFCEXH 0x2c
125#define MB86A16_DAGC 0x2d
126#define MB86A16_SEQMODE 0x32
127#define MB86A16_S0S1T 0x33
128#define MB86A16_S2S3T 0x34
129#define MB86A16_S4S5T 0x35
130#define MB86A16_CNTMR 0x36
131#define MB86A16_SIG1 0x37
132#define MB86A16_SIG2 0x38
133#define MB86A16_VIMAG 0x39
134#define MB86A16_VISET1 0x3a
135#define MB86A16_VISET2 0x3b
136#define MB86A16_VISET3 0x3c
137#define MB86A16_FAGCS1 0x3d
138#define MB86A16_FAGCS2 0x3e
139#define MB86A16_FAGCS3 0x3f
140#define MB86A16_FAGCS4 0x40
141#define MB86A16_FAGCS5 0x41
142#define MB86A16_FAGCS6 0x42
143#define MB86A16_CRM 0x43
144#define MB86A16_STRM 0x44
145#define MB86A16_DAGCML 0x45
146#define MB86A16_DAGCMH 0x46
147#define MB86A16_QPSKTST 0x49
148#define MB86A16_DISTMON 0x52
149#define MB86A16_VERSION 0x7f
150
151#endif /* __MB86A16_PRIV_H */
diff --git a/drivers/media/dvb/frontends/s5h1409.c b/drivers/media/dvb/frontends/s5h1409.c
index fb3011518427..0e2f61a8978f 100644
--- a/drivers/media/dvb/frontends/s5h1409.c
+++ b/drivers/media/dvb/frontends/s5h1409.c
@@ -44,7 +44,15 @@ struct s5h1409_state {
44 int if_freq; 44 int if_freq;
45 45
46 u32 is_qam_locked; 46 u32 is_qam_locked;
47 u32 qam_state; 47
48 /* QAM tuning state goes through the following state transitions */
49#define QAM_STATE_UNTUNED 0
50#define QAM_STATE_TUNING_STARTED 1
51#define QAM_STATE_INTERLEAVE_SET 2
52#define QAM_STATE_QAM_OPTIMIZED_L1 3
53#define QAM_STATE_QAM_OPTIMIZED_L2 4
54#define QAM_STATE_QAM_OPTIMIZED_L3 5
55 u8 qam_state;
48}; 56};
49 57
50static int debug; 58static int debug;
@@ -347,7 +355,7 @@ static int s5h1409_softreset(struct dvb_frontend *fe)
347 s5h1409_writereg(state, 0xf5, 0); 355 s5h1409_writereg(state, 0xf5, 0);
348 s5h1409_writereg(state, 0xf5, 1); 356 s5h1409_writereg(state, 0xf5, 1);
349 state->is_qam_locked = 0; 357 state->is_qam_locked = 0;
350 state->qam_state = 0; 358 state->qam_state = QAM_STATE_UNTUNED;
351 return 0; 359 return 0;
352} 360}
353 361
@@ -474,6 +482,59 @@ static void s5h1409_set_qam_amhum_mode(struct dvb_frontend *fe)
474 struct s5h1409_state *state = fe->demodulator_priv; 482 struct s5h1409_state *state = fe->demodulator_priv;
475 u16 reg; 483 u16 reg;
476 484
485 if (state->qam_state < QAM_STATE_INTERLEAVE_SET) {
486 /* We should not perform amhum optimization until
487 the interleave mode has been configured */
488 return;
489 }
490
491 if (state->qam_state == QAM_STATE_QAM_OPTIMIZED_L3) {
492 /* We've already reached the maximum optimization level, so
493 dont bother banging on the status registers */
494 return;
495 }
496
497 /* QAM EQ lock check */
498 reg = s5h1409_readreg(state, 0xf0);
499
500 if ((reg >> 13) & 0x1) {
501 reg &= 0xff;
502
503 s5h1409_writereg(state, 0x96, 0x000c);
504 if (reg < 0x68) {
505 if (state->qam_state < QAM_STATE_QAM_OPTIMIZED_L3) {
506 dprintk("%s() setting QAM state to OPT_L3\n",
507 __func__);
508 s5h1409_writereg(state, 0x93, 0x3130);
509 s5h1409_writereg(state, 0x9e, 0x2836);
510 state->qam_state = QAM_STATE_QAM_OPTIMIZED_L3;
511 }
512 } else {
513 if (state->qam_state < QAM_STATE_QAM_OPTIMIZED_L2) {
514 dprintk("%s() setting QAM state to OPT_L2\n",
515 __func__);
516 s5h1409_writereg(state, 0x93, 0x3332);
517 s5h1409_writereg(state, 0x9e, 0x2c37);
518 state->qam_state = QAM_STATE_QAM_OPTIMIZED_L2;
519 }
520 }
521
522 } else {
523 if (state->qam_state < QAM_STATE_QAM_OPTIMIZED_L1) {
524 dprintk("%s() setting QAM state to OPT_L1\n", __func__);
525 s5h1409_writereg(state, 0x96, 0x0008);
526 s5h1409_writereg(state, 0x93, 0x3332);
527 s5h1409_writereg(state, 0x9e, 0x2c37);
528 state->qam_state = QAM_STATE_QAM_OPTIMIZED_L1;
529 }
530 }
531}
532
533static void s5h1409_set_qam_amhum_mode_legacy(struct dvb_frontend *fe)
534{
535 struct s5h1409_state *state = fe->demodulator_priv;
536 u16 reg;
537
477 if (state->is_qam_locked) 538 if (state->is_qam_locked)
478 return; 539 return;
479 540
@@ -506,6 +567,44 @@ static void s5h1409_set_qam_interleave_mode(struct dvb_frontend *fe)
506 struct s5h1409_state *state = fe->demodulator_priv; 567 struct s5h1409_state *state = fe->demodulator_priv;
507 u16 reg, reg1, reg2; 568 u16 reg, reg1, reg2;
508 569
570 if (state->qam_state >= QAM_STATE_INTERLEAVE_SET) {
571 /* We've done the optimization already */
572 return;
573 }
574
575 reg = s5h1409_readreg(state, 0xf1);
576
577 /* Master lock */
578 if ((reg >> 15) & 0x1) {
579 if (state->qam_state == QAM_STATE_UNTUNED ||
580 state->qam_state == QAM_STATE_TUNING_STARTED) {
581 dprintk("%s() setting QAM state to INTERLEAVE_SET\n",
582 __func__);
583 reg1 = s5h1409_readreg(state, 0xb2);
584 reg2 = s5h1409_readreg(state, 0xad);
585
586 s5h1409_writereg(state, 0x96, 0x0020);
587 s5h1409_writereg(state, 0xad,
588 (((reg1 & 0xf000) >> 4) | (reg2 & 0xf0ff)));
589 state->qam_state = QAM_STATE_INTERLEAVE_SET;
590 }
591 } else {
592 if (state->qam_state == QAM_STATE_UNTUNED) {
593 dprintk("%s() setting QAM state to TUNING_STARTED\n",
594 __func__);
595 s5h1409_writereg(state, 0x96, 0x08);
596 s5h1409_writereg(state, 0xab,
597 s5h1409_readreg(state, 0xab) | 0x1001);
598 state->qam_state = QAM_STATE_TUNING_STARTED;
599 }
600 }
601}
602
603static void s5h1409_set_qam_interleave_mode_legacy(struct dvb_frontend *fe)
604{
605 struct s5h1409_state *state = fe->demodulator_priv;
606 u16 reg, reg1, reg2;
607
509 reg = s5h1409_readreg(state, 0xf1); 608 reg = s5h1409_readreg(state, 0xf1);
510 609
511 /* Master lock */ 610 /* Master lock */
@@ -553,16 +652,24 @@ static int s5h1409_set_frontend(struct dvb_frontend *fe,
553 fe->ops.i2c_gate_ctrl(fe, 0); 652 fe->ops.i2c_gate_ctrl(fe, 0);
554 } 653 }
555 654
556 /* Optimize the demod for QAM */
557 if (p->u.vsb.modulation != VSB_8) {
558 s5h1409_set_qam_amhum_mode(fe);
559 s5h1409_set_qam_interleave_mode(fe);
560 }
561
562 /* Issue a reset to the demod so it knows to resync against the 655 /* Issue a reset to the demod so it knows to resync against the
563 newly tuned frequency */ 656 newly tuned frequency */
564 s5h1409_softreset(fe); 657 s5h1409_softreset(fe);
565 658
659 /* Optimize the demod for QAM */
660 if (state->current_modulation != VSB_8) {
661 /* This almost certainly applies to all boards, but for now
662 only do it for the HVR-1600. Once the other boards are
663 tested, the "legacy" versions can just go away */
664 if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) {
665 s5h1409_set_qam_interleave_mode(fe);
666 s5h1409_set_qam_amhum_mode(fe);
667 } else {
668 s5h1409_set_qam_amhum_mode_legacy(fe);
669 s5h1409_set_qam_interleave_mode_legacy(fe);
670 }
671 }
672
566 return 0; 673 return 0;
567} 674}
568 675
@@ -614,6 +721,21 @@ static int s5h1409_init(struct dvb_frontend *fe)
614 /* The datasheet says that after initialisation, VSB is default */ 721 /* The datasheet says that after initialisation, VSB is default */
615 state->current_modulation = VSB_8; 722 state->current_modulation = VSB_8;
616 723
724 /* Optimize for the HVR-1600 if appropriate. Note that some of these
725 may get folded into the generic case after testing with other
726 devices */
727 if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) {
728 /* VSB AGC REF */
729 s5h1409_writereg(state, 0x09, 0x0050);
730
731 /* Unknown but Windows driver does it... */
732 s5h1409_writereg(state, 0x21, 0x0001);
733 s5h1409_writereg(state, 0x50, 0x030e);
734
735 /* QAM AGC REF */
736 s5h1409_writereg(state, 0x82, 0x0800);
737 }
738
617 if (state->config->output_mode == S5H1409_SERIAL_OUTPUT) 739 if (state->config->output_mode == S5H1409_SERIAL_OUTPUT)
618 s5h1409_writereg(state, 0xab, 740 s5h1409_writereg(state, 0xab,
619 s5h1409_readreg(state, 0xab) | 0x100); /* Serial */ 741 s5h1409_readreg(state, 0xab) | 0x100); /* Serial */
@@ -641,6 +763,17 @@ static int s5h1409_read_status(struct dvb_frontend *fe, fe_status_t *status)
641 763
642 *status = 0; 764 *status = 0;
643 765
766 /* Optimize the demod for QAM */
767 if (state->current_modulation != VSB_8) {
768 /* This almost certainly applies to all boards, but for now
769 only do it for the HVR-1600. Once the other boards are
770 tested, the "legacy" versions can just go away */
771 if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) {
772 s5h1409_set_qam_interleave_mode(fe);
773 s5h1409_set_qam_amhum_mode(fe);
774 }
775 }
776
644 /* Get the demodulator status */ 777 /* Get the demodulator status */
645 reg = s5h1409_readreg(state, 0xf1); 778 reg = s5h1409_readreg(state, 0xf1);
646 if (reg & 0x1000) 779 if (reg & 0x1000)
diff --git a/drivers/media/dvb/frontends/s5h1409.h b/drivers/media/dvb/frontends/s5h1409.h
index 070d9743e330..91f2ebd1a534 100644
--- a/drivers/media/dvb/frontends/s5h1409.h
+++ b/drivers/media/dvb/frontends/s5h1409.h
@@ -57,6 +57,13 @@ struct s5h1409_config {
57#define S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK 2 57#define S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK 2
58#define S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK 3 58#define S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK 3
59 u16 mpeg_timing; 59 u16 mpeg_timing;
60
61 /* HVR-1600 optimizations (to better work with MXL5005s)
62 Note: some of these are likely to be folded into the generic driver
63 after being regression tested with other boards */
64#define S5H1409_HVR1600_NOOPTIMIZE 0
65#define S5H1409_HVR1600_OPTIMIZE 1
66 u8 hvr1600_opt;
60}; 67};
61 68
62#if defined(CONFIG_DVB_S5H1409) || (defined(CONFIG_DVB_S5H1409_MODULE) \ 69#if defined(CONFIG_DVB_S5H1409) || (defined(CONFIG_DVB_S5H1409_MODULE) \
diff --git a/drivers/media/dvb/frontends/s921_module.c b/drivers/media/dvb/frontends/s921_module.c
index 3156b64cfc96..0eefff61cc50 100644
--- a/drivers/media/dvb/frontends/s921_module.c
+++ b/drivers/media/dvb/frontends/s921_module.c
@@ -9,6 +9,7 @@
9 9
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/module.h> 11#include <linux/module.h>
12#include <linux/slab.h>
12#include <linux/delay.h> 13#include <linux/delay.h>
13#include "dvb_frontend.h" 14#include "dvb_frontend.h"
14#include "s921_module.h" 15#include "s921_module.h"
diff --git a/drivers/media/dvb/frontends/si21xx.c b/drivers/media/dvb/frontends/si21xx.c
index 9552a22ccffb..d21a327db629 100644
--- a/drivers/media/dvb/frontends/si21xx.c
+++ b/drivers/media/dvb/frontends/si21xx.c
@@ -97,8 +97,6 @@
97#define LNB_SUPPLY_CTRL_REG_4 0xce 97#define LNB_SUPPLY_CTRL_REG_4 0xce
98#define LNB_SUPPLY_STATUS_REG 0xcf 98#define LNB_SUPPLY_STATUS_REG 0xcf
99 99
100#define FALSE 0
101#define TRUE 1
102#define FAIL -1 100#define FAIL -1
103#define PASS 0 101#define PASS 0
104 102
@@ -718,7 +716,7 @@ static int si21xx_set_frontend(struct dvb_frontend *fe,
718 int fine_tune_freq; 716 int fine_tune_freq;
719 unsigned char sample_rate = 0; 717 unsigned char sample_rate = 0;
720 /* boolean */ 718 /* boolean */
721 unsigned int inband_interferer_ind; 719 bool inband_interferer_ind;
722 720
723 /* INTERMEDIATE VALUES */ 721 /* INTERMEDIATE VALUES */
724 int icoarse_tune_freq; /* MHz */ 722 int icoarse_tune_freq; /* MHz */
@@ -728,15 +726,8 @@ static int si21xx_set_frontend(struct dvb_frontend *fe,
728 unsigned int x1; 726 unsigned int x1;
729 unsigned int x2; 727 unsigned int x2;
730 int i; 728 int i;
731 unsigned int inband_interferer_div2[ALLOWABLE_FS_COUNT] = { 729 bool inband_interferer_div2[ALLOWABLE_FS_COUNT];
732 FALSE, FALSE, FALSE, FALSE, FALSE, 730 bool inband_interferer_div4[ALLOWABLE_FS_COUNT];
733 FALSE, FALSE, FALSE, FALSE, FALSE
734 };
735 unsigned int inband_interferer_div4[ALLOWABLE_FS_COUNT] = {
736 FALSE, FALSE, FALSE, FALSE, FALSE,
737 FALSE, FALSE, FALSE, FALSE, FALSE
738 };
739
740 int status; 731 int status;
741 732
742 /* allowable sample rates for ADC in MHz */ 733 /* allowable sample rates for ADC in MHz */
@@ -762,7 +753,7 @@ static int si21xx_set_frontend(struct dvb_frontend *fe,
762 } 753 }
763 754
764 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) 755 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i)
765 inband_interferer_div2[i] = inband_interferer_div4[i] = FALSE; 756 inband_interferer_div2[i] = inband_interferer_div4[i] = false;
766 757
767 if_limit_high = -700000; 758 if_limit_high = -700000;
768 if_limit_low = -100000; 759 if_limit_low = -100000;
@@ -798,7 +789,7 @@ static int si21xx_set_frontend(struct dvb_frontend *fe,
798 789
799 if (((band_low < x1) && (x1 < band_high)) || 790 if (((band_low < x1) && (x1 < band_high)) ||
800 ((band_low < x2) && (x2 < band_high))) 791 ((band_low < x2) && (x2 < band_high)))
801 inband_interferer_div4[i] = TRUE; 792 inband_interferer_div4[i] = true;
802 793
803 } 794 }
804 795
@@ -811,25 +802,28 @@ static int si21xx_set_frontend(struct dvb_frontend *fe,
811 802
812 if (((band_low < x1) && (x1 < band_high)) || 803 if (((band_low < x1) && (x1 < band_high)) ||
813 ((band_low < x2) && (x2 < band_high))) 804 ((band_low < x2) && (x2 < band_high)))
814 inband_interferer_div2[i] = TRUE; 805 inband_interferer_div2[i] = true;
815 } 806 }
816 807
817 inband_interferer_ind = TRUE; 808 inband_interferer_ind = true;
818 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) 809 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) {
819 inband_interferer_ind &= inband_interferer_div2[i] | 810 if (inband_interferer_div2[i] || inband_interferer_div4[i]) {
820 inband_interferer_div4[i]; 811 inband_interferer_ind = false;
812 break;
813 }
814 }
821 815
822 if (inband_interferer_ind) { 816 if (inband_interferer_ind) {
823 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { 817 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) {
824 if (inband_interferer_div2[i] == FALSE) { 818 if (!inband_interferer_div2[i]) {
825 sample_rate = (u8) afs[i]; 819 sample_rate = (u8) afs[i];
826 break; 820 break;
827 } 821 }
828 } 822 }
829 } else { 823 } else {
830 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) { 824 for (i = 0; i < ALLOWABLE_FS_COUNT; ++i) {
831 if ((inband_interferer_div2[i] | 825 if ((inband_interferer_div2[i] ||
832 inband_interferer_div4[i]) == FALSE) { 826 !inband_interferer_div4[i])) {
833 sample_rate = (u8) afs[i]; 827 sample_rate = (u8) afs[i];
834 break; 828 break;
835 } 829 }
diff --git a/drivers/media/dvb/frontends/stb0899_drv.c b/drivers/media/dvb/frontends/stb0899_drv.c
index a04c782fff8d..8e38fcee564e 100644
--- a/drivers/media/dvb/frontends/stb0899_drv.c
+++ b/drivers/media/dvb/frontends/stb0899_drv.c
@@ -22,6 +22,7 @@
22#include <linux/init.h> 22#include <linux/init.h>
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/module.h> 24#include <linux/module.h>
25#include <linux/slab.h>
25#include <linux/string.h> 26#include <linux/string.h>
26 27
27#include <linux/dvb/frontend.h> 28#include <linux/dvb/frontend.h>
@@ -1571,7 +1572,7 @@ static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvb_fron
1571 * stb0899_track 1572 * stb0899_track
1572 * periodically check the signal level against a specified 1573 * periodically check the signal level against a specified
1573 * threshold level and perform derotator centering. 1574 * threshold level and perform derotator centering.
1574 * called once we have a lock from a succesful search 1575 * called once we have a lock from a successful search
1575 * event. 1576 * event.
1576 * 1577 *
1577 * Will be called periodically called to maintain the 1578 * Will be called periodically called to maintain the
diff --git a/drivers/media/dvb/frontends/stb6000.c b/drivers/media/dvb/frontends/stb6000.c
index 0e2cb0df1441..ed699647050e 100644
--- a/drivers/media/dvb/frontends/stb6000.c
+++ b/drivers/media/dvb/frontends/stb6000.c
@@ -20,6 +20,7 @@
20 20
21 */ 21 */
22 22
23#include <linux/slab.h>
23#include <linux/module.h> 24#include <linux/module.h>
24#include <linux/dvb/frontend.h> 25#include <linux/dvb/frontend.h>
25#include <asm/types.h> 26#include <asm/types.h>
diff --git a/drivers/media/dvb/frontends/stb6100.c b/drivers/media/dvb/frontends/stb6100.c
index 60ee18a94f43..f73c13323e90 100644
--- a/drivers/media/dvb/frontends/stb6100.c
+++ b/drivers/media/dvb/frontends/stb6100.c
@@ -22,6 +22,7 @@
22#include <linux/init.h> 22#include <linux/init.h>
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/module.h> 24#include <linux/module.h>
25#include <linux/slab.h>
25#include <linux/string.h> 26#include <linux/string.h>
26 27
27#include "dvb_frontend.h" 28#include "dvb_frontend.h"
diff --git a/drivers/media/dvb/frontends/stb6100_proc.h b/drivers/media/dvb/frontends/stb6100_proc.h
new file mode 100644
index 000000000000..112163a48622
--- /dev/null
+++ b/drivers/media/dvb/frontends/stb6100_proc.h
@@ -0,0 +1,138 @@
1/*
2 STB6100 Silicon Tuner wrapper
3 Copyright (C)2009 Igor M. Liplianin (liplianin@me.by)
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20static int stb6100_get_freq(struct dvb_frontend *fe, u32 *frequency)
21{
22 struct dvb_frontend_ops *frontend_ops = NULL;
23 struct dvb_tuner_ops *tuner_ops = NULL;
24 struct tuner_state state;
25 int err = 0;
26
27 if (&fe->ops)
28 frontend_ops = &fe->ops;
29 if (&frontend_ops->tuner_ops)
30 tuner_ops = &frontend_ops->tuner_ops;
31 if (tuner_ops->get_state) {
32 if (frontend_ops->i2c_gate_ctrl)
33 frontend_ops->i2c_gate_ctrl(fe, 1);
34
35 err = tuner_ops->get_state(fe, DVBFE_TUNER_FREQUENCY, &state);
36 if (err < 0) {
37 printk(KERN_ERR "%s: Invalid parameter\n", __func__);
38 return err;
39 }
40
41 if (frontend_ops->i2c_gate_ctrl)
42 frontend_ops->i2c_gate_ctrl(fe, 0);
43
44 *frequency = state.frequency;
45 }
46
47 return 0;
48}
49
50static int stb6100_set_freq(struct dvb_frontend *fe, u32 frequency)
51{
52 struct dvb_frontend_ops *frontend_ops = NULL;
53 struct dvb_tuner_ops *tuner_ops = NULL;
54 struct tuner_state state;
55 int err = 0;
56
57 state.frequency = frequency;
58 if (&fe->ops)
59 frontend_ops = &fe->ops;
60 if (&frontend_ops->tuner_ops)
61 tuner_ops = &frontend_ops->tuner_ops;
62 if (tuner_ops->set_state) {
63 if (frontend_ops->i2c_gate_ctrl)
64 frontend_ops->i2c_gate_ctrl(fe, 1);
65
66 err = tuner_ops->set_state(fe, DVBFE_TUNER_FREQUENCY, &state);
67 if (err < 0) {
68 printk(KERN_ERR "%s: Invalid parameter\n", __func__);
69 return err;
70 }
71
72 if (frontend_ops->i2c_gate_ctrl)
73 frontend_ops->i2c_gate_ctrl(fe, 0);
74
75 }
76
77 return 0;
78}
79
80static int stb6100_get_bandw(struct dvb_frontend *fe, u32 *bandwidth)
81{
82 struct dvb_frontend_ops *frontend_ops = NULL;
83 struct dvb_tuner_ops *tuner_ops = NULL;
84 struct tuner_state state;
85 int err = 0;
86
87 if (&fe->ops)
88 frontend_ops = &fe->ops;
89 if (&frontend_ops->tuner_ops)
90 tuner_ops = &frontend_ops->tuner_ops;
91 if (tuner_ops->get_state) {
92 if (frontend_ops->i2c_gate_ctrl)
93 frontend_ops->i2c_gate_ctrl(fe, 1);
94
95 err = tuner_ops->get_state(fe, DVBFE_TUNER_BANDWIDTH, &state);
96 if (err < 0) {
97 printk(KERN_ERR "%s: Invalid parameter\n", __func__);
98 return err;
99 }
100
101 if (frontend_ops->i2c_gate_ctrl)
102 frontend_ops->i2c_gate_ctrl(fe, 0);
103
104 *bandwidth = state.bandwidth;
105 }
106
107 return 0;
108}
109
110static int stb6100_set_bandw(struct dvb_frontend *fe, u32 bandwidth)
111{
112 struct dvb_frontend_ops *frontend_ops = NULL;
113 struct dvb_tuner_ops *tuner_ops = NULL;
114 struct tuner_state state;
115 int err = 0;
116
117 state.bandwidth = bandwidth;
118 if (&fe->ops)
119 frontend_ops = &fe->ops;
120 if (&frontend_ops->tuner_ops)
121 tuner_ops = &frontend_ops->tuner_ops;
122 if (tuner_ops->set_state) {
123 if (frontend_ops->i2c_gate_ctrl)
124 frontend_ops->i2c_gate_ctrl(fe, 1);
125
126 err = tuner_ops->set_state(fe, DVBFE_TUNER_BANDWIDTH, &state);
127 if (err < 0) {
128 printk(KERN_ERR "%s: Invalid parameter\n", __func__);
129 return err;
130 }
131
132 if (frontend_ops->i2c_gate_ctrl)
133 frontend_ops->i2c_gate_ctrl(fe, 0);
134
135 }
136
137 return 0;
138}
diff --git a/drivers/media/dvb/frontends/stv0900.h b/drivers/media/dvb/frontends/stv0900.h
index bf4e9b633044..e3e35d1ce838 100644
--- a/drivers/media/dvb/frontends/stv0900.h
+++ b/drivers/media/dvb/frontends/stv0900.h
@@ -36,6 +36,7 @@ struct stv0900_reg {
36 36
37struct stv0900_config { 37struct stv0900_config {
38 u8 demod_address; 38 u8 demod_address;
39 u8 demod_mode;
39 u32 xtal; 40 u32 xtal;
40 u8 clkmode;/* 0 for CLKI, 2 for XTALI */ 41 u8 clkmode;/* 0 for CLKI, 2 for XTALI */
41 42
@@ -48,6 +49,10 @@ struct stv0900_config {
48 u8 tun2_maddress; 49 u8 tun2_maddress;
49 u8 tun1_adc;/* 1 for stv6110, 2 for stb6100 */ 50 u8 tun1_adc;/* 1 for stv6110, 2 for stb6100 */
50 u8 tun2_adc; 51 u8 tun2_adc;
52 u8 tun1_type;/* for now 3 for stb6100 auto, else - software */
53 u8 tun2_type;
54 /* Set device param to start dma */
55 int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured);
51}; 56};
52 57
53#if defined(CONFIG_DVB_STV0900) || (defined(CONFIG_DVB_STV0900_MODULE) \ 58#if defined(CONFIG_DVB_STV0900) || (defined(CONFIG_DVB_STV0900_MODULE) \
diff --git a/drivers/media/dvb/frontends/stv0900_core.c b/drivers/media/dvb/frontends/stv0900_core.c
index 3bde3324a032..01f8f1f802fd 100644
--- a/drivers/media/dvb/frontends/stv0900_core.c
+++ b/drivers/media/dvb/frontends/stv0900_core.c
@@ -34,7 +34,7 @@
34#include "stv0900_priv.h" 34#include "stv0900_priv.h"
35#include "stv0900_init.h" 35#include "stv0900_init.h"
36 36
37static int stvdebug = 1; 37int stvdebug = 1;
38module_param_named(debug, stvdebug, int, 0644); 38module_param_named(debug, stvdebug, int, 0644);
39 39
40/* internal params node */ 40/* internal params node */
@@ -105,7 +105,8 @@ static struct stv0900_inode *append_internal(struct stv0900_internal *internal)
105 while (new_node->next_inode != NULL) 105 while (new_node->next_inode != NULL)
106 new_node = new_node->next_inode; 106 new_node = new_node->next_inode;
107 107
108 new_node->next_inode = kmalloc(sizeof(struct stv0900_inode), GFP_KERNEL); 108 new_node->next_inode = kmalloc(sizeof(struct stv0900_inode),
109 GFP_KERNEL);
109 if (new_node->next_inode != NULL) 110 if (new_node->next_inode != NULL)
110 new_node = new_node->next_inode; 111 new_node = new_node->next_inode;
111 else 112 else
@@ -128,13 +129,13 @@ s32 ge2comp(s32 a, s32 width)
128 return (a >= (1 << (width - 1))) ? (a - (1 << width)) : a; 129 return (a >= (1 << (width - 1))) ? (a - (1 << width)) : a;
129} 130}
130 131
131void stv0900_write_reg(struct stv0900_internal *i_params, u16 reg_addr, 132void stv0900_write_reg(struct stv0900_internal *intp, u16 reg_addr,
132 u8 reg_data) 133 u8 reg_data)
133{ 134{
134 u8 data[3]; 135 u8 data[3];
135 int ret; 136 int ret;
136 struct i2c_msg i2cmsg = { 137 struct i2c_msg i2cmsg = {
137 .addr = i_params->i2c_addr, 138 .addr = intp->i2c_addr,
138 .flags = 0, 139 .flags = 0,
139 .len = 3, 140 .len = 3,
140 .buf = data, 141 .buf = data,
@@ -144,39 +145,39 @@ void stv0900_write_reg(struct stv0900_internal *i_params, u16 reg_addr,
144 data[1] = LSB(reg_addr); 145 data[1] = LSB(reg_addr);
145 data[2] = reg_data; 146 data[2] = reg_data;
146 147
147 ret = i2c_transfer(i_params->i2c_adap, &i2cmsg, 1); 148 ret = i2c_transfer(intp->i2c_adap, &i2cmsg, 1);
148 if (ret != 1) 149 if (ret != 1)
149 dprintk(KERN_ERR "%s: i2c error %d\n", __func__, ret); 150 dprintk("%s: i2c error %d\n", __func__, ret);
150} 151}
151 152
152u8 stv0900_read_reg(struct stv0900_internal *i_params, u16 reg) 153u8 stv0900_read_reg(struct stv0900_internal *intp, u16 reg)
153{ 154{
154 int ret; 155 int ret;
155 u8 b0[] = { MSB(reg), LSB(reg) }; 156 u8 b0[] = { MSB(reg), LSB(reg) };
156 u8 buf = 0; 157 u8 buf = 0;
157 struct i2c_msg msg[] = { 158 struct i2c_msg msg[] = {
158 { 159 {
159 .addr = i_params->i2c_addr, 160 .addr = intp->i2c_addr,
160 .flags = 0, 161 .flags = 0,
161 .buf = b0, 162 .buf = b0,
162 .len = 2, 163 .len = 2,
163 }, { 164 }, {
164 .addr = i_params->i2c_addr, 165 .addr = intp->i2c_addr,
165 .flags = I2C_M_RD, 166 .flags = I2C_M_RD,
166 .buf = &buf, 167 .buf = &buf,
167 .len = 1, 168 .len = 1,
168 }, 169 },
169 }; 170 };
170 171
171 ret = i2c_transfer(i_params->i2c_adap, msg, 2); 172 ret = i2c_transfer(intp->i2c_adap, msg, 2);
172 if (ret != 2) 173 if (ret != 2)
173 dprintk(KERN_ERR "%s: i2c error %d, reg[0x%02x]\n", 174 dprintk("%s: i2c error %d, reg[0x%02x]\n",
174 __func__, ret, reg); 175 __func__, ret, reg);
175 176
176 return buf; 177 return buf;
177} 178}
178 179
179void extract_mask_pos(u32 label, u8 *mask, u8 *pos) 180static void extract_mask_pos(u32 label, u8 *mask, u8 *pos)
180{ 181{
181 u8 position = 0, i = 0; 182 u8 position = 0, i = 0;
182 183
@@ -190,169 +191,165 @@ void extract_mask_pos(u32 label, u8 *mask, u8 *pos)
190 (*pos) = (i - 1); 191 (*pos) = (i - 1);
191} 192}
192 193
193void stv0900_write_bits(struct stv0900_internal *i_params, u32 label, u8 val) 194void stv0900_write_bits(struct stv0900_internal *intp, u32 label, u8 val)
194{ 195{
195 u8 reg, mask, pos; 196 u8 reg, mask, pos;
196 197
197 reg = stv0900_read_reg(i_params, (label >> 16) & 0xffff); 198 reg = stv0900_read_reg(intp, (label >> 16) & 0xffff);
198 extract_mask_pos(label, &mask, &pos); 199 extract_mask_pos(label, &mask, &pos);
199 200
200 val = mask & (val << pos); 201 val = mask & (val << pos);
201 202
202 reg = (reg & (~mask)) | val; 203 reg = (reg & (~mask)) | val;
203 stv0900_write_reg(i_params, (label >> 16) & 0xffff, reg); 204 stv0900_write_reg(intp, (label >> 16) & 0xffff, reg);
204 205
205} 206}
206 207
207u8 stv0900_get_bits(struct stv0900_internal *i_params, u32 label) 208u8 stv0900_get_bits(struct stv0900_internal *intp, u32 label)
208{ 209{
209 u8 val = 0xff; 210 u8 val = 0xff;
210 u8 mask, pos; 211 u8 mask, pos;
211 212
212 extract_mask_pos(label, &mask, &pos); 213 extract_mask_pos(label, &mask, &pos);
213 214
214 val = stv0900_read_reg(i_params, label >> 16); 215 val = stv0900_read_reg(intp, label >> 16);
215 val = (val & mask) >> pos; 216 val = (val & mask) >> pos;
216 217
217 return val; 218 return val;
218} 219}
219 220
220enum fe_stv0900_error stv0900_initialize(struct stv0900_internal *i_params) 221static enum fe_stv0900_error stv0900_initialize(struct stv0900_internal *intp)
221{ 222{
222 s32 i; 223 s32 i;
223 enum fe_stv0900_error error;
224
225 if (i_params != NULL) {
226 i_params->chip_id = stv0900_read_reg(i_params, R0900_MID);
227 if (i_params->errs == STV0900_NO_ERROR) {
228 /*Startup sequence*/
229 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5c);
230 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5c);
231 stv0900_write_reg(i_params, R0900_P1_TNRCFG, 0x6c);
232 stv0900_write_reg(i_params, R0900_P2_TNRCFG, 0x6f);
233 stv0900_write_reg(i_params, R0900_P1_I2CRPT, 0x20);
234 stv0900_write_reg(i_params, R0900_P2_I2CRPT, 0x20);
235 stv0900_write_reg(i_params, R0900_NCOARSE, 0x13);
236 msleep(3);
237 stv0900_write_reg(i_params, R0900_I2CCFG, 0x08);
238
239 switch (i_params->clkmode) {
240 case 0:
241 case 2:
242 stv0900_write_reg(i_params, R0900_SYNTCTRL, 0x20
243 | i_params->clkmode);
244 break;
245 default:
246 /* preserve SELOSCI bit */
247 i = 0x02 & stv0900_read_reg(i_params, R0900_SYNTCTRL);
248 stv0900_write_reg(i_params, R0900_SYNTCTRL, 0x20 | i);
249 break;
250 }
251 224
252 msleep(3); 225 if (intp == NULL)
253 for (i = 0; i < 182; i++) 226 return STV0900_INVALID_HANDLE;
254 stv0900_write_reg(i_params, STV0900_InitVal[i][0], STV0900_InitVal[i][1]);
255 227
256 if (stv0900_read_reg(i_params, R0900_MID) >= 0x20) { 228 intp->chip_id = stv0900_read_reg(intp, R0900_MID);
257 stv0900_write_reg(i_params, R0900_TSGENERAL, 0x0c);
258 for (i = 0; i < 32; i++)
259 stv0900_write_reg(i_params, STV0900_Cut20_AddOnVal[i][0], STV0900_Cut20_AddOnVal[i][1]);
260 }
261 229
262 stv0900_write_reg(i_params, R0900_P1_FSPYCFG, 0x6c); 230 if (intp->errs != STV0900_NO_ERROR)
263 stv0900_write_reg(i_params, R0900_P2_FSPYCFG, 0x6c); 231 return intp->errs;
264 stv0900_write_reg(i_params, R0900_TSTRES0, 0x80);
265 stv0900_write_reg(i_params, R0900_TSTRES0, 0x00);
266 }
267 error = i_params->errs;
268 } else
269 error = STV0900_INVALID_HANDLE;
270 232
271 return error; 233 /*Startup sequence*/
234 stv0900_write_reg(intp, R0900_P1_DMDISTATE, 0x5c);
235 stv0900_write_reg(intp, R0900_P2_DMDISTATE, 0x5c);
236 msleep(3);
237 stv0900_write_reg(intp, R0900_P1_TNRCFG, 0x6c);
238 stv0900_write_reg(intp, R0900_P2_TNRCFG, 0x6f);
239 stv0900_write_reg(intp, R0900_P1_I2CRPT, 0x20);
240 stv0900_write_reg(intp, R0900_P2_I2CRPT, 0x20);
241 stv0900_write_reg(intp, R0900_NCOARSE, 0x13);
242 msleep(3);
243 stv0900_write_reg(intp, R0900_I2CCFG, 0x08);
244
245 switch (intp->clkmode) {
246 case 0:
247 case 2:
248 stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20
249 | intp->clkmode);
250 break;
251 default:
252 /* preserve SELOSCI bit */
253 i = 0x02 & stv0900_read_reg(intp, R0900_SYNTCTRL);
254 stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | i);
255 break;
256 }
257
258 msleep(3);
259 for (i = 0; i < 181; i++)
260 stv0900_write_reg(intp, STV0900_InitVal[i][0],
261 STV0900_InitVal[i][1]);
262
263 if (stv0900_read_reg(intp, R0900_MID) >= 0x20) {
264 stv0900_write_reg(intp, R0900_TSGENERAL, 0x0c);
265 for (i = 0; i < 32; i++)
266 stv0900_write_reg(intp, STV0900_Cut20_AddOnVal[i][0],
267 STV0900_Cut20_AddOnVal[i][1]);
268 }
272 269
270 stv0900_write_reg(intp, R0900_P1_FSPYCFG, 0x6c);
271 stv0900_write_reg(intp, R0900_P2_FSPYCFG, 0x6c);
272
273 stv0900_write_reg(intp, R0900_P1_PDELCTRL2, 0x01);
274 stv0900_write_reg(intp, R0900_P2_PDELCTRL2, 0x21);
275
276 stv0900_write_reg(intp, R0900_P1_PDELCTRL3, 0x20);
277 stv0900_write_reg(intp, R0900_P2_PDELCTRL3, 0x20);
278
279 stv0900_write_reg(intp, R0900_TSTRES0, 0x80);
280 stv0900_write_reg(intp, R0900_TSTRES0, 0x00);
281
282 return STV0900_NO_ERROR;
273} 283}
274 284
275u32 stv0900_get_mclk_freq(struct stv0900_internal *i_params, u32 ext_clk) 285static u32 stv0900_get_mclk_freq(struct stv0900_internal *intp, u32 ext_clk)
276{ 286{
277 u32 mclk = 90000000, div = 0, ad_div = 0; 287 u32 mclk = 90000000, div = 0, ad_div = 0;
278 288
279 div = stv0900_get_bits(i_params, F0900_M_DIV); 289 div = stv0900_get_bits(intp, F0900_M_DIV);
280 ad_div = ((stv0900_get_bits(i_params, F0900_SELX1RATIO) == 1) ? 4 : 6); 290 ad_div = ((stv0900_get_bits(intp, F0900_SELX1RATIO) == 1) ? 4 : 6);
281 291
282 mclk = (div + 1) * ext_clk / ad_div; 292 mclk = (div + 1) * ext_clk / ad_div;
283 293
284 dprintk(KERN_INFO "%s: Calculated Mclk = %d\n", __func__, mclk); 294 dprintk("%s: Calculated Mclk = %d\n", __func__, mclk);
285 295
286 return mclk; 296 return mclk;
287} 297}
288 298
289enum fe_stv0900_error stv0900_set_mclk(struct stv0900_internal *i_params, u32 mclk) 299static enum fe_stv0900_error stv0900_set_mclk(struct stv0900_internal *intp, u32 mclk)
290{ 300{
291 enum fe_stv0900_error error = STV0900_NO_ERROR;
292 u32 m_div, clk_sel; 301 u32 m_div, clk_sel;
293 302
294 dprintk(KERN_INFO "%s: Mclk set to %d, Quartz = %d\n", __func__, mclk, 303 dprintk("%s: Mclk set to %d, Quartz = %d\n", __func__, mclk,
295 i_params->quartz); 304 intp->quartz);
296 305
297 if (i_params == NULL) 306 if (intp == NULL)
298 error = STV0900_INVALID_HANDLE; 307 return STV0900_INVALID_HANDLE;
299 else {
300 if (i_params->errs)
301 error = STV0900_I2C_ERROR;
302 else {
303 clk_sel = ((stv0900_get_bits(i_params, F0900_SELX1RATIO) == 1) ? 4 : 6);
304 m_div = ((clk_sel * mclk) / i_params->quartz) - 1;
305 stv0900_write_bits(i_params, F0900_M_DIV, m_div);
306 i_params->mclk = stv0900_get_mclk_freq(i_params,
307 i_params->quartz);
308
309 /*Set the DiseqC frequency to 22KHz */
310 /*
311 Formula:
312 DiseqC_TX_Freq= MasterClock/(32*F22TX_Reg)
313 DiseqC_RX_Freq= MasterClock/(32*F22RX_Reg)
314 */
315 m_div = i_params->mclk / 704000;
316 stv0900_write_reg(i_params, R0900_P1_F22TX, m_div);
317 stv0900_write_reg(i_params, R0900_P1_F22RX, m_div);
318
319 stv0900_write_reg(i_params, R0900_P2_F22TX, m_div);
320 stv0900_write_reg(i_params, R0900_P2_F22RX, m_div);
321
322 if ((i_params->errs))
323 error = STV0900_I2C_ERROR;
324 }
325 }
326 308
327 return error; 309 if (intp->errs)
310 return STV0900_I2C_ERROR;
311
312 clk_sel = ((stv0900_get_bits(intp, F0900_SELX1RATIO) == 1) ? 4 : 6);
313 m_div = ((clk_sel * mclk) / intp->quartz) - 1;
314 stv0900_write_bits(intp, F0900_M_DIV, m_div);
315 intp->mclk = stv0900_get_mclk_freq(intp,
316 intp->quartz);
317
318 /*Set the DiseqC frequency to 22KHz */
319 /*
320 Formula:
321 DiseqC_TX_Freq= MasterClock/(32*F22TX_Reg)
322 DiseqC_RX_Freq= MasterClock/(32*F22RX_Reg)
323 */
324 m_div = intp->mclk / 704000;
325 stv0900_write_reg(intp, R0900_P1_F22TX, m_div);
326 stv0900_write_reg(intp, R0900_P1_F22RX, m_div);
327
328 stv0900_write_reg(intp, R0900_P2_F22TX, m_div);
329 stv0900_write_reg(intp, R0900_P2_F22RX, m_div);
330
331 if ((intp->errs))
332 return STV0900_I2C_ERROR;
333
334 return STV0900_NO_ERROR;
328} 335}
329 336
330u32 stv0900_get_err_count(struct stv0900_internal *i_params, int cntr, 337static u32 stv0900_get_err_count(struct stv0900_internal *intp, int cntr,
331 enum fe_stv0900_demod_num demod) 338 enum fe_stv0900_demod_num demod)
332{ 339{
333 u32 lsb, msb, hsb, err_val; 340 u32 lsb, msb, hsb, err_val;
334 s32 err1field_hsb, err1field_msb, err1field_lsb;
335 s32 err2field_hsb, err2field_msb, err2field_lsb;
336
337 dmd_reg(err1field_hsb, F0900_P1_ERR_CNT12, F0900_P2_ERR_CNT12);
338 dmd_reg(err1field_msb, F0900_P1_ERR_CNT11, F0900_P2_ERR_CNT11);
339 dmd_reg(err1field_lsb, F0900_P1_ERR_CNT10, F0900_P2_ERR_CNT10);
340
341 dmd_reg(err2field_hsb, F0900_P1_ERR_CNT22, F0900_P2_ERR_CNT22);
342 dmd_reg(err2field_msb, F0900_P1_ERR_CNT21, F0900_P2_ERR_CNT21);
343 dmd_reg(err2field_lsb, F0900_P1_ERR_CNT20, F0900_P2_ERR_CNT20);
344 341
345 switch (cntr) { 342 switch (cntr) {
346 case 0: 343 case 0:
347 default: 344 default:
348 hsb = stv0900_get_bits(i_params, err1field_hsb); 345 hsb = stv0900_get_bits(intp, ERR_CNT12);
349 msb = stv0900_get_bits(i_params, err1field_msb); 346 msb = stv0900_get_bits(intp, ERR_CNT11);
350 lsb = stv0900_get_bits(i_params, err1field_lsb); 347 lsb = stv0900_get_bits(intp, ERR_CNT10);
351 break; 348 break;
352 case 1: 349 case 1:
353 hsb = stv0900_get_bits(i_params, err2field_hsb); 350 hsb = stv0900_get_bits(intp, ERR_CNT22);
354 msb = stv0900_get_bits(i_params, err2field_msb); 351 msb = stv0900_get_bits(intp, ERR_CNT21);
355 lsb = stv0900_get_bits(i_params, err2field_lsb); 352 lsb = stv0900_get_bits(intp, ERR_CNT20);
356 break; 353 break;
357 } 354 }
358 355
@@ -364,26 +361,22 @@ u32 stv0900_get_err_count(struct stv0900_internal *i_params, int cntr,
364static int stv0900_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 361static int stv0900_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
365{ 362{
366 struct stv0900_state *state = fe->demodulator_priv; 363 struct stv0900_state *state = fe->demodulator_priv;
367 struct stv0900_internal *i_params = state->internal; 364 struct stv0900_internal *intp = state->internal;
368 enum fe_stv0900_demod_num demod = state->demod; 365 enum fe_stv0900_demod_num demod = state->demod;
369 366
370 u32 fi2c; 367 stv0900_write_bits(intp, I2CT_ON, enable);
371
372 dmd_reg(fi2c, F0900_P1_I2CT_ON, F0900_P2_I2CT_ON);
373
374 stv0900_write_bits(i_params, fi2c, enable);
375 368
376 return 0; 369 return 0;
377} 370}
378 371
379static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params, 372static void stv0900_set_ts_parallel_serial(struct stv0900_internal *intp,
380 enum fe_stv0900_clock_type path1_ts, 373 enum fe_stv0900_clock_type path1_ts,
381 enum fe_stv0900_clock_type path2_ts) 374 enum fe_stv0900_clock_type path2_ts)
382{ 375{
383 376
384 dprintk(KERN_INFO "%s\n", __func__); 377 dprintk("%s\n", __func__);
385 378
386 if (i_params->chip_id >= 0x20) { 379 if (intp->chip_id >= 0x20) {
387 switch (path1_ts) { 380 switch (path1_ts) {
388 case STV0900_PARALLEL_PUNCT_CLOCK: 381 case STV0900_PARALLEL_PUNCT_CLOCK:
389 case STV0900_DVBCI_CLOCK: 382 case STV0900_DVBCI_CLOCK:
@@ -391,20 +384,20 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params,
391 case STV0900_SERIAL_PUNCT_CLOCK: 384 case STV0900_SERIAL_PUNCT_CLOCK:
392 case STV0900_SERIAL_CONT_CLOCK: 385 case STV0900_SERIAL_CONT_CLOCK:
393 default: 386 default:
394 stv0900_write_reg(i_params, R0900_TSGENERAL, 387 stv0900_write_reg(intp, R0900_TSGENERAL,
395 0x00); 388 0x00);
396 break; 389 break;
397 case STV0900_PARALLEL_PUNCT_CLOCK: 390 case STV0900_PARALLEL_PUNCT_CLOCK:
398 case STV0900_DVBCI_CLOCK: 391 case STV0900_DVBCI_CLOCK:
399 stv0900_write_reg(i_params, R0900_TSGENERAL, 392 stv0900_write_reg(intp, R0900_TSGENERAL,
400 0x06); 393 0x06);
401 stv0900_write_bits(i_params, 394 stv0900_write_bits(intp,
402 F0900_P1_TSFIFO_MANSPEED, 3); 395 F0900_P1_TSFIFO_MANSPEED, 3);
403 stv0900_write_bits(i_params, 396 stv0900_write_bits(intp,
404 F0900_P2_TSFIFO_MANSPEED, 0); 397 F0900_P2_TSFIFO_MANSPEED, 0);
405 stv0900_write_reg(i_params, 398 stv0900_write_reg(intp,
406 R0900_P1_TSSPEED, 0x14); 399 R0900_P1_TSSPEED, 0x14);
407 stv0900_write_reg(i_params, 400 stv0900_write_reg(intp,
408 R0900_P2_TSSPEED, 0x28); 401 R0900_P2_TSSPEED, 0x28);
409 break; 402 break;
410 } 403 }
@@ -416,14 +409,14 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params,
416 case STV0900_SERIAL_PUNCT_CLOCK: 409 case STV0900_SERIAL_PUNCT_CLOCK:
417 case STV0900_SERIAL_CONT_CLOCK: 410 case STV0900_SERIAL_CONT_CLOCK:
418 default: 411 default:
419 stv0900_write_reg(i_params, 412 stv0900_write_reg(intp,
420 R0900_TSGENERAL, 0x0C); 413 R0900_TSGENERAL, 0x0C);
421 break; 414 break;
422 case STV0900_PARALLEL_PUNCT_CLOCK: 415 case STV0900_PARALLEL_PUNCT_CLOCK:
423 case STV0900_DVBCI_CLOCK: 416 case STV0900_DVBCI_CLOCK:
424 stv0900_write_reg(i_params, 417 stv0900_write_reg(intp,
425 R0900_TSGENERAL, 0x0A); 418 R0900_TSGENERAL, 0x0A);
426 dprintk(KERN_INFO "%s: 0x0a\n", __func__); 419 dprintk("%s: 0x0a\n", __func__);
427 break; 420 break;
428 } 421 }
429 break; 422 break;
@@ -436,20 +429,20 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params,
436 case STV0900_SERIAL_PUNCT_CLOCK: 429 case STV0900_SERIAL_PUNCT_CLOCK:
437 case STV0900_SERIAL_CONT_CLOCK: 430 case STV0900_SERIAL_CONT_CLOCK:
438 default: 431 default:
439 stv0900_write_reg(i_params, R0900_TSGENERAL1X, 432 stv0900_write_reg(intp, R0900_TSGENERAL1X,
440 0x10); 433 0x10);
441 break; 434 break;
442 case STV0900_PARALLEL_PUNCT_CLOCK: 435 case STV0900_PARALLEL_PUNCT_CLOCK:
443 case STV0900_DVBCI_CLOCK: 436 case STV0900_DVBCI_CLOCK:
444 stv0900_write_reg(i_params, R0900_TSGENERAL1X, 437 stv0900_write_reg(intp, R0900_TSGENERAL1X,
445 0x16); 438 0x16);
446 stv0900_write_bits(i_params, 439 stv0900_write_bits(intp,
447 F0900_P1_TSFIFO_MANSPEED, 3); 440 F0900_P1_TSFIFO_MANSPEED, 3);
448 stv0900_write_bits(i_params, 441 stv0900_write_bits(intp,
449 F0900_P2_TSFIFO_MANSPEED, 0); 442 F0900_P2_TSFIFO_MANSPEED, 0);
450 stv0900_write_reg(i_params, R0900_P1_TSSPEED, 443 stv0900_write_reg(intp, R0900_P1_TSSPEED,
451 0x14); 444 0x14);
452 stv0900_write_reg(i_params, R0900_P2_TSSPEED, 445 stv0900_write_reg(intp, R0900_P2_TSSPEED,
453 0x28); 446 0x28);
454 break; 447 break;
455 } 448 }
@@ -462,14 +455,14 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params,
462 case STV0900_SERIAL_PUNCT_CLOCK: 455 case STV0900_SERIAL_PUNCT_CLOCK:
463 case STV0900_SERIAL_CONT_CLOCK: 456 case STV0900_SERIAL_CONT_CLOCK:
464 default: 457 default:
465 stv0900_write_reg(i_params, R0900_TSGENERAL1X, 458 stv0900_write_reg(intp, R0900_TSGENERAL1X,
466 0x14); 459 0x14);
467 break; 460 break;
468 case STV0900_PARALLEL_PUNCT_CLOCK: 461 case STV0900_PARALLEL_PUNCT_CLOCK:
469 case STV0900_DVBCI_CLOCK: 462 case STV0900_DVBCI_CLOCK:
470 stv0900_write_reg(i_params, R0900_TSGENERAL1X, 463 stv0900_write_reg(intp, R0900_TSGENERAL1X,
471 0x12); 464 0x12);
472 dprintk(KERN_INFO "%s: 0x12\n", __func__); 465 dprintk("%s: 0x12\n", __func__);
473 break; 466 break;
474 } 467 }
475 468
@@ -479,20 +472,20 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params,
479 472
480 switch (path1_ts) { 473 switch (path1_ts) {
481 case STV0900_PARALLEL_PUNCT_CLOCK: 474 case STV0900_PARALLEL_PUNCT_CLOCK:
482 stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x00); 475 stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x00);
483 stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x00); 476 stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x00);
484 break; 477 break;
485 case STV0900_DVBCI_CLOCK: 478 case STV0900_DVBCI_CLOCK:
486 stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x00); 479 stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x00);
487 stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x01); 480 stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x01);
488 break; 481 break;
489 case STV0900_SERIAL_PUNCT_CLOCK: 482 case STV0900_SERIAL_PUNCT_CLOCK:
490 stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x01); 483 stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x01);
491 stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x00); 484 stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x00);
492 break; 485 break;
493 case STV0900_SERIAL_CONT_CLOCK: 486 case STV0900_SERIAL_CONT_CLOCK:
494 stv0900_write_bits(i_params, F0900_P1_TSFIFO_SERIAL, 0x01); 487 stv0900_write_bits(intp, F0900_P1_TSFIFO_SERIAL, 0x01);
495 stv0900_write_bits(i_params, F0900_P1_TSFIFO_DVBCI, 0x01); 488 stv0900_write_bits(intp, F0900_P1_TSFIFO_DVBCI, 0x01);
496 break; 489 break;
497 default: 490 default:
498 break; 491 break;
@@ -500,29 +493,29 @@ static void stv0900_set_ts_parallel_serial(struct stv0900_internal *i_params,
500 493
501 switch (path2_ts) { 494 switch (path2_ts) {
502 case STV0900_PARALLEL_PUNCT_CLOCK: 495 case STV0900_PARALLEL_PUNCT_CLOCK:
503 stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x00); 496 stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x00);
504 stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x00); 497 stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x00);
505 break; 498 break;
506 case STV0900_DVBCI_CLOCK: 499 case STV0900_DVBCI_CLOCK:
507 stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x00); 500 stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x00);
508 stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x01); 501 stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x01);
509 break; 502 break;
510 case STV0900_SERIAL_PUNCT_CLOCK: 503 case STV0900_SERIAL_PUNCT_CLOCK:
511 stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x01); 504 stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x01);
512 stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x00); 505 stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x00);
513 break; 506 break;
514 case STV0900_SERIAL_CONT_CLOCK: 507 case STV0900_SERIAL_CONT_CLOCK:
515 stv0900_write_bits(i_params, F0900_P2_TSFIFO_SERIAL, 0x01); 508 stv0900_write_bits(intp, F0900_P2_TSFIFO_SERIAL, 0x01);
516 stv0900_write_bits(i_params, F0900_P2_TSFIFO_DVBCI, 0x01); 509 stv0900_write_bits(intp, F0900_P2_TSFIFO_DVBCI, 0x01);
517 break; 510 break;
518 default: 511 default:
519 break; 512 break;
520 } 513 }
521 514
522 stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 1); 515 stv0900_write_bits(intp, F0900_P2_RST_HWARE, 1);
523 stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 0); 516 stv0900_write_bits(intp, F0900_P2_RST_HWARE, 0);
524 stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 1); 517 stv0900_write_bits(intp, F0900_P1_RST_HWARE, 1);
525 stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 0); 518 stv0900_write_bits(intp, F0900_P1_RST_HWARE, 0);
526} 519}
527 520
528void stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency, 521void stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency,
@@ -574,7 +567,47 @@ void stv0900_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth)
574 } 567 }
575} 568}
576 569
577static s32 stv0900_get_rf_level(struct stv0900_internal *i_params, 570u32 stv0900_get_freq_auto(struct stv0900_internal *intp, int demod)
571{
572 u32 freq, round;
573 /* Formulat :
574 Tuner_Frequency(MHz) = Regs / 64
575 Tuner_granularity(MHz) = Regs / 2048
576 real_Tuner_Frequency = Tuner_Frequency(MHz) - Tuner_granularity(MHz)
577 */
578 freq = (stv0900_get_bits(intp, TUN_RFFREQ2) << 10) +
579 (stv0900_get_bits(intp, TUN_RFFREQ1) << 2) +
580 stv0900_get_bits(intp, TUN_RFFREQ0);
581
582 freq = (freq * 1000) / 64;
583
584 round = (stv0900_get_bits(intp, TUN_RFRESTE1) >> 2) +
585 stv0900_get_bits(intp, TUN_RFRESTE0);
586
587 round = (round * 1000) / 2048;
588
589 return freq + round;
590}
591
592void stv0900_set_tuner_auto(struct stv0900_internal *intp, u32 Frequency,
593 u32 Bandwidth, int demod)
594{
595 u32 tunerFrequency;
596 /* Formulat:
597 Tuner_frequency_reg= Frequency(MHz)*64
598 */
599 tunerFrequency = (Frequency * 64) / 1000;
600
601 stv0900_write_bits(intp, TUN_RFFREQ2, (tunerFrequency >> 10));
602 stv0900_write_bits(intp, TUN_RFFREQ1, (tunerFrequency >> 2) & 0xff);
603 stv0900_write_bits(intp, TUN_RFFREQ0, (tunerFrequency & 0x03));
604 /* Low Pass Filter = BW /2 (MHz)*/
605 stv0900_write_bits(intp, TUN_BW, Bandwidth / 2000000);
606 /* Tuner Write trig */
607 stv0900_write_reg(intp, TNRLD, 1);
608}
609
610static s32 stv0900_get_rf_level(struct stv0900_internal *intp,
578 const struct stv0900_table *lookup, 611 const struct stv0900_table *lookup,
579 enum fe_stv0900_demod_num demod) 612 enum fe_stv0900_demod_num demod)
580{ 613{
@@ -584,45 +617,41 @@ static s32 stv0900_get_rf_level(struct stv0900_internal *i_params,
584 i, 617 i,
585 rf_lvl = 0; 618 rf_lvl = 0;
586 619
587 dprintk(KERN_INFO "%s\n", __func__); 620 dprintk("%s\n", __func__);
588 621
589 if ((lookup != NULL) && lookup->size) { 622 if ((lookup == NULL) || (lookup->size <= 0))
590 switch (demod) { 623 return 0;
591 case STV0900_DEMOD_1:
592 default:
593 agc_gain = MAKEWORD(stv0900_get_bits(i_params, F0900_P1_AGCIQ_VALUE1),
594 stv0900_get_bits(i_params, F0900_P1_AGCIQ_VALUE0));
595 break;
596 case STV0900_DEMOD_2:
597 agc_gain = MAKEWORD(stv0900_get_bits(i_params, F0900_P2_AGCIQ_VALUE1),
598 stv0900_get_bits(i_params, F0900_P2_AGCIQ_VALUE0));
599 break;
600 }
601 624
602 imin = 0; 625 agc_gain = MAKEWORD(stv0900_get_bits(intp, AGCIQ_VALUE1),
603 imax = lookup->size - 1; 626 stv0900_get_bits(intp, AGCIQ_VALUE0));
604 if (INRANGE(lookup->table[imin].regval, agc_gain, lookup->table[imax].regval)) {
605 while ((imax - imin) > 1) {
606 i = (imax + imin) >> 1;
607 627
608 if (INRANGE(lookup->table[imin].regval, agc_gain, lookup->table[i].regval)) 628 imin = 0;
609 imax = i; 629 imax = lookup->size - 1;
610 else 630 if (INRANGE(lookup->table[imin].regval, agc_gain,
611 imin = i; 631 lookup->table[imax].regval)) {
612 } 632 while ((imax - imin) > 1) {
633 i = (imax + imin) >> 1;
613 634
614 rf_lvl = (((s32)agc_gain - lookup->table[imin].regval) 635 if (INRANGE(lookup->table[imin].regval,
615 * (lookup->table[imax].realval - lookup->table[imin].realval) 636 agc_gain,
616 / (lookup->table[imax].regval - lookup->table[imin].regval)) 637 lookup->table[i].regval))
617 + lookup->table[imin].realval; 638 imax = i;
618 } else if (agc_gain > lookup->table[0].regval) 639 else
619 rf_lvl = 5; 640 imin = i;
620 else if (agc_gain < lookup->table[lookup->size-1].regval) 641 }
621 rf_lvl = -100;
622 642
623 } 643 rf_lvl = (s32)agc_gain - lookup->table[imin].regval;
644 rf_lvl *= (lookup->table[imax].realval -
645 lookup->table[imin].realval);
646 rf_lvl /= (lookup->table[imax].regval -
647 lookup->table[imin].regval);
648 rf_lvl += lookup->table[imin].realval;
649 } else if (agc_gain > lookup->table[0].regval)
650 rf_lvl = 5;
651 else if (agc_gain < lookup->table[lookup->size-1].regval)
652 rf_lvl = -100;
624 653
625 dprintk(KERN_INFO "%s: RFLevel = %d\n", __func__, rf_lvl); 654 dprintk("%s: RFLevel = %d\n", __func__, rf_lvl);
626 655
627 return rf_lvl; 656 return rf_lvl;
628} 657}
@@ -634,50 +663,51 @@ static int stv0900_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
634 s32 rflevel = stv0900_get_rf_level(internal, &stv0900_rf, 663 s32 rflevel = stv0900_get_rf_level(internal, &stv0900_rf,
635 state->demod); 664 state->demod);
636 665
637 *strength = (rflevel + 100) * (16383 / 105); 666 rflevel = (rflevel + 100) * (65535 / 70);
667 if (rflevel < 0)
668 rflevel = 0;
669
670 if (rflevel > 65535)
671 rflevel = 65535;
672
673 *strength = rflevel;
638 674
639 return 0; 675 return 0;
640} 676}
641 677
642
643static s32 stv0900_carr_get_quality(struct dvb_frontend *fe, 678static s32 stv0900_carr_get_quality(struct dvb_frontend *fe,
644 const struct stv0900_table *lookup) 679 const struct stv0900_table *lookup)
645{ 680{
646 struct stv0900_state *state = fe->demodulator_priv; 681 struct stv0900_state *state = fe->demodulator_priv;
647 struct stv0900_internal *i_params = state->internal; 682 struct stv0900_internal *intp = state->internal;
648 enum fe_stv0900_demod_num demod = state->demod; 683 enum fe_stv0900_demod_num demod = state->demod;
649 684
650 s32 c_n = -100, 685 s32 c_n = -100,
651 regval, imin, imax, 686 regval,
687 imin,
688 imax,
652 i, 689 i,
653 lock_flag_field,
654 noise_field1, 690 noise_field1,
655 noise_field0; 691 noise_field0;
656 692
657 dprintk(KERN_INFO "%s\n", __func__); 693 dprintk("%s\n", __func__);
658 694
659 dmd_reg(lock_flag_field, F0900_P1_LOCK_DEFINITIF,
660 F0900_P2_LOCK_DEFINITIF);
661 if (stv0900_get_standard(fe, demod) == STV0900_DVBS2_STANDARD) { 695 if (stv0900_get_standard(fe, demod) == STV0900_DVBS2_STANDARD) {
662 dmd_reg(noise_field1, F0900_P1_NOSPLHT_NORMED1, 696 noise_field1 = NOSPLHT_NORMED1;
663 F0900_P2_NOSPLHT_NORMED1); 697 noise_field0 = NOSPLHT_NORMED0;
664 dmd_reg(noise_field0, F0900_P1_NOSPLHT_NORMED0,
665 F0900_P2_NOSPLHT_NORMED0);
666 } else { 698 } else {
667 dmd_reg(noise_field1, F0900_P1_NOSDATAT_NORMED1, 699 noise_field1 = NOSDATAT_NORMED1;
668 F0900_P2_NOSDATAT_NORMED1); 700 noise_field0 = NOSDATAT_NORMED0;
669 dmd_reg(noise_field0, F0900_P1_NOSDATAT_NORMED0,
670 F0900_P2_NOSDATAT_NORMED0);
671 } 701 }
672 702
673 if (stv0900_get_bits(i_params, lock_flag_field)) { 703 if (stv0900_get_bits(intp, LOCK_DEFINITIF)) {
674 if ((lookup != NULL) && lookup->size) { 704 if ((lookup != NULL) && lookup->size) {
675 regval = 0; 705 regval = 0;
676 msleep(5); 706 msleep(5);
677 for (i = 0; i < 16; i++) { 707 for (i = 0; i < 16; i++) {
678 regval += MAKEWORD(stv0900_get_bits(i_params, 708 regval += MAKEWORD(stv0900_get_bits(intp,
679 noise_field1), 709 noise_field1),
680 stv0900_get_bits(i_params, 710 stv0900_get_bits(intp,
681 noise_field0)); 711 noise_field0));
682 msleep(1); 712 msleep(1);
683 } 713 }
@@ -715,10 +745,9 @@ static s32 stv0900_carr_get_quality(struct dvb_frontend *fe,
715static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks) 745static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
716{ 746{
717 struct stv0900_state *state = fe->demodulator_priv; 747 struct stv0900_state *state = fe->demodulator_priv;
718 struct stv0900_internal *i_params = state->internal; 748 struct stv0900_internal *intp = state->internal;
719 enum fe_stv0900_demod_num demod = state->demod; 749 enum fe_stv0900_demod_num demod = state->demod;
720 u8 err_val1, err_val0; 750 u8 err_val1, err_val0;
721 s32 err_field1, err_field0;
722 u32 header_err_val = 0; 751 u32 header_err_val = 0;
723 752
724 *ucblocks = 0x0; 753 *ucblocks = 0x0;
@@ -726,24 +755,14 @@ static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
726 /* DVB-S2 delineator errors count */ 755 /* DVB-S2 delineator errors count */
727 756
728 /* retreiving number for errnous headers */ 757 /* retreiving number for errnous headers */
729 dmd_reg(err_field0, R0900_P1_BBFCRCKO0, 758 err_val1 = stv0900_read_reg(intp, BBFCRCKO1);
730 R0900_P2_BBFCRCKO0); 759 err_val0 = stv0900_read_reg(intp, BBFCRCKO0);
731 dmd_reg(err_field1, R0900_P1_BBFCRCKO1, 760 header_err_val = (err_val1 << 8) | err_val0;
732 R0900_P2_BBFCRCKO1);
733
734 err_val1 = stv0900_read_reg(i_params, err_field1);
735 err_val0 = stv0900_read_reg(i_params, err_field0);
736 header_err_val = (err_val1<<8) | err_val0;
737 761
738 /* retreiving number for errnous packets */ 762 /* retreiving number for errnous packets */
739 dmd_reg(err_field0, R0900_P1_UPCRCKO0, 763 err_val1 = stv0900_read_reg(intp, UPCRCKO1);
740 R0900_P2_UPCRCKO0); 764 err_val0 = stv0900_read_reg(intp, UPCRCKO0);
741 dmd_reg(err_field1, R0900_P1_UPCRCKO1, 765 *ucblocks = (err_val1 << 8) | err_val0;
742 R0900_P2_UPCRCKO1);
743
744 err_val1 = stv0900_read_reg(i_params, err_field1);
745 err_val0 = stv0900_read_reg(i_params, err_field0);
746 *ucblocks = (err_val1<<8) | err_val0;
747 *ucblocks += header_err_val; 766 *ucblocks += header_err_val;
748 } 767 }
749 768
@@ -752,33 +771,27 @@ static int stv0900_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
752 771
753static int stv0900_read_snr(struct dvb_frontend *fe, u16 *snr) 772static int stv0900_read_snr(struct dvb_frontend *fe, u16 *snr)
754{ 773{
755 *snr = stv0900_carr_get_quality(fe, 774 s32 snrlcl = stv0900_carr_get_quality(fe,
756 (const struct stv0900_table *)&stv0900_s2_cn); 775 (const struct stv0900_table *)&stv0900_s2_cn);
757 *snr += 30; 776 snrlcl = (snrlcl + 30) * 384;
758 *snr *= (16383 / 1030); 777 if (snrlcl < 0)
778 snrlcl = 0;
779
780 if (snrlcl > 65535)
781 snrlcl = 65535;
782
783 *snr = snrlcl;
759 784
760 return 0; 785 return 0;
761} 786}
762 787
763static u32 stv0900_get_ber(struct stv0900_internal *i_params, 788static u32 stv0900_get_ber(struct stv0900_internal *intp,
764 enum fe_stv0900_demod_num demod) 789 enum fe_stv0900_demod_num demod)
765{ 790{
766 u32 ber = 10000000, i; 791 u32 ber = 10000000, i;
767 s32 dmd_state_reg;
768 s32 demod_state; 792 s32 demod_state;
769 s32 vstatus_reg;
770 s32 prvit_field;
771 s32 pdel_status_reg;
772 s32 pdel_lock_field;
773 793
774 dmd_reg(dmd_state_reg, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); 794 demod_state = stv0900_get_bits(intp, HEADER_MODE);
775 dmd_reg(vstatus_reg, R0900_P1_VSTATUSVIT, R0900_P2_VSTATUSVIT);
776 dmd_reg(prvit_field, F0900_P1_PRFVIT, F0900_P2_PRFVIT);
777 dmd_reg(pdel_status_reg, R0900_P1_PDELSTATUS1, R0900_P2_PDELSTATUS1);
778 dmd_reg(pdel_lock_field, F0900_P1_PKTDELIN_LOCK,
779 F0900_P2_PKTDELIN_LOCK);
780
781 demod_state = stv0900_get_bits(i_params, dmd_state_reg);
782 795
783 switch (demod_state) { 796 switch (demod_state) {
784 case STV0900_SEARCH: 797 case STV0900_SEARCH:
@@ -790,11 +803,11 @@ static u32 stv0900_get_ber(struct stv0900_internal *i_params,
790 ber = 0; 803 ber = 0;
791 for (i = 0; i < 5; i++) { 804 for (i = 0; i < 5; i++) {
792 msleep(5); 805 msleep(5);
793 ber += stv0900_get_err_count(i_params, 0, demod); 806 ber += stv0900_get_err_count(intp, 0, demod);
794 } 807 }
795 808
796 ber /= 5; 809 ber /= 5;
797 if (stv0900_get_bits(i_params, prvit_field)) { 810 if (stv0900_get_bits(intp, PRFVIT)) {
798 ber *= 9766; 811 ber *= 9766;
799 ber = ber >> 13; 812 ber = ber >> 13;
800 } 813 }
@@ -804,11 +817,11 @@ static u32 stv0900_get_ber(struct stv0900_internal *i_params,
804 ber = 0; 817 ber = 0;
805 for (i = 0; i < 5; i++) { 818 for (i = 0; i < 5; i++) {
806 msleep(5); 819 msleep(5);
807 ber += stv0900_get_err_count(i_params, 0, demod); 820 ber += stv0900_get_err_count(intp, 0, demod);
808 } 821 }
809 822
810 ber /= 5; 823 ber /= 5;
811 if (stv0900_get_bits(i_params, pdel_lock_field)) { 824 if (stv0900_get_bits(intp, PKTDELIN_LOCK)) {
812 ber *= 9766; 825 ber *= 9766;
813 ber = ber >> 13; 826 ber = ber >> 13;
814 } 827 }
@@ -829,20 +842,16 @@ static int stv0900_read_ber(struct dvb_frontend *fe, u32 *ber)
829 return 0; 842 return 0;
830} 843}
831 844
832int stv0900_get_demod_lock(struct stv0900_internal *i_params, 845int stv0900_get_demod_lock(struct stv0900_internal *intp,
833 enum fe_stv0900_demod_num demod, s32 time_out) 846 enum fe_stv0900_demod_num demod, s32 time_out)
834{ 847{
835 s32 timer = 0, 848 s32 timer = 0,
836 lock = 0, 849 lock = 0;
837 header_field,
838 lock_field;
839 850
840 enum fe_stv0900_search_state dmd_state; 851 enum fe_stv0900_search_state dmd_state;
841 852
842 dmd_reg(header_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE);
843 dmd_reg(lock_field, F0900_P1_LOCK_DEFINITIF, F0900_P2_LOCK_DEFINITIF);
844 while ((timer < time_out) && (lock == 0)) { 853 while ((timer < time_out) && (lock == 0)) {
845 dmd_state = stv0900_get_bits(i_params, header_field); 854 dmd_state = stv0900_get_bits(intp, HEADER_MODE);
846 dprintk("Demod State = %d\n", dmd_state); 855 dprintk("Demod State = %d\n", dmd_state);
847 switch (dmd_state) { 856 switch (dmd_state) {
848 case STV0900_SEARCH: 857 case STV0900_SEARCH:
@@ -852,7 +861,7 @@ int stv0900_get_demod_lock(struct stv0900_internal *i_params,
852 break; 861 break;
853 case STV0900_DVBS2_FOUND: 862 case STV0900_DVBS2_FOUND:
854 case STV0900_DVBS_FOUND: 863 case STV0900_DVBS_FOUND:
855 lock = stv0900_get_bits(i_params, lock_field); 864 lock = stv0900_get_bits(intp, LOCK_DEFINITIF);
856 break; 865 break;
857 } 866 }
858 867
@@ -870,56 +879,40 @@ int stv0900_get_demod_lock(struct stv0900_internal *i_params,
870 return lock; 879 return lock;
871} 880}
872 881
873void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, 882void stv0900_stop_all_s2_modcod(struct stv0900_internal *intp,
874 enum fe_stv0900_demod_num demod) 883 enum fe_stv0900_demod_num demod)
875{ 884{
876 s32 regflist, 885 s32 regflist,
877 i; 886 i;
878 887
879 dprintk(KERN_INFO "%s\n", __func__); 888 dprintk("%s\n", __func__);
880 889
881 dmd_reg(regflist, R0900_P1_MODCODLST0, R0900_P2_MODCODLST0); 890 regflist = MODCODLST0;
882 891
883 for (i = 0; i < 16; i++) 892 for (i = 0; i < 16; i++)
884 stv0900_write_reg(i_params, regflist + i, 0xff); 893 stv0900_write_reg(intp, regflist + i, 0xff);
885} 894}
886 895
887void stv0900_activate_s2_modcode(struct stv0900_internal *i_params, 896void stv0900_activate_s2_modcod(struct stv0900_internal *intp,
888 enum fe_stv0900_demod_num demod) 897 enum fe_stv0900_demod_num demod)
889{ 898{
890 u32 matype, 899 u32 matype,
891 mod_code, 900 mod_code,
892 fmod, 901 fmod,
893 reg_index, 902 reg_index,
894 field_index; 903 field_index;
895 904
896 dprintk(KERN_INFO "%s\n", __func__); 905 dprintk("%s\n", __func__);
897 906
898 if (i_params->chip_id <= 0x11) { 907 if (intp->chip_id <= 0x11) {
899 msleep(5); 908 msleep(5);
900 909
901 switch (demod) { 910 mod_code = stv0900_read_reg(intp, PLHMODCOD);
902 case STV0900_DEMOD_1: 911 matype = mod_code & 0x3;
903 default: 912 mod_code = (mod_code & 0x7f) >> 2;
904 mod_code = stv0900_read_reg(i_params,
905 R0900_P1_PLHMODCOD);
906 matype = mod_code & 0x3;
907 mod_code = (mod_code & 0x7f) >> 2;
908
909 reg_index = R0900_P1_MODCODLSTF - mod_code / 2;
910 field_index = mod_code % 2;
911 break;
912 case STV0900_DEMOD_2:
913 mod_code = stv0900_read_reg(i_params,
914 R0900_P2_PLHMODCOD);
915 matype = mod_code & 0x3;
916 mod_code = (mod_code & 0x7f) >> 2;
917
918 reg_index = R0900_P2_MODCODLSTF - mod_code / 2;
919 field_index = mod_code % 2;
920 break;
921 }
922 913
914 reg_index = MODCODLSTF - mod_code / 2;
915 field_index = mod_code % 2;
923 916
924 switch (matype) { 917 switch (matype) {
925 case 0: 918 case 0:
@@ -938,70 +931,41 @@ void stv0900_activate_s2_modcode(struct stv0900_internal *i_params,
938 } 931 }
939 932
940 if ((INRANGE(STV0900_QPSK_12, mod_code, STV0900_8PSK_910)) 933 if ((INRANGE(STV0900_QPSK_12, mod_code, STV0900_8PSK_910))
941 && (matype <= 1)) { 934 && (matype <= 1)) {
942 if (field_index == 0) 935 if (field_index == 0)
943 stv0900_write_reg(i_params, reg_index, 936 stv0900_write_reg(intp, reg_index,
944 0xf0 | fmod); 937 0xf0 | fmod);
945 else 938 else
946 stv0900_write_reg(i_params, reg_index, 939 stv0900_write_reg(intp, reg_index,
947 (fmod << 4) | 0xf); 940 (fmod << 4) | 0xf);
948 } 941 }
949 } else if (i_params->chip_id >= 0x12) {
950 switch (demod) {
951 case STV0900_DEMOD_1:
952 default:
953 for (reg_index = 0; reg_index < 7; reg_index++)
954 stv0900_write_reg(i_params, R0900_P1_MODCODLST0 + reg_index, 0xff);
955 942
956 stv0900_write_reg(i_params, R0900_P1_MODCODLSTE, 0xff); 943 } else if (intp->chip_id >= 0x12) {
957 stv0900_write_reg(i_params, R0900_P1_MODCODLSTF, 0xcf); 944 for (reg_index = 0; reg_index < 7; reg_index++)
958 for (reg_index = 0; reg_index < 8; reg_index++) 945 stv0900_write_reg(intp, MODCODLST0 + reg_index, 0xff);
959 stv0900_write_reg(i_params, R0900_P1_MODCODLST7 + reg_index, 0xcc);
960 946
961 break; 947 stv0900_write_reg(intp, MODCODLSTE, 0xff);
962 case STV0900_DEMOD_2: 948 stv0900_write_reg(intp, MODCODLSTF, 0xcf);
963 for (reg_index = 0; reg_index < 7; reg_index++) 949 for (reg_index = 0; reg_index < 8; reg_index++)
964 stv0900_write_reg(i_params, R0900_P2_MODCODLST0 + reg_index, 0xff); 950 stv0900_write_reg(intp, MODCODLST7 + reg_index, 0xcc);
965 951
966 stv0900_write_reg(i_params, R0900_P2_MODCODLSTE, 0xff);
967 stv0900_write_reg(i_params, R0900_P2_MODCODLSTF, 0xcf);
968 for (reg_index = 0; reg_index < 8; reg_index++)
969 stv0900_write_reg(i_params, R0900_P2_MODCODLST7 + reg_index, 0xcc);
970
971 break;
972 }
973 952
974 } 953 }
975} 954}
976 955
977void stv0900_activate_s2_modcode_single(struct stv0900_internal *i_params, 956void stv0900_activate_s2_modcod_single(struct stv0900_internal *intp,
978 enum fe_stv0900_demod_num demod) 957 enum fe_stv0900_demod_num demod)
979{ 958{
980 u32 reg_index; 959 u32 reg_index;
981 960
982 dprintk(KERN_INFO "%s\n", __func__); 961 dprintk("%s\n", __func__);
983
984 switch (demod) {
985 case STV0900_DEMOD_1:
986 default:
987 stv0900_write_reg(i_params, R0900_P1_MODCODLST0, 0xff);
988 stv0900_write_reg(i_params, R0900_P1_MODCODLST1, 0xf0);
989 stv0900_write_reg(i_params, R0900_P1_MODCODLSTF, 0x0f);
990 for (reg_index = 0; reg_index < 13; reg_index++)
991 stv0900_write_reg(i_params,
992 R0900_P1_MODCODLST2 + reg_index, 0);
993 962
994 break; 963 stv0900_write_reg(intp, MODCODLST0, 0xff);
995 case STV0900_DEMOD_2: 964 stv0900_write_reg(intp, MODCODLST1, 0xf0);
996 stv0900_write_reg(i_params, R0900_P2_MODCODLST0, 0xff); 965 stv0900_write_reg(intp, MODCODLSTF, 0x0f);
997 stv0900_write_reg(i_params, R0900_P2_MODCODLST1, 0xf0); 966 for (reg_index = 0; reg_index < 13; reg_index++)
998 stv0900_write_reg(i_params, R0900_P2_MODCODLSTF, 0x0f); 967 stv0900_write_reg(intp, MODCODLST2 + reg_index, 0);
999 for (reg_index = 0; reg_index < 13; reg_index++)
1000 stv0900_write_reg(i_params,
1001 R0900_P2_MODCODLST2 + reg_index, 0);
1002 968
1003 break;
1004 }
1005} 969}
1006 970
1007static enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe) 971static enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe)
@@ -1012,7 +976,7 @@ static enum dvbfe_algo stv0900_frontend_algo(struct dvb_frontend *fe)
1012static int stb0900_set_property(struct dvb_frontend *fe, 976static int stb0900_set_property(struct dvb_frontend *fe,
1013 struct dtv_property *tvp) 977 struct dtv_property *tvp)
1014{ 978{
1015 dprintk(KERN_INFO "%s(..)\n", __func__); 979 dprintk("%s(..)\n", __func__);
1016 980
1017 return 0; 981 return 0;
1018} 982}
@@ -1020,166 +984,123 @@ static int stb0900_set_property(struct dvb_frontend *fe,
1020static int stb0900_get_property(struct dvb_frontend *fe, 984static int stb0900_get_property(struct dvb_frontend *fe,
1021 struct dtv_property *tvp) 985 struct dtv_property *tvp)
1022{ 986{
1023 dprintk(KERN_INFO "%s(..)\n", __func__); 987 dprintk("%s(..)\n", __func__);
1024 988
1025 return 0; 989 return 0;
1026} 990}
1027 991
1028void stv0900_start_search(struct stv0900_internal *i_params, 992void stv0900_start_search(struct stv0900_internal *intp,
1029 enum fe_stv0900_demod_num demod) 993 enum fe_stv0900_demod_num demod)
1030{ 994{
1031 995 u32 freq;
1032 switch (demod) { 996 s16 freq_s16 ;
1033 case STV0900_DEMOD_1: 997
1034 default: 998 stv0900_write_bits(intp, DEMOD_MODE, 0x1f);
1035 stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x1f); 999 if (intp->chip_id == 0x10)
1036 1000 stv0900_write_reg(intp, CORRELEXP, 0xaa);
1037 if (i_params->chip_id == 0x10) 1001
1038 stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0xaa); 1002 if (intp->chip_id < 0x20)
1039 1003 stv0900_write_reg(intp, CARHDR, 0x55);
1040 if (i_params->chip_id < 0x20) 1004
1041 stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x55); 1005 if (intp->chip_id <= 0x20) {
1042 1006 if (intp->symbol_rate[0] <= 5000000) {
1043 if (i_params->dmd1_symbol_rate <= 5000000) { 1007 stv0900_write_reg(intp, CARCFG, 0x44);
1044 stv0900_write_reg(i_params, R0900_P1_CARCFG, 0x44); 1008 stv0900_write_reg(intp, CFRUP1, 0x0f);
1045 stv0900_write_reg(i_params, R0900_P1_CFRUP1, 0x0f); 1009 stv0900_write_reg(intp, CFRUP0, 0xff);
1046 stv0900_write_reg(i_params, R0900_P1_CFRUP0, 0xff); 1010 stv0900_write_reg(intp, CFRLOW1, 0xf0);
1047 stv0900_write_reg(i_params, R0900_P1_CFRLOW1, 0xf0); 1011 stv0900_write_reg(intp, CFRLOW0, 0x00);
1048 stv0900_write_reg(i_params, R0900_P1_CFRLOW0, 0x00); 1012 stv0900_write_reg(intp, RTCS2, 0x68);
1049 stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x68);
1050 } else { 1013 } else {
1051 stv0900_write_reg(i_params, R0900_P1_CARCFG, 0xc4); 1014 stv0900_write_reg(intp, CARCFG, 0xc4);
1052 stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x44); 1015 stv0900_write_reg(intp, RTCS2, 0x44);
1053 } 1016 }
1054 1017
1055 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0); 1018 } else { /*cut 3.0 above*/
1056 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0); 1019 if (intp->symbol_rate[demod] <= 5000000)
1057 1020 stv0900_write_reg(intp, RTCS2, 0x68);
1058 if (i_params->chip_id >= 0x20) { 1021 else
1059 stv0900_write_reg(i_params, R0900_P1_EQUALCFG, 0x41); 1022 stv0900_write_reg(intp, RTCS2, 0x44);
1060 stv0900_write_reg(i_params, R0900_P1_FFECFG, 0x41);
1061
1062 if ((i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS1) || (i_params->dmd1_srch_standard == STV0900_SEARCH_DSS) || (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH)) {
1063 stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x82);
1064 stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0);
1065 }
1066 }
1067
1068 stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x00);
1069 stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0xe0);
1070 stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0xc0);
1071 stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 0);
1072 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
1073 stv0900_write_bits(i_params, F0900_P1_S1S2_SEQUENTIAL, 0);
1074 stv0900_write_reg(i_params, R0900_P1_RTC, 0x88);
1075 if (i_params->chip_id >= 0x20) {
1076 if (i_params->dmd1_symbol_rate < 2000000) {
1077 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x39);
1078 stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x40);
1079 }
1080
1081 if (i_params->dmd1_symbol_rate < 10000000) {
1082 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x4c);
1083 stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x20);
1084 } else {
1085 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x4b);
1086 stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x20);
1087 }
1088 1023
1024 stv0900_write_reg(intp, CARCFG, 0x46);
1025 if (intp->srch_algo[demod] == STV0900_WARM_START) {
1026 freq = 1000 << 16;
1027 freq /= (intp->mclk / 1000);
1028 freq_s16 = (s16)freq;
1089 } else { 1029 } else {
1090 if (i_params->dmd1_symbol_rate < 10000000) 1030 freq = (intp->srch_range[demod] / 2000);
1091 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xef); 1031 if (intp->symbol_rate[demod] <= 5000000)
1032 freq += 80;
1092 else 1033 else
1093 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed); 1034 freq += 600;
1094 }
1095 1035
1096 switch (i_params->dmd1_srch_algo) { 1036 freq = freq << 16;
1097 case STV0900_WARM_START: 1037 freq /= (intp->mclk / 1000);
1098 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f); 1038 freq_s16 = (s16)freq;
1099 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
1100 break;
1101 case STV0900_COLD_START:
1102 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f);
1103 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15);
1104 break;
1105 default:
1106 break;
1107 } 1039 }
1108 1040
1109 break; 1041 stv0900_write_bits(intp, CFR_UP1, MSB(freq_s16));
1110 case STV0900_DEMOD_2: 1042 stv0900_write_bits(intp, CFR_UP0, LSB(freq_s16));
1111 stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x1f); 1043 freq_s16 *= (-1);
1112 if (i_params->chip_id == 0x10) 1044 stv0900_write_bits(intp, CFR_LOW1, MSB(freq_s16));
1113 stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0xaa); 1045 stv0900_write_bits(intp, CFR_LOW0, LSB(freq_s16));
1114 1046 }
1115 if (i_params->chip_id < 0x20)
1116 stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x55);
1117
1118 if (i_params->dmd2_symbol_rate <= 5000000) {
1119 stv0900_write_reg(i_params, R0900_P2_CARCFG, 0x44);
1120 stv0900_write_reg(i_params, R0900_P2_CFRUP1, 0x0f);
1121 stv0900_write_reg(i_params, R0900_P2_CFRUP0, 0xff);
1122 stv0900_write_reg(i_params, R0900_P2_CFRLOW1, 0xf0);
1123 stv0900_write_reg(i_params, R0900_P2_CFRLOW0, 0x00);
1124 stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x68);
1125 } else {
1126 stv0900_write_reg(i_params, R0900_P2_CARCFG, 0xc4);
1127 stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x44);
1128 }
1129 1047
1130 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0); 1048 stv0900_write_reg(intp, CFRINIT1, 0);
1131 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0); 1049 stv0900_write_reg(intp, CFRINIT0, 0);
1132 1050
1133 if (i_params->chip_id >= 0x20) { 1051 if (intp->chip_id >= 0x20) {
1134 stv0900_write_reg(i_params, R0900_P2_EQUALCFG, 0x41); 1052 stv0900_write_reg(intp, EQUALCFG, 0x41);
1135 stv0900_write_reg(i_params, R0900_P2_FFECFG, 0x41); 1053 stv0900_write_reg(intp, FFECFG, 0x41);
1136 if ((i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS1) || (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DSS) || (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH)) {
1137 stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x82);
1138 stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0);
1139 }
1140 }
1141 1054
1142 stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x00); 1055 if ((intp->srch_standard[demod] == STV0900_SEARCH_DVBS1) ||
1143 stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0xe0); 1056 (intp->srch_standard[demod] == STV0900_SEARCH_DSS) ||
1144 stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0xc0); 1057 (intp->srch_standard[demod] == STV0900_AUTO_SEARCH)) {
1145 stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 0); 1058 stv0900_write_reg(intp, VITSCALE,
1146 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); 1059 0x82);
1147 stv0900_write_bits(i_params, F0900_P2_S1S2_SEQUENTIAL, 0); 1060 stv0900_write_reg(intp, VAVSRVIT, 0x0);
1148 stv0900_write_reg(i_params, R0900_P2_RTC, 0x88); 1061 }
1149 if (i_params->chip_id >= 0x20) { 1062 }
1150 if (i_params->dmd2_symbol_rate < 2000000) {
1151 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x39);
1152 stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x40);
1153 }
1154
1155 if (i_params->dmd2_symbol_rate < 10000000) {
1156 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x4c);
1157 stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x20);
1158 } else {
1159 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x4b);
1160 stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x20);
1161 }
1162 1063
1064 stv0900_write_reg(intp, SFRSTEP, 0x00);
1065 stv0900_write_reg(intp, TMGTHRISE, 0xe0);
1066 stv0900_write_reg(intp, TMGTHFALL, 0xc0);
1067 stv0900_write_bits(intp, SCAN_ENABLE, 0);
1068 stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
1069 stv0900_write_bits(intp, S1S2_SEQUENTIAL, 0);
1070 stv0900_write_reg(intp, RTC, 0x88);
1071 if (intp->chip_id >= 0x20) {
1072 if (intp->symbol_rate[demod] < 2000000) {
1073 if (intp->chip_id <= 0x20)
1074 stv0900_write_reg(intp, CARFREQ, 0x39);
1075 else /*cut 3.0*/
1076 stv0900_write_reg(intp, CARFREQ, 0x89);
1077
1078 stv0900_write_reg(intp, CARHDR, 0x40);
1079 } else if (intp->symbol_rate[demod] < 10000000) {
1080 stv0900_write_reg(intp, CARFREQ, 0x4c);
1081 stv0900_write_reg(intp, CARHDR, 0x20);
1163 } else { 1082 } else {
1164 if (i_params->dmd2_symbol_rate < 10000000) 1083 stv0900_write_reg(intp, CARFREQ, 0x4b);
1165 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xef); 1084 stv0900_write_reg(intp, CARHDR, 0x20);
1166 else
1167 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed);
1168 } 1085 }
1169 1086
1170 switch (i_params->dmd2_srch_algo) { 1087 } else {
1171 case STV0900_WARM_START: 1088 if (intp->symbol_rate[demod] < 10000000)
1172 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f); 1089 stv0900_write_reg(intp, CARFREQ, 0xef);
1173 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); 1090 else
1174 break; 1091 stv0900_write_reg(intp, CARFREQ, 0xed);
1175 case STV0900_COLD_START: 1092 }
1176 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f);
1177 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15);
1178 break;
1179 default:
1180 break;
1181 }
1182 1093
1094 switch (intp->srch_algo[demod]) {
1095 case STV0900_WARM_START:
1096 stv0900_write_reg(intp, DMDISTATE, 0x1f);
1097 stv0900_write_reg(intp, DMDISTATE, 0x18);
1098 break;
1099 case STV0900_COLD_START:
1100 stv0900_write_reg(intp, DMDISTATE, 0x1f);
1101 stv0900_write_reg(intp, DMDISTATE, 0x15);
1102 break;
1103 default:
1183 break; 1104 break;
1184 } 1105 }
1185} 1106}
@@ -1188,33 +1109,40 @@ u8 stv0900_get_optim_carr_loop(s32 srate, enum fe_stv0900_modcode modcode,
1188 s32 pilot, u8 chip_id) 1109 s32 pilot, u8 chip_id)
1189{ 1110{
1190 u8 aclc_value = 0x29; 1111 u8 aclc_value = 0x29;
1191 s32 i; 1112 s32 i;
1192 const struct stv0900_car_loop_optim *car_loop_s2; 1113 const struct stv0900_car_loop_optim *cls2, *cllqs2, *cllas2;
1193 1114
1194 dprintk(KERN_INFO "%s\n", __func__); 1115 dprintk("%s\n", __func__);
1195 1116
1196 if (chip_id <= 0x12) 1117 if (chip_id <= 0x12) {
1197 car_loop_s2 = FE_STV0900_S2CarLoop; 1118 cls2 = FE_STV0900_S2CarLoop;
1198 else if (chip_id == 0x20) 1119 cllqs2 = FE_STV0900_S2LowQPCarLoopCut30;
1199 car_loop_s2 = FE_STV0900_S2CarLoopCut20; 1120 cllas2 = FE_STV0900_S2APSKCarLoopCut30;
1200 else 1121 } else if (chip_id == 0x20) {
1201 car_loop_s2 = FE_STV0900_S2CarLoop; 1122 cls2 = FE_STV0900_S2CarLoopCut20;
1123 cllqs2 = FE_STV0900_S2LowQPCarLoopCut20;
1124 cllas2 = FE_STV0900_S2APSKCarLoopCut20;
1125 } else {
1126 cls2 = FE_STV0900_S2CarLoopCut30;
1127 cllqs2 = FE_STV0900_S2LowQPCarLoopCut30;
1128 cllas2 = FE_STV0900_S2APSKCarLoopCut30;
1129 }
1202 1130
1203 if (modcode < STV0900_QPSK_12) { 1131 if (modcode < STV0900_QPSK_12) {
1204 i = 0; 1132 i = 0;
1205 while ((i < 3) && (modcode != FE_STV0900_S2LowQPCarLoopCut20[i].modcode)) 1133 while ((i < 3) && (modcode != cllqs2[i].modcode))
1206 i++; 1134 i++;
1207 1135
1208 if (i >= 3) 1136 if (i >= 3)
1209 i = 2; 1137 i = 2;
1210 } else { 1138 } else {
1211 i = 0; 1139 i = 0;
1212 while ((i < 14) && (modcode != car_loop_s2[i].modcode)) 1140 while ((i < 14) && (modcode != cls2[i].modcode))
1213 i++; 1141 i++;
1214 1142
1215 if (i >= 14) { 1143 if (i >= 14) {
1216 i = 0; 1144 i = 0;
1217 while ((i < 11) && (modcode != FE_STV0900_S2APSKCarLoopCut20[i].modcode)) 1145 while ((i < 11) && (modcode != cllas2[i].modcode))
1218 i++; 1146 i++;
1219 1147
1220 if (i >= 11) 1148 if (i >= 11)
@@ -1225,76 +1153,82 @@ u8 stv0900_get_optim_carr_loop(s32 srate, enum fe_stv0900_modcode modcode,
1225 if (modcode <= STV0900_QPSK_25) { 1153 if (modcode <= STV0900_QPSK_25) {
1226 if (pilot) { 1154 if (pilot) {
1227 if (srate <= 3000000) 1155 if (srate <= 3000000)
1228 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_2; 1156 aclc_value = cllqs2[i].car_loop_pilots_on_2;
1229 else if (srate <= 7000000) 1157 else if (srate <= 7000000)
1230 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_5; 1158 aclc_value = cllqs2[i].car_loop_pilots_on_5;
1231 else if (srate <= 15000000) 1159 else if (srate <= 15000000)
1232 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_10; 1160 aclc_value = cllqs2[i].car_loop_pilots_on_10;
1233 else if (srate <= 25000000) 1161 else if (srate <= 25000000)
1234 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_20; 1162 aclc_value = cllqs2[i].car_loop_pilots_on_20;
1235 else 1163 else
1236 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_on_30; 1164 aclc_value = cllqs2[i].car_loop_pilots_on_30;
1237 } else { 1165 } else {
1238 if (srate <= 3000000) 1166 if (srate <= 3000000)
1239 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_2; 1167 aclc_value = cllqs2[i].car_loop_pilots_off_2;
1240 else if (srate <= 7000000) 1168 else if (srate <= 7000000)
1241 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_5; 1169 aclc_value = cllqs2[i].car_loop_pilots_off_5;
1242 else if (srate <= 15000000) 1170 else if (srate <= 15000000)
1243 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_10; 1171 aclc_value = cllqs2[i].car_loop_pilots_off_10;
1244 else if (srate <= 25000000) 1172 else if (srate <= 25000000)
1245 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_20; 1173 aclc_value = cllqs2[i].car_loop_pilots_off_20;
1246 else 1174 else
1247 aclc_value = FE_STV0900_S2LowQPCarLoopCut20[i].car_loop_pilots_off_30; 1175 aclc_value = cllqs2[i].car_loop_pilots_off_30;
1248 } 1176 }
1249 1177
1250 } else if (modcode <= STV0900_8PSK_910) { 1178 } else if (modcode <= STV0900_8PSK_910) {
1251 if (pilot) { 1179 if (pilot) {
1252 if (srate <= 3000000) 1180 if (srate <= 3000000)
1253 aclc_value = car_loop_s2[i].car_loop_pilots_on_2; 1181 aclc_value = cls2[i].car_loop_pilots_on_2;
1254 else if (srate <= 7000000) 1182 else if (srate <= 7000000)
1255 aclc_value = car_loop_s2[i].car_loop_pilots_on_5; 1183 aclc_value = cls2[i].car_loop_pilots_on_5;
1256 else if (srate <= 15000000) 1184 else if (srate <= 15000000)
1257 aclc_value = car_loop_s2[i].car_loop_pilots_on_10; 1185 aclc_value = cls2[i].car_loop_pilots_on_10;
1258 else if (srate <= 25000000) 1186 else if (srate <= 25000000)
1259 aclc_value = car_loop_s2[i].car_loop_pilots_on_20; 1187 aclc_value = cls2[i].car_loop_pilots_on_20;
1260 else 1188 else
1261 aclc_value = car_loop_s2[i].car_loop_pilots_on_30; 1189 aclc_value = cls2[i].car_loop_pilots_on_30;
1262 } else { 1190 } else {
1263 if (srate <= 3000000) 1191 if (srate <= 3000000)
1264 aclc_value = car_loop_s2[i].car_loop_pilots_off_2; 1192 aclc_value = cls2[i].car_loop_pilots_off_2;
1265 else if (srate <= 7000000) 1193 else if (srate <= 7000000)
1266 aclc_value = car_loop_s2[i].car_loop_pilots_off_5; 1194 aclc_value = cls2[i].car_loop_pilots_off_5;
1267 else if (srate <= 15000000) 1195 else if (srate <= 15000000)
1268 aclc_value = car_loop_s2[i].car_loop_pilots_off_10; 1196 aclc_value = cls2[i].car_loop_pilots_off_10;
1269 else if (srate <= 25000000) 1197 else if (srate <= 25000000)
1270 aclc_value = car_loop_s2[i].car_loop_pilots_off_20; 1198 aclc_value = cls2[i].car_loop_pilots_off_20;
1271 else 1199 else
1272 aclc_value = car_loop_s2[i].car_loop_pilots_off_30; 1200 aclc_value = cls2[i].car_loop_pilots_off_30;
1273 } 1201 }
1274 1202
1275 } else { 1203 } else {
1276 if (srate <= 3000000) 1204 if (srate <= 3000000)
1277 aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_2; 1205 aclc_value = cllas2[i].car_loop_pilots_on_2;
1278 else if (srate <= 7000000) 1206 else if (srate <= 7000000)
1279 aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_5; 1207 aclc_value = cllas2[i].car_loop_pilots_on_5;
1280 else if (srate <= 15000000) 1208 else if (srate <= 15000000)
1281 aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_10; 1209 aclc_value = cllas2[i].car_loop_pilots_on_10;
1282 else if (srate <= 25000000) 1210 else if (srate <= 25000000)
1283 aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_20; 1211 aclc_value = cllas2[i].car_loop_pilots_on_20;
1284 else 1212 else
1285 aclc_value = FE_STV0900_S2APSKCarLoopCut20[i].car_loop_pilots_on_30; 1213 aclc_value = cllas2[i].car_loop_pilots_on_30;
1286 } 1214 }
1287 1215
1288 return aclc_value; 1216 return aclc_value;
1289} 1217}
1290 1218
1291u8 stv0900_get_optim_short_carr_loop(s32 srate, enum fe_stv0900_modulation modulation, u8 chip_id) 1219u8 stv0900_get_optim_short_carr_loop(s32 srate,
1220 enum fe_stv0900_modulation modulation,
1221 u8 chip_id)
1292{ 1222{
1223 const struct stv0900_short_frames_car_loop_optim *s2scl;
1224 const struct stv0900_short_frames_car_loop_optim_vs_mod *s2sclc30;
1293 s32 mod_index = 0; 1225 s32 mod_index = 0;
1294
1295 u8 aclc_value = 0x0b; 1226 u8 aclc_value = 0x0b;
1296 1227
1297 dprintk(KERN_INFO "%s\n", __func__); 1228 dprintk("%s\n", __func__);
1229
1230 s2scl = FE_STV0900_S2ShortCarLoop;
1231 s2sclc30 = FE_STV0900_S2ShortCarLoopCut30;
1298 1232
1299 switch (modulation) { 1233 switch (modulation) {
1300 case STV0900_QPSK: 1234 case STV0900_QPSK:
@@ -1312,75 +1246,116 @@ u8 stv0900_get_optim_short_carr_loop(s32 srate, enum fe_stv0900_modulation modul
1312 break; 1246 break;
1313 } 1247 }
1314 1248
1315 switch (chip_id) { 1249 if (chip_id >= 0x30) {
1316 case 0x20:
1317 if (srate <= 3000000) 1250 if (srate <= 3000000)
1318 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_2; 1251 aclc_value = s2sclc30[mod_index].car_loop_2;
1319 else if (srate <= 7000000) 1252 else if (srate <= 7000000)
1320 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_5; 1253 aclc_value = s2sclc30[mod_index].car_loop_5;
1321 else if (srate <= 15000000) 1254 else if (srate <= 15000000)
1322 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_10; 1255 aclc_value = s2sclc30[mod_index].car_loop_10;
1323 else if (srate <= 25000000) 1256 else if (srate <= 25000000)
1324 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_20; 1257 aclc_value = s2sclc30[mod_index].car_loop_20;
1325 else 1258 else
1326 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut20_30; 1259 aclc_value = s2sclc30[mod_index].car_loop_30;
1327 1260
1328 break; 1261 } else if (chip_id >= 0x20) {
1329 case 0x12:
1330 default:
1331 if (srate <= 3000000) 1262 if (srate <= 3000000)
1332 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_2; 1263 aclc_value = s2scl[mod_index].car_loop_cut20_2;
1333 else if (srate <= 7000000) 1264 else if (srate <= 7000000)
1334 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_5; 1265 aclc_value = s2scl[mod_index].car_loop_cut20_5;
1335 else if (srate <= 15000000) 1266 else if (srate <= 15000000)
1336 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_10; 1267 aclc_value = s2scl[mod_index].car_loop_cut20_10;
1337 else if (srate <= 25000000) 1268 else if (srate <= 25000000)
1338 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_20; 1269 aclc_value = s2scl[mod_index].car_loop_cut20_20;
1339 else 1270 else
1340 aclc_value = FE_STV0900_S2ShortCarLoop[mod_index].car_loop_cut12_30; 1271 aclc_value = s2scl[mod_index].car_loop_cut20_30;
1272
1273 } else {
1274 if (srate <= 3000000)
1275 aclc_value = s2scl[mod_index].car_loop_cut12_2;
1276 else if (srate <= 7000000)
1277 aclc_value = s2scl[mod_index].car_loop_cut12_5;
1278 else if (srate <= 15000000)
1279 aclc_value = s2scl[mod_index].car_loop_cut12_10;
1280 else if (srate <= 25000000)
1281 aclc_value = s2scl[mod_index].car_loop_cut12_20;
1282 else
1283 aclc_value = s2scl[mod_index].car_loop_cut12_30;
1341 1284
1342 break;
1343 } 1285 }
1344 1286
1345 return aclc_value; 1287 return aclc_value;
1346} 1288}
1347 1289
1348static enum fe_stv0900_error stv0900_st_dvbs2_single(struct stv0900_internal *i_params, 1290static
1291enum fe_stv0900_error stv0900_st_dvbs2_single(struct stv0900_internal *intp,
1349 enum fe_stv0900_demod_mode LDPC_Mode, 1292 enum fe_stv0900_demod_mode LDPC_Mode,
1350 enum fe_stv0900_demod_num demod) 1293 enum fe_stv0900_demod_num demod)
1351{ 1294{
1352 enum fe_stv0900_error error = STV0900_NO_ERROR; 1295 enum fe_stv0900_error error = STV0900_NO_ERROR;
1296 s32 reg_ind;
1353 1297
1354 dprintk(KERN_INFO "%s\n", __func__); 1298 dprintk("%s\n", __func__);
1355 1299
1356 switch (LDPC_Mode) { 1300 switch (LDPC_Mode) {
1357 case STV0900_DUAL: 1301 case STV0900_DUAL:
1358 default: 1302 default:
1359 if ((i_params->demod_mode != STV0900_DUAL) 1303 if ((intp->demod_mode != STV0900_DUAL)
1360 || (stv0900_get_bits(i_params, F0900_DDEMOD) != 1)) { 1304 || (stv0900_get_bits(intp, F0900_DDEMOD) != 1)) {
1361 stv0900_write_reg(i_params, R0900_GENCFG, 0x1d); 1305 stv0900_write_reg(intp, R0900_GENCFG, 0x1d);
1362 1306
1363 i_params->demod_mode = STV0900_DUAL; 1307 intp->demod_mode = STV0900_DUAL;
1364 1308
1365 stv0900_write_bits(i_params, F0900_FRESFEC, 1); 1309 stv0900_write_bits(intp, F0900_FRESFEC, 1);
1366 stv0900_write_bits(i_params, F0900_FRESFEC, 0); 1310 stv0900_write_bits(intp, F0900_FRESFEC, 0);
1311
1312 for (reg_ind = 0; reg_ind < 7; reg_ind++)
1313 stv0900_write_reg(intp,
1314 R0900_P1_MODCODLST0 + reg_ind,
1315 0xff);
1316 for (reg_ind = 0; reg_ind < 8; reg_ind++)
1317 stv0900_write_reg(intp,
1318 R0900_P1_MODCODLST7 + reg_ind,
1319 0xcc);
1320
1321 stv0900_write_reg(intp, R0900_P1_MODCODLSTE, 0xff);
1322 stv0900_write_reg(intp, R0900_P1_MODCODLSTF, 0xcf);
1323
1324 for (reg_ind = 0; reg_ind < 7; reg_ind++)
1325 stv0900_write_reg(intp,
1326 R0900_P2_MODCODLST0 + reg_ind,
1327 0xff);
1328 for (reg_ind = 0; reg_ind < 8; reg_ind++)
1329 stv0900_write_reg(intp,
1330 R0900_P2_MODCODLST7 + reg_ind,
1331 0xcc);
1332
1333 stv0900_write_reg(intp, R0900_P2_MODCODLSTE, 0xff);
1334 stv0900_write_reg(intp, R0900_P2_MODCODLSTF, 0xcf);
1367 } 1335 }
1368 1336
1369 break; 1337 break;
1370 case STV0900_SINGLE: 1338 case STV0900_SINGLE:
1371 if (demod == STV0900_DEMOD_2) 1339 if (demod == STV0900_DEMOD_2) {
1372 stv0900_write_reg(i_params, R0900_GENCFG, 0x06); 1340 stv0900_stop_all_s2_modcod(intp, STV0900_DEMOD_1);
1373 else 1341 stv0900_activate_s2_modcod_single(intp,
1374 stv0900_write_reg(i_params, R0900_GENCFG, 0x04); 1342 STV0900_DEMOD_2);
1343 stv0900_write_reg(intp, R0900_GENCFG, 0x06);
1344 } else {
1345 stv0900_stop_all_s2_modcod(intp, STV0900_DEMOD_2);
1346 stv0900_activate_s2_modcod_single(intp,
1347 STV0900_DEMOD_1);
1348 stv0900_write_reg(intp, R0900_GENCFG, 0x04);
1349 }
1375 1350
1376 i_params->demod_mode = STV0900_SINGLE; 1351 intp->demod_mode = STV0900_SINGLE;
1377 1352
1378 stv0900_write_bits(i_params, F0900_FRESFEC, 1); 1353 stv0900_write_bits(intp, F0900_FRESFEC, 1);
1379 stv0900_write_bits(i_params, F0900_FRESFEC, 0); 1354 stv0900_write_bits(intp, F0900_FRESFEC, 0);
1380 stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 1); 1355 stv0900_write_bits(intp, F0900_P1_ALGOSWRST, 1);
1381 stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 0); 1356 stv0900_write_bits(intp, F0900_P1_ALGOSWRST, 0);
1382 stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 1); 1357 stv0900_write_bits(intp, F0900_P2_ALGOSWRST, 1);
1383 stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 0); 1358 stv0900_write_bits(intp, F0900_P2_ALGOSWRST, 0);
1384 break; 1359 break;
1385 } 1360 }
1386 1361
@@ -1393,131 +1368,178 @@ static enum fe_stv0900_error stv0900_init_internal(struct dvb_frontend *fe,
1393 struct stv0900_state *state = fe->demodulator_priv; 1368 struct stv0900_state *state = fe->demodulator_priv;
1394 enum fe_stv0900_error error = STV0900_NO_ERROR; 1369 enum fe_stv0900_error error = STV0900_NO_ERROR;
1395 enum fe_stv0900_error demodError = STV0900_NO_ERROR; 1370 enum fe_stv0900_error demodError = STV0900_NO_ERROR;
1371 struct stv0900_internal *intp = NULL;
1396 int selosci, i; 1372 int selosci, i;
1397 1373
1398 struct stv0900_inode *temp_int = find_inode(state->i2c_adap, 1374 struct stv0900_inode *temp_int = find_inode(state->i2c_adap,
1399 state->config->demod_address); 1375 state->config->demod_address);
1400 1376
1401 dprintk(KERN_INFO "%s\n", __func__); 1377 dprintk("%s\n", __func__);
1402 1378
1403 if (temp_int != NULL) { 1379 if ((temp_int != NULL) && (p_init->demod_mode == STV0900_DUAL)) {
1404 state->internal = temp_int->internal; 1380 state->internal = temp_int->internal;
1405 (state->internal->dmds_used)++; 1381 (state->internal->dmds_used)++;
1406 dprintk(KERN_INFO "%s: Find Internal Structure!\n", __func__); 1382 dprintk("%s: Find Internal Structure!\n", __func__);
1407 return STV0900_NO_ERROR; 1383 return STV0900_NO_ERROR;
1408 } else { 1384 } else {
1409 state->internal = kmalloc(sizeof(struct stv0900_internal), GFP_KERNEL); 1385 state->internal = kmalloc(sizeof(struct stv0900_internal),
1386 GFP_KERNEL);
1387 if (state->internal == NULL)
1388 return STV0900_INVALID_HANDLE;
1410 temp_int = append_internal(state->internal); 1389 temp_int = append_internal(state->internal);
1390 if (temp_int == NULL) {
1391 kfree(state->internal);
1392 state->internal = NULL;
1393 return STV0900_INVALID_HANDLE;
1394 }
1411 state->internal->dmds_used = 1; 1395 state->internal->dmds_used = 1;
1412 state->internal->i2c_adap = state->i2c_adap; 1396 state->internal->i2c_adap = state->i2c_adap;
1413 state->internal->i2c_addr = state->config->demod_address; 1397 state->internal->i2c_addr = state->config->demod_address;
1414 state->internal->clkmode = state->config->clkmode; 1398 state->internal->clkmode = state->config->clkmode;
1415 state->internal->errs = STV0900_NO_ERROR; 1399 state->internal->errs = STV0900_NO_ERROR;
1416 dprintk(KERN_INFO "%s: Create New Internal Structure!\n", __func__); 1400 dprintk("%s: Create New Internal Structure!\n", __func__);
1417 } 1401 }
1418 1402
1419 if (state->internal != NULL) { 1403 if (state->internal == NULL) {
1420 demodError = stv0900_initialize(state->internal); 1404 error = STV0900_INVALID_HANDLE;
1421 if (demodError == STV0900_NO_ERROR) { 1405 return error;
1422 error = STV0900_NO_ERROR; 1406 }
1423 } else {
1424 if (demodError == STV0900_INVALID_HANDLE)
1425 error = STV0900_INVALID_HANDLE;
1426 else
1427 error = STV0900_I2C_ERROR;
1428 }
1429 1407
1430 if (state->internal != NULL) { 1408 demodError = stv0900_initialize(state->internal);
1431 if (error == STV0900_NO_ERROR) { 1409 if (demodError == STV0900_NO_ERROR) {
1432 state->internal->demod_mode = p_init->demod_mode; 1410 error = STV0900_NO_ERROR;
1433 1411 } else {
1434 stv0900_st_dvbs2_single(state->internal, state->internal->demod_mode, STV0900_DEMOD_1); 1412 if (demodError == STV0900_INVALID_HANDLE)
1435 1413 error = STV0900_INVALID_HANDLE;
1436 state->internal->chip_id = stv0900_read_reg(state->internal, R0900_MID); 1414 else
1437 state->internal->rolloff = p_init->rolloff; 1415 error = STV0900_I2C_ERROR;
1438 state->internal->quartz = p_init->dmd_ref_clk;
1439
1440 stv0900_write_bits(state->internal, F0900_P1_ROLLOFF_CONTROL, p_init->rolloff);
1441 stv0900_write_bits(state->internal, F0900_P2_ROLLOFF_CONTROL, p_init->rolloff);
1442
1443 state->internal->ts_config = p_init->ts_config;
1444 if (state->internal->ts_config == NULL)
1445 stv0900_set_ts_parallel_serial(state->internal,
1446 p_init->path1_ts_clock,
1447 p_init->path2_ts_clock);
1448 else {
1449 for (i = 0; state->internal->ts_config[i].addr != 0xffff; i++)
1450 stv0900_write_reg(state->internal,
1451 state->internal->ts_config[i].addr,
1452 state->internal->ts_config[i].val);
1453
1454 stv0900_write_bits(state->internal, F0900_P2_RST_HWARE, 1);
1455 stv0900_write_bits(state->internal, F0900_P2_RST_HWARE, 0);
1456 stv0900_write_bits(state->internal, F0900_P1_RST_HWARE, 1);
1457 stv0900_write_bits(state->internal, F0900_P1_RST_HWARE, 0);
1458 }
1459 1416
1460 stv0900_write_bits(state->internal, F0900_P1_TUN_MADDRESS, p_init->tun1_maddress); 1417 return error;
1461 switch (p_init->tuner1_adc) { 1418 }
1462 case 1:
1463 stv0900_write_reg(state->internal, R0900_TSTTNR1, 0x26);
1464 break;
1465 default:
1466 break;
1467 }
1468 1419
1469 stv0900_write_bits(state->internal, F0900_P2_TUN_MADDRESS, p_init->tun2_maddress); 1420 intp = state->internal;
1470 switch (p_init->tuner2_adc) {
1471 case 1:
1472 stv0900_write_reg(state->internal, R0900_TSTTNR3, 0x26);
1473 break;
1474 default:
1475 break;
1476 }
1477 1421
1478 stv0900_write_bits(state->internal, F0900_P1_TUN_IQSWAP, p_init->tun1_iq_inversion); 1422 intp->demod_mode = p_init->demod_mode;
1479 stv0900_write_bits(state->internal, F0900_P2_TUN_IQSWAP, p_init->tun2_iq_inversion); 1423 stv0900_st_dvbs2_single(intp, intp->demod_mode, STV0900_DEMOD_1);
1480 stv0900_set_mclk(state->internal, 135000000); 1424 intp->chip_id = stv0900_read_reg(intp, R0900_MID);
1481 msleep(3); 1425 intp->rolloff = p_init->rolloff;
1482 1426 intp->quartz = p_init->dmd_ref_clk;
1483 switch (state->internal->clkmode) {
1484 case 0:
1485 case 2:
1486 stv0900_write_reg(state->internal, R0900_SYNTCTRL, 0x20 | state->internal->clkmode);
1487 break;
1488 default:
1489 selosci = 0x02 & stv0900_read_reg(state->internal, R0900_SYNTCTRL);
1490 stv0900_write_reg(state->internal, R0900_SYNTCTRL, 0x20 | selosci);
1491 break;
1492 }
1493 msleep(3);
1494 1427
1495 state->internal->mclk = stv0900_get_mclk_freq(state->internal, state->internal->quartz); 1428 stv0900_write_bits(intp, F0900_P1_ROLLOFF_CONTROL, p_init->rolloff);
1496 if (state->internal->errs) 1429 stv0900_write_bits(intp, F0900_P2_ROLLOFF_CONTROL, p_init->rolloff);
1497 error = STV0900_I2C_ERROR; 1430
1498 } 1431 intp->ts_config = p_init->ts_config;
1499 } else { 1432 if (intp->ts_config == NULL)
1500 error = STV0900_INVALID_HANDLE; 1433 stv0900_set_ts_parallel_serial(intp,
1501 } 1434 p_init->path1_ts_clock,
1435 p_init->path2_ts_clock);
1436 else {
1437 for (i = 0; intp->ts_config[i].addr != 0xffff; i++)
1438 stv0900_write_reg(intp,
1439 intp->ts_config[i].addr,
1440 intp->ts_config[i].val);
1441
1442 stv0900_write_bits(intp, F0900_P2_RST_HWARE, 1);
1443 stv0900_write_bits(intp, F0900_P2_RST_HWARE, 0);
1444 stv0900_write_bits(intp, F0900_P1_RST_HWARE, 1);
1445 stv0900_write_bits(intp, F0900_P1_RST_HWARE, 0);
1502 } 1446 }
1503 1447
1448 intp->tuner_type[0] = p_init->tuner1_type;
1449 intp->tuner_type[1] = p_init->tuner2_type;
1450 /* tuner init */
1451 switch (p_init->tuner1_type) {
1452 case 3: /*FE_AUTO_STB6100:*/
1453 stv0900_write_reg(intp, R0900_P1_TNRCFG, 0x3c);
1454 stv0900_write_reg(intp, R0900_P1_TNRCFG2, 0x86);
1455 stv0900_write_reg(intp, R0900_P1_TNRCFG3, 0x18);
1456 stv0900_write_reg(intp, R0900_P1_TNRXTAL, 27); /* 27MHz */
1457 stv0900_write_reg(intp, R0900_P1_TNRSTEPS, 0x05);
1458 stv0900_write_reg(intp, R0900_P1_TNRGAIN, 0x17);
1459 stv0900_write_reg(intp, R0900_P1_TNRADJ, 0x1f);
1460 stv0900_write_reg(intp, R0900_P1_TNRCTL2, 0x0);
1461 stv0900_write_bits(intp, F0900_P1_TUN_TYPE, 3);
1462 break;
1463 /* case FE_SW_TUNER: */
1464 default:
1465 stv0900_write_bits(intp, F0900_P1_TUN_TYPE, 6);
1466 break;
1467 }
1468
1469 stv0900_write_bits(intp, F0900_P1_TUN_MADDRESS, p_init->tun1_maddress);
1470 switch (p_init->tuner1_adc) {
1471 case 1:
1472 stv0900_write_reg(intp, R0900_TSTTNR1, 0x26);
1473 break;
1474 default:
1475 break;
1476 }
1477
1478 stv0900_write_reg(intp, R0900_P1_TNRLD, 1); /* hw tuner */
1479
1480 /* tuner init */
1481 switch (p_init->tuner2_type) {
1482 case 3: /*FE_AUTO_STB6100:*/
1483 stv0900_write_reg(intp, R0900_P2_TNRCFG, 0x3c);
1484 stv0900_write_reg(intp, R0900_P2_TNRCFG2, 0x86);
1485 stv0900_write_reg(intp, R0900_P2_TNRCFG3, 0x18);
1486 stv0900_write_reg(intp, R0900_P2_TNRXTAL, 27); /* 27MHz */
1487 stv0900_write_reg(intp, R0900_P2_TNRSTEPS, 0x05);
1488 stv0900_write_reg(intp, R0900_P2_TNRGAIN, 0x17);
1489 stv0900_write_reg(intp, R0900_P2_TNRADJ, 0x1f);
1490 stv0900_write_reg(intp, R0900_P2_TNRCTL2, 0x0);
1491 stv0900_write_bits(intp, F0900_P2_TUN_TYPE, 3);
1492 break;
1493 /* case FE_SW_TUNER: */
1494 default:
1495 stv0900_write_bits(intp, F0900_P2_TUN_TYPE, 6);
1496 break;
1497 }
1498
1499 stv0900_write_bits(intp, F0900_P2_TUN_MADDRESS, p_init->tun2_maddress);
1500 switch (p_init->tuner2_adc) {
1501 case 1:
1502 stv0900_write_reg(intp, R0900_TSTTNR3, 0x26);
1503 break;
1504 default:
1505 break;
1506 }
1507
1508 stv0900_write_reg(intp, R0900_P2_TNRLD, 1); /* hw tuner */
1509
1510 stv0900_write_bits(intp, F0900_P1_TUN_IQSWAP, p_init->tun1_iq_inv);
1511 stv0900_write_bits(intp, F0900_P2_TUN_IQSWAP, p_init->tun2_iq_inv);
1512 stv0900_set_mclk(intp, 135000000);
1513 msleep(3);
1514
1515 switch (intp->clkmode) {
1516 case 0:
1517 case 2:
1518 stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | intp->clkmode);
1519 break;
1520 default:
1521 selosci = 0x02 & stv0900_read_reg(intp, R0900_SYNTCTRL);
1522 stv0900_write_reg(intp, R0900_SYNTCTRL, 0x20 | selosci);
1523 break;
1524 }
1525 msleep(3);
1526
1527 intp->mclk = stv0900_get_mclk_freq(intp, intp->quartz);
1528 if (intp->errs)
1529 error = STV0900_I2C_ERROR;
1530
1504 return error; 1531 return error;
1505} 1532}
1506 1533
1507static int stv0900_status(struct stv0900_internal *i_params, 1534static int stv0900_status(struct stv0900_internal *intp,
1508 enum fe_stv0900_demod_num demod) 1535 enum fe_stv0900_demod_num demod)
1509{ 1536{
1510 enum fe_stv0900_search_state demod_state; 1537 enum fe_stv0900_search_state demod_state;
1511 s32 mode_field, delin_field, lock_field, fifo_field, lockedvit_field;
1512 int locked = FALSE; 1538 int locked = FALSE;
1539 u8 tsbitrate0_val, tsbitrate1_val;
1540 s32 bitrate;
1513 1541
1514 dmd_reg(mode_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); 1542 demod_state = stv0900_get_bits(intp, HEADER_MODE);
1515 dmd_reg(lock_field, F0900_P1_LOCK_DEFINITIF, F0900_P2_LOCK_DEFINITIF);
1516 dmd_reg(delin_field, F0900_P1_PKTDELIN_LOCK, F0900_P2_PKTDELIN_LOCK);
1517 dmd_reg(fifo_field, F0900_P1_TSFIFO_LINEOK, F0900_P2_TSFIFO_LINEOK);
1518 dmd_reg(lockedvit_field, F0900_P1_LOCKEDVIT, F0900_P2_LOCKEDVIT);
1519
1520 demod_state = stv0900_get_bits(i_params, mode_field);
1521 switch (demod_state) { 1543 switch (demod_state) {
1522 case STV0900_SEARCH: 1544 case STV0900_SEARCH:
1523 case STV0900_PLH_DETECTED: 1545 case STV0900_PLH_DETECTED:
@@ -1525,17 +1547,30 @@ static int stv0900_status(struct stv0900_internal *i_params,
1525 locked = FALSE; 1547 locked = FALSE;
1526 break; 1548 break;
1527 case STV0900_DVBS2_FOUND: 1549 case STV0900_DVBS2_FOUND:
1528 locked = stv0900_get_bits(i_params, lock_field) && 1550 locked = stv0900_get_bits(intp, LOCK_DEFINITIF) &&
1529 stv0900_get_bits(i_params, delin_field) && 1551 stv0900_get_bits(intp, PKTDELIN_LOCK) &&
1530 stv0900_get_bits(i_params, fifo_field); 1552 stv0900_get_bits(intp, TSFIFO_LINEOK);
1531 break; 1553 break;
1532 case STV0900_DVBS_FOUND: 1554 case STV0900_DVBS_FOUND:
1533 locked = stv0900_get_bits(i_params, lock_field) && 1555 locked = stv0900_get_bits(intp, LOCK_DEFINITIF) &&
1534 stv0900_get_bits(i_params, lockedvit_field) && 1556 stv0900_get_bits(intp, LOCKEDVIT) &&
1535 stv0900_get_bits(i_params, fifo_field); 1557 stv0900_get_bits(intp, TSFIFO_LINEOK);
1536 break; 1558 break;
1537 } 1559 }
1538 1560
1561 dprintk("%s: locked = %d\n", __func__, locked);
1562
1563 if (stvdebug) {
1564 /* Print TS bitrate */
1565 tsbitrate0_val = stv0900_read_reg(intp, TSBITRATE0);
1566 tsbitrate1_val = stv0900_read_reg(intp, TSBITRATE1);
1567 /* Formula Bit rate = Mclk * px_tsfifo_bitrate / 16384 */
1568 bitrate = (stv0900_get_mclk_freq(intp, intp->quartz)/1000000)
1569 * (tsbitrate1_val << 8 | tsbitrate0_val);
1570 bitrate /= 16384;
1571 dprintk("TS bitrate = %d Mbit/sec \n", bitrate);
1572 };
1573
1539 return locked; 1574 return locked;
1540} 1575}
1541 1576
@@ -1543,7 +1578,8 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe,
1543 struct dvb_frontend_parameters *params) 1578 struct dvb_frontend_parameters *params)
1544{ 1579{
1545 struct stv0900_state *state = fe->demodulator_priv; 1580 struct stv0900_state *state = fe->demodulator_priv;
1546 struct stv0900_internal *i_params = state->internal; 1581 struct stv0900_internal *intp = state->internal;
1582 enum fe_stv0900_demod_num demod = state->demod;
1547 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 1583 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1548 1584
1549 struct stv0900_search_params p_search; 1585 struct stv0900_search_params p_search;
@@ -1551,10 +1587,16 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe,
1551 1587
1552 enum fe_stv0900_error error = STV0900_NO_ERROR; 1588 enum fe_stv0900_error error = STV0900_NO_ERROR;
1553 1589
1554 dprintk(KERN_INFO "%s: ", __func__); 1590 dprintk("%s: ", __func__);
1591
1592 if (!(INRANGE(100000, c->symbol_rate, 70000000)))
1593 return DVBFE_ALGO_SEARCH_FAILED;
1594
1595 if (state->config->set_ts_params)
1596 state->config->set_ts_params(fe, 0);
1555 1597
1556 p_result.locked = FALSE; 1598 p_result.locked = FALSE;
1557 p_search.path = state->demod; 1599 p_search.path = demod;
1558 p_search.frequency = c->frequency; 1600 p_search.frequency = c->frequency;
1559 p_search.symbol_rate = c->symbol_rate; 1601 p_search.symbol_rate = c->symbol_rate;
1560 p_search.search_range = 10000000; 1602 p_search.search_range = 10000000;
@@ -1563,103 +1605,47 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe,
1563 p_search.iq_inversion = STV0900_IQ_AUTO; 1605 p_search.iq_inversion = STV0900_IQ_AUTO;
1564 p_search.search_algo = STV0900_BLIND_SEARCH; 1606 p_search.search_algo = STV0900_BLIND_SEARCH;
1565 1607
1566 if ((INRANGE(100000, p_search.symbol_rate, 70000000)) && 1608 intp->srch_standard[demod] = p_search.standard;
1567 (INRANGE(100000, p_search.search_range, 50000000))) { 1609 intp->symbol_rate[demod] = p_search.symbol_rate;
1568 switch (p_search.path) { 1610 intp->srch_range[demod] = p_search.search_range;
1569 case STV0900_DEMOD_1: 1611 intp->freq[demod] = p_search.frequency;
1570 default: 1612 intp->srch_algo[demod] = p_search.search_algo;
1571 i_params->dmd1_srch_standard = p_search.standard; 1613 intp->srch_iq_inv[demod] = p_search.iq_inversion;
1572 i_params->dmd1_symbol_rate = p_search.symbol_rate; 1614 intp->fec[demod] = p_search.fec;
1573 i_params->dmd1_srch_range = p_search.search_range; 1615 if ((stv0900_algo(fe) == STV0900_RANGEOK) &&
1574 i_params->tuner1_freq = p_search.frequency; 1616 (intp->errs == STV0900_NO_ERROR)) {
1575 i_params->dmd1_srch_algo = p_search.search_algo; 1617 p_result.locked = intp->result[demod].locked;
1576 i_params->dmd1_srch_iq_inv = p_search.iq_inversion; 1618 p_result.standard = intp->result[demod].standard;
1577 i_params->dmd1_fec = p_search.fec; 1619 p_result.frequency = intp->result[demod].frequency;
1620 p_result.symbol_rate = intp->result[demod].symbol_rate;
1621 p_result.fec = intp->result[demod].fec;
1622 p_result.modcode = intp->result[demod].modcode;
1623 p_result.pilot = intp->result[demod].pilot;
1624 p_result.frame_len = intp->result[demod].frame_len;
1625 p_result.spectrum = intp->result[demod].spectrum;
1626 p_result.rolloff = intp->result[demod].rolloff;
1627 p_result.modulation = intp->result[demod].modulation;
1628 } else {
1629 p_result.locked = FALSE;
1630 switch (intp->err[demod]) {
1631 case STV0900_I2C_ERROR:
1632 error = STV0900_I2C_ERROR;
1578 break; 1633 break;
1579 1634 case STV0900_NO_ERROR:
1580 case STV0900_DEMOD_2: 1635 default:
1581 i_params->dmd2_srch_stndrd = p_search.standard; 1636 error = STV0900_SEARCH_FAILED;
1582 i_params->dmd2_symbol_rate = p_search.symbol_rate;
1583 i_params->dmd2_srch_range = p_search.search_range;
1584 i_params->tuner2_freq = p_search.frequency;
1585 i_params->dmd2_srch_algo = p_search.search_algo;
1586 i_params->dmd2_srch_iq_inv = p_search.iq_inversion;
1587 i_params->dmd2_fec = p_search.fec;
1588 break; 1637 break;
1589 } 1638 }
1590 1639 }
1591 if ((stv0900_algo(fe) == STV0900_RANGEOK) &&
1592 (i_params->errs == STV0900_NO_ERROR)) {
1593 switch (p_search.path) {
1594 case STV0900_DEMOD_1:
1595 default:
1596 p_result.locked = i_params->dmd1_rslts.locked;
1597 p_result.standard = i_params->dmd1_rslts.standard;
1598 p_result.frequency = i_params->dmd1_rslts.frequency;
1599 p_result.symbol_rate = i_params->dmd1_rslts.symbol_rate;
1600 p_result.fec = i_params->dmd1_rslts.fec;
1601 p_result.modcode = i_params->dmd1_rslts.modcode;
1602 p_result.pilot = i_params->dmd1_rslts.pilot;
1603 p_result.frame_length = i_params->dmd1_rslts.frame_length;
1604 p_result.spectrum = i_params->dmd1_rslts.spectrum;
1605 p_result.rolloff = i_params->dmd1_rslts.rolloff;
1606 p_result.modulation = i_params->dmd1_rslts.modulation;
1607 break;
1608 case STV0900_DEMOD_2:
1609 p_result.locked = i_params->dmd2_rslts.locked;
1610 p_result.standard = i_params->dmd2_rslts.standard;
1611 p_result.frequency = i_params->dmd2_rslts.frequency;
1612 p_result.symbol_rate = i_params->dmd2_rslts.symbol_rate;
1613 p_result.fec = i_params->dmd2_rslts.fec;
1614 p_result.modcode = i_params->dmd2_rslts.modcode;
1615 p_result.pilot = i_params->dmd2_rslts.pilot;
1616 p_result.frame_length = i_params->dmd2_rslts.frame_length;
1617 p_result.spectrum = i_params->dmd2_rslts.spectrum;
1618 p_result.rolloff = i_params->dmd2_rslts.rolloff;
1619 p_result.modulation = i_params->dmd2_rslts.modulation;
1620 break;
1621 }
1622
1623 } else {
1624 p_result.locked = FALSE;
1625 switch (p_search.path) {
1626 case STV0900_DEMOD_1:
1627 switch (i_params->dmd1_err) {
1628 case STV0900_I2C_ERROR:
1629 error = STV0900_I2C_ERROR;
1630 break;
1631 case STV0900_NO_ERROR:
1632 default:
1633 error = STV0900_SEARCH_FAILED;
1634 break;
1635 }
1636 break;
1637 case STV0900_DEMOD_2:
1638 switch (i_params->dmd2_err) {
1639 case STV0900_I2C_ERROR:
1640 error = STV0900_I2C_ERROR;
1641 break;
1642 case STV0900_NO_ERROR:
1643 default:
1644 error = STV0900_SEARCH_FAILED;
1645 break;
1646 }
1647 break;
1648 }
1649 }
1650
1651 } else
1652 error = STV0900_BAD_PARAMETER;
1653 1640
1654 if ((p_result.locked == TRUE) && (error == STV0900_NO_ERROR)) { 1641 if ((p_result.locked == TRUE) && (error == STV0900_NO_ERROR)) {
1655 dprintk(KERN_INFO "Search Success\n"); 1642 dprintk("Search Success\n");
1656 return DVBFE_ALGO_SEARCH_SUCCESS; 1643 return DVBFE_ALGO_SEARCH_SUCCESS;
1657 } else { 1644 } else {
1658 dprintk(KERN_INFO "Search Fail\n"); 1645 dprintk("Search Fail\n");
1659 return DVBFE_ALGO_SEARCH_FAILED; 1646 return DVBFE_ALGO_SEARCH_FAILED;
1660 } 1647 }
1661 1648
1662 return DVBFE_ALGO_SEARCH_ERROR;
1663} 1649}
1664 1650
1665static int stv0900_read_status(struct dvb_frontend *fe, enum fe_status *status) 1651static int stv0900_read_status(struct dvb_frontend *fe, enum fe_status *status)
@@ -1690,16 +1676,13 @@ static int stv0900_stop_ts(struct dvb_frontend *fe, int stop_ts)
1690{ 1676{
1691 1677
1692 struct stv0900_state *state = fe->demodulator_priv; 1678 struct stv0900_state *state = fe->demodulator_priv;
1693 struct stv0900_internal *i_params = state->internal; 1679 struct stv0900_internal *intp = state->internal;
1694 enum fe_stv0900_demod_num demod = state->demod; 1680 enum fe_stv0900_demod_num demod = state->demod;
1695 s32 rst_field;
1696
1697 dmd_reg(rst_field, F0900_P1_RST_HWARE, F0900_P2_RST_HWARE);
1698 1681
1699 if (stop_ts == TRUE) 1682 if (stop_ts == TRUE)
1700 stv0900_write_bits(i_params, rst_field, 1); 1683 stv0900_write_bits(intp, RST_HWARE, 1);
1701 else 1684 else
1702 stv0900_write_bits(i_params, rst_field, 0); 1685 stv0900_write_bits(intp, RST_HWARE, 0);
1703 1686
1704 return 0; 1687 return 0;
1705} 1688}
@@ -1707,23 +1690,19 @@ static int stv0900_stop_ts(struct dvb_frontend *fe, int stop_ts)
1707static int stv0900_diseqc_init(struct dvb_frontend *fe) 1690static int stv0900_diseqc_init(struct dvb_frontend *fe)
1708{ 1691{
1709 struct stv0900_state *state = fe->demodulator_priv; 1692 struct stv0900_state *state = fe->demodulator_priv;
1710 struct stv0900_internal *i_params = state->internal; 1693 struct stv0900_internal *intp = state->internal;
1711 enum fe_stv0900_demod_num demod = state->demod; 1694 enum fe_stv0900_demod_num demod = state->demod;
1712 s32 mode_field, reset_field;
1713 1695
1714 dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); 1696 stv0900_write_bits(intp, DISTX_MODE, state->config->diseqc_mode);
1715 dmd_reg(reset_field, F0900_P1_DISEQC_RESET, F0900_P2_DISEQC_RESET); 1697 stv0900_write_bits(intp, DISEQC_RESET, 1);
1716 1698 stv0900_write_bits(intp, DISEQC_RESET, 0);
1717 stv0900_write_bits(i_params, mode_field, state->config->diseqc_mode);
1718 stv0900_write_bits(i_params, reset_field, 1);
1719 stv0900_write_bits(i_params, reset_field, 0);
1720 1699
1721 return 0; 1700 return 0;
1722} 1701}
1723 1702
1724static int stv0900_init(struct dvb_frontend *fe) 1703static int stv0900_init(struct dvb_frontend *fe)
1725{ 1704{
1726 dprintk(KERN_INFO "%s\n", __func__); 1705 dprintk("%s\n", __func__);
1727 1706
1728 stv0900_stop_ts(fe, 1); 1707 stv0900_stop_ts(fe, 1);
1729 stv0900_diseqc_init(fe); 1708 stv0900_diseqc_init(fe);
@@ -1731,48 +1710,24 @@ static int stv0900_init(struct dvb_frontend *fe)
1731 return 0; 1710 return 0;
1732} 1711}
1733 1712
1734static int stv0900_diseqc_send(struct stv0900_internal *i_params , u8 *Data, 1713static int stv0900_diseqc_send(struct stv0900_internal *intp , u8 *data,
1735 u32 NbData, enum fe_stv0900_demod_num demod) 1714 u32 NbData, enum fe_stv0900_demod_num demod)
1736{ 1715{
1737 s32 i = 0; 1716 s32 i = 0;
1738 1717
1739 switch (demod) { 1718 stv0900_write_bits(intp, DIS_PRECHARGE, 1);
1740 case STV0900_DEMOD_1: 1719 while (i < NbData) {
1741 default: 1720 while (stv0900_get_bits(intp, FIFO_FULL))
1742 stv0900_write_bits(i_params, F0900_P1_DIS_PRECHARGE, 1); 1721 ;/* checkpatch complains */
1743 while (i < NbData) { 1722 stv0900_write_reg(intp, DISTXDATA, data[i]);
1744 while (stv0900_get_bits(i_params, F0900_P1_FIFO_FULL)) 1723 i++;
1745 ;/* checkpatch complains */ 1724 }
1746 stv0900_write_reg(i_params, R0900_P1_DISTXDATA, Data[i]);
1747 i++;
1748 }
1749
1750 stv0900_write_bits(i_params, F0900_P1_DIS_PRECHARGE, 0);
1751 i = 0;
1752 while ((stv0900_get_bits(i_params, F0900_P1_TX_IDLE) != 1) && (i < 10)) {
1753 msleep(10);
1754 i++;
1755 }
1756
1757 break;
1758 case STV0900_DEMOD_2:
1759 stv0900_write_bits(i_params, F0900_P2_DIS_PRECHARGE, 1);
1760
1761 while (i < NbData) {
1762 while (stv0900_get_bits(i_params, F0900_P2_FIFO_FULL))
1763 ;/* checkpatch complains */
1764 stv0900_write_reg(i_params, R0900_P2_DISTXDATA, Data[i]);
1765 i++;
1766 }
1767
1768 stv0900_write_bits(i_params, F0900_P2_DIS_PRECHARGE, 0);
1769 i = 0;
1770 while ((stv0900_get_bits(i_params, F0900_P2_TX_IDLE) != 1) && (i < 10)) {
1771 msleep(10);
1772 i++;
1773 }
1774 1725
1775 break; 1726 stv0900_write_bits(intp, DIS_PRECHARGE, 0);
1727 i = 0;
1728 while ((stv0900_get_bits(intp, TX_IDLE) != 1) && (i < 10)) {
1729 msleep(10);
1730 i++;
1776 } 1731 }
1777 1732
1778 return 0; 1733 return 0;
@@ -1792,22 +1747,21 @@ static int stv0900_send_master_cmd(struct dvb_frontend *fe,
1792static int stv0900_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) 1747static int stv0900_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst)
1793{ 1748{
1794 struct stv0900_state *state = fe->demodulator_priv; 1749 struct stv0900_state *state = fe->demodulator_priv;
1795 struct stv0900_internal *i_params = state->internal; 1750 struct stv0900_internal *intp = state->internal;
1796 enum fe_stv0900_demod_num demod = state->demod; 1751 enum fe_stv0900_demod_num demod = state->demod;
1797 s32 mode_field; 1752 u8 data;
1798 u32 diseqc_fifo;
1799 1753
1800 dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE);
1801 dmd_reg(diseqc_fifo, R0900_P1_DISTXDATA, R0900_P2_DISTXDATA);
1802 1754
1803 switch (burst) { 1755 switch (burst) {
1804 case SEC_MINI_A: 1756 case SEC_MINI_A:
1805 stv0900_write_bits(i_params, mode_field, 3);/* Unmodulated */ 1757 stv0900_write_bits(intp, DISTX_MODE, 3);/* Unmodulated */
1806 stv0900_write_reg(i_params, diseqc_fifo, 0x00); 1758 data = 0x00;
1759 stv0900_diseqc_send(intp, &data, 1, state->demod);
1807 break; 1760 break;
1808 case SEC_MINI_B: 1761 case SEC_MINI_B:
1809 stv0900_write_bits(i_params, mode_field, 2);/* Modulated */ 1762 stv0900_write_bits(intp, DISTX_MODE, 2);/* Modulated */
1810 stv0900_write_reg(i_params, diseqc_fifo, 0xff); 1763 data = 0xff;
1764 stv0900_diseqc_send(intp, &data, 1, state->demod);
1811 break; 1765 break;
1812 } 1766 }
1813 1767
@@ -1818,68 +1772,54 @@ static int stv0900_recv_slave_reply(struct dvb_frontend *fe,
1818 struct dvb_diseqc_slave_reply *reply) 1772 struct dvb_diseqc_slave_reply *reply)
1819{ 1773{
1820 struct stv0900_state *state = fe->demodulator_priv; 1774 struct stv0900_state *state = fe->demodulator_priv;
1821 struct stv0900_internal *i_params = state->internal; 1775 struct stv0900_internal *intp = state->internal;
1776 enum fe_stv0900_demod_num demod = state->demod;
1822 s32 i = 0; 1777 s32 i = 0;
1823 1778
1824 switch (state->demod) { 1779 reply->msg_len = 0;
1825 case STV0900_DEMOD_1:
1826 default:
1827 reply->msg_len = 0;
1828
1829 while ((stv0900_get_bits(i_params, F0900_P1_RX_END) != 1) && (i < 10)) {
1830 msleep(10);
1831 i++;
1832 }
1833
1834 if (stv0900_get_bits(i_params, F0900_P1_RX_END)) {
1835 reply->msg_len = stv0900_get_bits(i_params, F0900_P1_FIFO_BYTENBR);
1836
1837 for (i = 0; i < reply->msg_len; i++)
1838 reply->msg[i] = stv0900_read_reg(i_params, R0900_P1_DISRXDATA);
1839 }
1840 break;
1841 case STV0900_DEMOD_2:
1842 reply->msg_len = 0;
1843 1780
1844 while ((stv0900_get_bits(i_params, F0900_P2_RX_END) != 1) && (i < 10)) { 1781 while ((stv0900_get_bits(intp, RX_END) != 1) && (i < 10)) {
1845 msleep(10); 1782 msleep(10);
1846 i++; 1783 i++;
1847 } 1784 }
1848 1785
1849 if (stv0900_get_bits(i_params, F0900_P2_RX_END)) { 1786 if (stv0900_get_bits(intp, RX_END)) {
1850 reply->msg_len = stv0900_get_bits(i_params, F0900_P2_FIFO_BYTENBR); 1787 reply->msg_len = stv0900_get_bits(intp, FIFO_BYTENBR);
1851 1788
1852 for (i = 0; i < reply->msg_len; i++) 1789 for (i = 0; i < reply->msg_len; i++)
1853 reply->msg[i] = stv0900_read_reg(i_params, R0900_P2_DISRXDATA); 1790 reply->msg[i] = stv0900_read_reg(intp, DISRXDATA);
1854 }
1855 break;
1856 } 1791 }
1857 1792
1858 return 0; 1793 return 0;
1859} 1794}
1860 1795
1861static int stv0900_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) 1796static int stv0900_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t toneoff)
1862{ 1797{
1863 struct stv0900_state *state = fe->demodulator_priv; 1798 struct stv0900_state *state = fe->demodulator_priv;
1864 struct stv0900_internal *i_params = state->internal; 1799 struct stv0900_internal *intp = state->internal;
1865 enum fe_stv0900_demod_num demod = state->demod; 1800 enum fe_stv0900_demod_num demod = state->demod;
1866 s32 mode_field, reset_field;
1867
1868 dprintk(KERN_INFO "%s: %s\n", __func__, ((tone == 0) ? "Off" : "On"));
1869 1801
1870 dmd_reg(mode_field, F0900_P1_DISTX_MODE, F0900_P2_DISTX_MODE); 1802 dprintk("%s: %s\n", __func__, ((toneoff == 0) ? "On" : "Off"));
1871 dmd_reg(reset_field, F0900_P1_DISEQC_RESET, F0900_P2_DISEQC_RESET);
1872 1803
1873 if (tone) { 1804 switch (toneoff) {
1874 /*Set the DiseqC mode to 22Khz continues tone*/ 1805 case SEC_TONE_ON:
1875 stv0900_write_bits(i_params, mode_field, 0); 1806 /*Set the DiseqC mode to 22Khz _continues_ tone*/
1876 stv0900_write_bits(i_params, reset_field, 1); 1807 stv0900_write_bits(intp, DISTX_MODE, 0);
1808 stv0900_write_bits(intp, DISEQC_RESET, 1);
1877 /*release DiseqC reset to enable the 22KHz tone*/ 1809 /*release DiseqC reset to enable the 22KHz tone*/
1878 stv0900_write_bits(i_params, reset_field, 0); 1810 stv0900_write_bits(intp, DISEQC_RESET, 0);
1879 } else { 1811 break;
1880 stv0900_write_bits(i_params, mode_field, 0); 1812 case SEC_TONE_OFF:
1813 /*return diseqc mode to config->diseqc_mode.
1814 Usually it's without _continues_ tone */
1815 stv0900_write_bits(intp, DISTX_MODE,
1816 state->config->diseqc_mode);
1881 /*maintain the DiseqC reset to disable the 22KHz tone*/ 1817 /*maintain the DiseqC reset to disable the 22KHz tone*/
1882 stv0900_write_bits(i_params, reset_field, 1); 1818 stv0900_write_bits(intp, DISEQC_RESET, 1);
1819 stv0900_write_bits(intp, DISEQC_RESET, 0);
1820 break;
1821 default:
1822 return -EINVAL;
1883 } 1823 }
1884 1824
1885 return 0; 1825 return 0;
@@ -1889,11 +1829,11 @@ static void stv0900_release(struct dvb_frontend *fe)
1889{ 1829{
1890 struct stv0900_state *state = fe->demodulator_priv; 1830 struct stv0900_state *state = fe->demodulator_priv;
1891 1831
1892 dprintk(KERN_INFO "%s\n", __func__); 1832 dprintk("%s\n", __func__);
1893 1833
1894 if ((--(state->internal->dmds_used)) <= 0) { 1834 if ((--(state->internal->dmds_used)) <= 0) {
1895 1835
1896 dprintk(KERN_INFO "%s: Actually removing\n", __func__); 1836 dprintk("%s: Actually removing\n", __func__);
1897 1837
1898 remove_inode(state->internal); 1838 remove_inode(state->internal);
1899 kfree(state->internal); 1839 kfree(state->internal);
@@ -1963,17 +1903,19 @@ struct dvb_frontend *stv0900_attach(const struct stv0900_config *config,
1963 case 0: 1903 case 0:
1964 case 1: 1904 case 1:
1965 init_params.dmd_ref_clk = config->xtal; 1905 init_params.dmd_ref_clk = config->xtal;
1966 init_params.demod_mode = STV0900_DUAL; 1906 init_params.demod_mode = config->demod_mode;
1967 init_params.rolloff = STV0900_35; 1907 init_params.rolloff = STV0900_35;
1968 init_params.path1_ts_clock = config->path1_mode; 1908 init_params.path1_ts_clock = config->path1_mode;
1969 init_params.tun1_maddress = config->tun1_maddress; 1909 init_params.tun1_maddress = config->tun1_maddress;
1970 init_params.tun1_iq_inversion = STV0900_IQ_NORMAL; 1910 init_params.tun1_iq_inv = STV0900_IQ_NORMAL;
1971 init_params.tuner1_adc = config->tun1_adc; 1911 init_params.tuner1_adc = config->tun1_adc;
1912 init_params.tuner1_type = config->tun1_type;
1972 init_params.path2_ts_clock = config->path2_mode; 1913 init_params.path2_ts_clock = config->path2_mode;
1973 init_params.ts_config = config->ts_config_regs; 1914 init_params.ts_config = config->ts_config_regs;
1974 init_params.tun2_maddress = config->tun2_maddress; 1915 init_params.tun2_maddress = config->tun2_maddress;
1975 init_params.tuner2_adc = config->tun2_adc; 1916 init_params.tuner2_adc = config->tun2_adc;
1976 init_params.tun2_iq_inversion = STV0900_IQ_SWAPPED; 1917 init_params.tuner2_type = config->tun2_type;
1918 init_params.tun2_iq_inv = STV0900_IQ_SWAPPED;
1977 1919
1978 err_stv0900 = stv0900_init_internal(&state->frontend, 1920 err_stv0900 = stv0900_init_internal(&state->frontend,
1979 &init_params); 1921 &init_params);
diff --git a/drivers/media/dvb/frontends/stv0900_init.h b/drivers/media/dvb/frontends/stv0900_init.h
index ff388b47a4e3..b684df9995d8 100644
--- a/drivers/media/dvb/frontends/stv0900_init.h
+++ b/drivers/media/dvb/frontends/stv0900_init.h
@@ -141,85 +141,228 @@ struct stv0900_short_frames_car_loop_optim {
141 141
142}; 142};
143 143
144struct stv0900_short_frames_car_loop_optim_vs_mod {
145 enum fe_stv0900_modulation modulation;
146 u8 car_loop_2; /* SR<3msps */
147 u8 car_loop_5; /* 3<SR<=7msps */
148 u8 car_loop_10; /* 7<SR<=15msps */
149 u8 car_loop_20; /* 10<SR<=25msps */
150 u8 car_loop_30; /* 10<SR<=45msps */
151};
152
144/* Cut 1.x Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */ 153/* Cut 1.x Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */
145static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoop[14] = { 154static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoop[14] = {
146 /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ 155 /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
147 { STV0900_QPSK_12, 0x1C, 0x0D, 0x1B, 0x2C, 0x3A, 0x1C, 0x2A, 0x3B, 0x2A, 0x1B }, 156 10MPoff 20MPon 20MPoff 30MPon 30MPoff */
148 { STV0900_QPSK_35, 0x2C, 0x0D, 0x2B, 0x2C, 0x3A, 0x0C, 0x3A, 0x2B, 0x2A, 0x0B }, 157 { STV0900_QPSK_12, 0x1C, 0x0D, 0x1B, 0x2C, 0x3A,
149 { STV0900_QPSK_23, 0x2C, 0x0D, 0x2B, 0x2C, 0x0B, 0x0C, 0x3A, 0x1B, 0x2A, 0x3A }, 158 0x1C, 0x2A, 0x3B, 0x2A, 0x1B },
150 { STV0900_QPSK_34, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, 159 { STV0900_QPSK_35, 0x2C, 0x0D, 0x2B, 0x2C, 0x3A,
151 { STV0900_QPSK_45, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, 160 0x0C, 0x3A, 0x2B, 0x2A, 0x0B },
152 { STV0900_QPSK_56, 0x0D, 0x0D, 0x3B, 0x1C, 0x0B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, 161 { STV0900_QPSK_23, 0x2C, 0x0D, 0x2B, 0x2C, 0x0B,
153 { STV0900_QPSK_89, 0x0D, 0x0D, 0x3B, 0x1C, 0x1B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, 162 0x0C, 0x3A, 0x1B, 0x2A, 0x3A },
154 { STV0900_QPSK_910, 0x1D, 0x0D, 0x3B, 0x1C, 0x1B, 0x3B, 0x3A, 0x0B, 0x2A, 0x3A }, 163 { STV0900_QPSK_34, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B,
155 { STV0900_8PSK_35, 0x29, 0x3B, 0x09, 0x2B, 0x38, 0x0B, 0x18, 0x1A, 0x08, 0x0A }, 164 0x3B, 0x3A, 0x0B, 0x2A, 0x3A },
156 { STV0900_8PSK_23, 0x0A, 0x3B, 0x29, 0x2B, 0x19, 0x0B, 0x38, 0x1A, 0x18, 0x0A }, 165 { STV0900_QPSK_45, 0x3C, 0x0D, 0x3B, 0x1C, 0x0B,
157 { STV0900_8PSK_34, 0x3A, 0x3B, 0x2A, 0x2B, 0x39, 0x0B, 0x19, 0x1A, 0x38, 0x0A }, 166 0x3B, 0x3A, 0x0B, 0x2A, 0x3A },
158 { STV0900_8PSK_56, 0x1B, 0x3B, 0x0B, 0x2B, 0x1A, 0x0B, 0x39, 0x1A, 0x19, 0x0A }, 167 { STV0900_QPSK_56, 0x0D, 0x0D, 0x3B, 0x1C, 0x0B,
159 { STV0900_8PSK_89, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A, 0x0B, 0x39, 0x1A, 0x29, 0x39 }, 168 0x3B, 0x3A, 0x0B, 0x2A, 0x3A },
160 { STV0900_8PSK_910, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A, 0x0B, 0x39, 0x1A, 0x29, 0x39 } 169 { STV0900_QPSK_89, 0x0D, 0x0D, 0x3B, 0x1C, 0x1B,
170 0x3B, 0x3A, 0x0B, 0x2A, 0x3A },
171 { STV0900_QPSK_910, 0x1D, 0x0D, 0x3B, 0x1C, 0x1B,
172 0x3B, 0x3A, 0x0B, 0x2A, 0x3A },
173 { STV0900_8PSK_35, 0x29, 0x3B, 0x09, 0x2B, 0x38,
174 0x0B, 0x18, 0x1A, 0x08, 0x0A },
175 { STV0900_8PSK_23, 0x0A, 0x3B, 0x29, 0x2B, 0x19,
176 0x0B, 0x38, 0x1A, 0x18, 0x0A },
177 { STV0900_8PSK_34, 0x3A, 0x3B, 0x2A, 0x2B, 0x39,
178 0x0B, 0x19, 0x1A, 0x38, 0x0A },
179 { STV0900_8PSK_56, 0x1B, 0x3B, 0x0B, 0x2B, 0x1A,
180 0x0B, 0x39, 0x1A, 0x19, 0x0A },
181 { STV0900_8PSK_89, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A,
182 0x0B, 0x39, 0x1A, 0x29, 0x39 },
183 { STV0900_8PSK_910, 0x3B, 0x3B, 0x0B, 0x2B, 0x2A,
184 0x0B, 0x39, 0x1A, 0x29, 0x39 }
161}; 185};
162 186
163 187
164/* Cut 2.0 Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */ 188/* Cut 2.0 Tracking carrier loop carrier QPSK 1/2 to 8PSK 9/10 long Frame */
165static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoopCut20[14] = { 189static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoopCut20[14] = {
166 /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ 190 /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
167 { STV0900_QPSK_12, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D, 0x1F, 0x3D, 0x3E, 0x3D, 0x1E }, 191 10MPoff 20MPon 20MPoff 30MPon 30MPoff */
168 { STV0900_QPSK_35, 0x2F, 0x3F, 0x2E, 0x2F, 0x3D, 0x0F, 0x0E, 0x2E, 0x3D, 0x0E }, 192 { STV0900_QPSK_12, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D,
169 { STV0900_QPSK_23, 0x2F, 0x3F, 0x2E, 0x2F, 0x0E, 0x0F, 0x0E, 0x1E, 0x3D, 0x3D }, 193 0x1F, 0x3D, 0x3E, 0x3D, 0x1E },
170 { STV0900_QPSK_34, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, 194 { STV0900_QPSK_35, 0x2F, 0x3F, 0x2E, 0x2F, 0x3D,
171 { STV0900_QPSK_45, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, 195 0x0F, 0x0E, 0x2E, 0x3D, 0x0E },
172 { STV0900_QPSK_56, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, 196 { STV0900_QPSK_23, 0x2F, 0x3F, 0x2E, 0x2F, 0x0E,
173 { STV0900_QPSK_89, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, 197 0x0F, 0x0E, 0x1E, 0x3D, 0x3D },
174 { STV0900_QPSK_910, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E, 0x3E, 0x0E, 0x1E, 0x3D, 0x3D }, 198 { STV0900_QPSK_34, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E,
175 { STV0900_8PSK_35, 0x3c, 0x0c, 0x1c, 0x3b, 0x0c, 0x3b, 0x2b, 0x2b, 0x1b, 0x2b }, 199 0x3E, 0x0E, 0x1E, 0x3D, 0x3D },
176 { STV0900_8PSK_23, 0x1d, 0x0c, 0x3c, 0x0c, 0x2c, 0x3b, 0x0c, 0x2b, 0x2b, 0x2b }, 200 { STV0900_QPSK_45, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E,
177 { STV0900_8PSK_34, 0x0e, 0x1c, 0x3d, 0x0c, 0x0d, 0x3b, 0x2c, 0x3b, 0x0c, 0x2b }, 201 0x3E, 0x0E, 0x1E, 0x3D, 0x3D },
178 { STV0900_8PSK_56, 0x2e, 0x3e, 0x1e, 0x2e, 0x2d, 0x1e, 0x3c, 0x2d, 0x2c, 0x1d }, 202 { STV0900_QPSK_56, 0x3F, 0x3F, 0x3E, 0x1F, 0x0E,
179 { STV0900_8PSK_89, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, 0x1e, 0x0d, 0x2d, 0x3c, 0x1d }, 203 0x3E, 0x0E, 0x1E, 0x3D, 0x3D },
180 { STV0900_8PSK_910, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d, 0x1e, 0x1d, 0x2d, 0x0d, 0x1d } 204 { STV0900_QPSK_89, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E,
205 0x3E, 0x0E, 0x1E, 0x3D, 0x3D },
206 { STV0900_QPSK_910, 0x3F, 0x3F, 0x3E, 0x1F, 0x1E,
207 0x3E, 0x0E, 0x1E, 0x3D, 0x3D },
208 { STV0900_8PSK_35, 0x3c, 0x0c, 0x1c, 0x3b, 0x0c,
209 0x3b, 0x2b, 0x2b, 0x1b, 0x2b },
210 { STV0900_8PSK_23, 0x1d, 0x0c, 0x3c, 0x0c, 0x2c,
211 0x3b, 0x0c, 0x2b, 0x2b, 0x2b },
212 { STV0900_8PSK_34, 0x0e, 0x1c, 0x3d, 0x0c, 0x0d,
213 0x3b, 0x2c, 0x3b, 0x0c, 0x2b },
214 { STV0900_8PSK_56, 0x2e, 0x3e, 0x1e, 0x2e, 0x2d,
215 0x1e, 0x3c, 0x2d, 0x2c, 0x1d },
216 { STV0900_8PSK_89, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d,
217 0x1e, 0x0d, 0x2d, 0x3c, 0x1d },
218 { STV0900_8PSK_910, 0x3e, 0x3e, 0x1e, 0x2e, 0x3d,
219 0x1e, 0x1d, 0x2d, 0x0d, 0x1d },
181}; 220};
182 221
183 222
184 223
185/* Cut 2.0 Tracking carrier loop carrier 16APSK 2/3 to 32APSK 9/10 long Frame */ 224/* Cut 2.0 Tracking carrier loop carrier 16APSK 2/3 to 32APSK 9/10 long Frame */
186static const struct stv0900_car_loop_optim FE_STV0900_S2APSKCarLoopCut20[11] = { 225static const struct stv0900_car_loop_optim FE_STV0900_S2APSKCarLoopCut20[11] = {
187 /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ 226 /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
188 { STV0900_16APSK_23, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x0C, 0x3C, 0x0C, 0x2C, 0x0C }, 227 10MPoff 20MPon 20MPoff 30MPon 30MPoff */
189 { STV0900_16APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x0C, 0x2D, 0x0C, 0x1D, 0x0C }, 228 { STV0900_16APSK_23, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D,
190 { STV0900_16APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x0C, 0x3D, 0x0C, 0x2D, 0x0C }, 229 0x0C, 0x3C, 0x0C, 0x2C, 0x0C },
191 { STV0900_16APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x0C, 0x3D, 0x0C, 0x2D, 0x0C }, 230 { STV0900_16APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E,
192 { STV0900_16APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E, 0x0C, 0x0E, 0x0C, 0x3D, 0x0C }, 231 0x0C, 0x2D, 0x0C, 0x1D, 0x0C },
193 { STV0900_16APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E, 0x0C, 0x0E, 0x0C, 0x3D, 0x0C }, 232 { STV0900_16APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E,
194 { STV0900_32APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, 233 0x0C, 0x3D, 0x0C, 0x2D, 0x0C },
195 { STV0900_32APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, 234 { STV0900_16APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E,
196 { STV0900_32APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, 235 0x0C, 0x3D, 0x0C, 0x2D, 0x0C },
197 { STV0900_32APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C }, 236 { STV0900_16APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E,
198 { STV0900_32APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C } 237 0x0C, 0x0E, 0x0C, 0x3D, 0x0C },
238 { STV0900_16APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x2E,
239 0x0C, 0x0E, 0x0C, 0x3D, 0x0C },
240 { STV0900_32APSK_34, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
241 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
242 { STV0900_32APSK_45, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
243 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
244 { STV0900_32APSK_56, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
245 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
246 { STV0900_32APSK_89, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
247 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
248 { STV0900_32APSK_910, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
249 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
199}; 250};
200 251
201 252
202/* Cut 2.0 Tracking carrier loop carrier QPSK 1/4 to QPSK 2/5 long Frame */ 253/* Cut 2.0 Tracking carrier loop carrier QPSK 1/4 to QPSK 2/5 long Frame */
203static const struct stv0900_car_loop_optim FE_STV0900_S2LowQPCarLoopCut20[3] = { 254static const struct stv0900_car_loop_optim FE_STV0900_S2LowQPCarLoopCut20[3] = {
204 /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon 20MPoff 30MPon 30MPoff */ 255 /* Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
205 { STV0900_QPSK_14, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D, 0x2F, 0x2D, 0x1F, 0x3D, 0x3E }, 256 10MPoff 20MPon 20MPoff 30MPon 30MPoff */
206 { STV0900_QPSK_13, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D, 0x2F, 0x3D, 0x0F, 0x3D, 0x2E }, 257 { STV0900_QPSK_14, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D,
207 { STV0900_QPSK_25, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D, 0x1F, 0x3D, 0x3E, 0x3D, 0x2E } 258 0x2F, 0x2D, 0x1F, 0x3D, 0x3E },
259 { STV0900_QPSK_13, 0x0F, 0x3F, 0x0E, 0x3F, 0x2D,
260 0x2F, 0x3D, 0x0F, 0x3D, 0x2E },
261 { STV0900_QPSK_25, 0x1F, 0x3F, 0x1E, 0x3F, 0x3D,
262 0x1F, 0x3D, 0x3E, 0x3D, 0x2E }
208}; 263};
209 264
210 265
211/* Cut 2.0 Tracking carrier loop carrier short Frame, cut 1.2 and 2.0 */ 266/* Cut 2.0 Tracking carrier loop carrier short Frame, cut 1.2 and 2.0 */
212static const struct stv0900_short_frames_car_loop_optim FE_STV0900_S2ShortCarLoop[4] = { 267static const
213 /*Mod 2M_cut1.2 2M_cut2.0 5M_cut1.2 5M_cut2.0 10M_cut1.2 10M_cut2.0 20M_cut1.2 20M_cut2.0 30M_cut1.2 30M_cut2.0 */ 268struct stv0900_short_frames_car_loop_optim FE_STV0900_S2ShortCarLoop[4] = {
214 { STV0900_QPSK, 0x3C, 0x2F, 0x2B, 0x2E, 0x0B, 0x0E, 0x3A, 0x0E, 0x2A, 0x3D }, 269 /*Mod 2Mcut1.2 2Mcut2.0 5Mcut1.2 5Mcut2.0 10Mcut1.2
215 { STV0900_8PSK, 0x0B, 0x3E, 0x2A, 0x0E, 0x0A, 0x2D, 0x19, 0x0D, 0x09, 0x3C }, 270 10Mcut2.0 20Mcut1.2 20M_cut2.0 30Mcut1.2 30Mcut2.0*/
216 { STV0900_16APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B, 0x1E, 0x3A, 0x3D, 0x2A, 0x2D }, 271 { STV0900_QPSK, 0x3C, 0x2F, 0x2B, 0x2E, 0x0B,
217 { STV0900_32APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B, 0x1E, 0x3A, 0x3D, 0x2A, 0x2D } 272 0x0E, 0x3A, 0x0E, 0x2A, 0x3D },
273 { STV0900_8PSK, 0x0B, 0x3E, 0x2A, 0x0E, 0x0A,
274 0x2D, 0x19, 0x0D, 0x09, 0x3C },
275 { STV0900_16APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B,
276 0x1E, 0x3A, 0x3D, 0x2A, 0x2D },
277 { STV0900_32APSK, 0x1B, 0x1E, 0x1B, 0x1E, 0x1B,
278 0x1E, 0x3A, 0x3D, 0x2A, 0x2D }
279};
280
281static const struct stv0900_car_loop_optim FE_STV0900_S2CarLoopCut30[14] = {
282 /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
283 10MPoff 20MPon 20MPoff 30MPon 30MPoff */
284 { STV0900_QPSK_12, 0x3C, 0x2C, 0x0C, 0x2C, 0x1B,
285 0x2C, 0x1B, 0x1C, 0x0B, 0x3B },
286 { STV0900_QPSK_35, 0x0D, 0x0D, 0x0C, 0x0D, 0x1B,
287 0x3C, 0x1B, 0x1C, 0x0B, 0x3B },
288 { STV0900_QPSK_23, 0x1D, 0x0D, 0x0C, 0x1D, 0x2B,
289 0x3C, 0x1B, 0x1C, 0x0B, 0x3B },
290 { STV0900_QPSK_34, 0x1D, 0x1D, 0x0C, 0x1D, 0x2B,
291 0x3C, 0x1B, 0x1C, 0x0B, 0x3B },
292 { STV0900_QPSK_45, 0x2D, 0x1D, 0x1C, 0x1D, 0x2B,
293 0x3C, 0x2B, 0x0C, 0x1B, 0x3B },
294 { STV0900_QPSK_56, 0x2D, 0x1D, 0x1C, 0x1D, 0x2B,
295 0x3C, 0x2B, 0x0C, 0x1B, 0x3B },
296 { STV0900_QPSK_89, 0x3D, 0x2D, 0x1C, 0x1D, 0x3B,
297 0x3C, 0x2B, 0x0C, 0x1B, 0x3B },
298 { STV0900_QPSK_910, 0x3D, 0x2D, 0x1C, 0x1D, 0x3B,
299 0x3C, 0x2B, 0x0C, 0x1B, 0x3B },
300 { STV0900_8PSK_35, 0x39, 0x19, 0x39, 0x19, 0x19,
301 0x19, 0x19, 0x19, 0x09, 0x19 },
302 { STV0900_8PSK_23, 0x2A, 0x39, 0x1A, 0x0A, 0x39,
303 0x0A, 0x29, 0x39, 0x29, 0x0A },
304 { STV0900_8PSK_34, 0x0B, 0x3A, 0x0B, 0x0B, 0x3A,
305 0x1B, 0x1A, 0x0B, 0x1A, 0x3A },
306 { STV0900_8PSK_56, 0x0C, 0x1B, 0x3B, 0x2B, 0x1B,
307 0x3B, 0x3A, 0x3B, 0x3A, 0x1B },
308 { STV0900_8PSK_89, 0x2C, 0x2C, 0x2C, 0x1C, 0x2B,
309 0x0C, 0x0B, 0x3B, 0x0B, 0x1B },
310 { STV0900_8PSK_910, 0x2C, 0x3C, 0x2C, 0x1C, 0x3B,
311 0x1C, 0x0B, 0x3B, 0x0B, 0x1B }
312};
313
314static const
315struct stv0900_car_loop_optim FE_STV0900_S2APSKCarLoopCut30[11] = {
316 /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
317 10MPoff 20MPon 20MPoff 30MPon 30MPoff */
318 { STV0900_16APSK_23, 0x0A, 0x0A, 0x0A, 0x0A, 0x1A,
319 0x0A, 0x3A, 0x0A, 0x2A, 0x0A },
320 { STV0900_16APSK_34, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B,
321 0x0A, 0x3B, 0x0A, 0x1B, 0x0A },
322 { STV0900_16APSK_45, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B,
323 0x0A, 0x3B, 0x0A, 0x2B, 0x0A },
324 { STV0900_16APSK_56, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B,
325 0x0A, 0x3B, 0x0A, 0x2B, 0x0A },
326 { STV0900_16APSK_89, 0x0A, 0x0A, 0x0A, 0x0A, 0x2B,
327 0x0A, 0x0C, 0x0A, 0x3B, 0x0A },
328 { STV0900_16APSK_910, 0x0A, 0x0A, 0x0A, 0x0A, 0x2B,
329 0x0A, 0x0C, 0x0A, 0x3B, 0x0A },
330 { STV0900_32APSK_34, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
331 0x0A, 0x0A, 0x0A, 0x0A, 0x0A },
332 { STV0900_32APSK_45, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
333 0x0A, 0x0A, 0x0A, 0x0A, 0x0A },
334 { STV0900_32APSK_56, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
335 0x0A, 0x0A, 0x0A, 0x0A, 0x0A },
336 { STV0900_32APSK_89, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
337 0x0A, 0x0A, 0x0A, 0x0A, 0x0A },
338 { STV0900_32APSK_910, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
339 0x0A, 0x0A, 0x0A, 0x0A, 0x0A }
340};
341
342static const
343struct stv0900_car_loop_optim FE_STV0900_S2LowQPCarLoopCut30[3] = {
344 /*Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon
345 10MPoff 20MPon 20MPoff 30MPon 30MPoff*/
346 { STV0900_QPSK_14, 0x0C, 0x3C, 0x0B, 0x3C, 0x2A,
347 0x2C, 0x2A, 0x1C, 0x3A, 0x3B },
348 { STV0900_QPSK_13, 0x0C, 0x3C, 0x0B, 0x3C, 0x2A,
349 0x2C, 0x3A, 0x0C, 0x3A, 0x2B },
350 { STV0900_QPSK_25, 0x1C, 0x3C, 0x1B, 0x3C, 0x3A,
351 0x1C, 0x3A, 0x3B, 0x3A, 0x2B }
352};
353
354static const struct stv0900_short_frames_car_loop_optim_vs_mod
355FE_STV0900_S2ShortCarLoopCut30[4] = {
356 /*Mod 2Mcut3.0 5Mcut3.0 10Mcut3.0 20Mcut3.0 30Mcut3.0*/
357 { STV0900_QPSK, 0x2C, 0x2B, 0x0B, 0x0B, 0x3A },
358 { STV0900_8PSK, 0x3B, 0x0B, 0x2A, 0x0A, 0x39 },
359 { STV0900_16APSK, 0x1B, 0x1B, 0x1B, 0x3A, 0x2A },
360 { STV0900_32APSK, 0x1B, 0x1B, 0x1B, 0x3A, 0x2A },
361
218}; 362};
219 363
220static const u16 STV0900_InitVal[182][2] = { 364static const u16 STV0900_InitVal[181][2] = {
221 { R0900_OUTCFG , 0x00 }, 365 { R0900_OUTCFG , 0x00 },
222 { R0900_MODECFG , 0xff },
223 { R0900_AGCRF1CFG , 0x11 }, 366 { R0900_AGCRF1CFG , 0x11 },
224 { R0900_AGCRF2CFG , 0x13 }, 367 { R0900_AGCRF2CFG , 0x13 },
225 { R0900_TSGENERAL1X , 0x14 }, 368 { R0900_TSGENERAL1X , 0x14 },
@@ -381,7 +524,7 @@ static const u16 STV0900_InitVal[182][2] = {
381 { R0900_GAINLLR_NF15 , 0x1A }, 524 { R0900_GAINLLR_NF15 , 0x1A },
382 { R0900_GAINLLR_NF16 , 0x1F }, 525 { R0900_GAINLLR_NF16 , 0x1F },
383 { R0900_GAINLLR_NF17 , 0x21 }, 526 { R0900_GAINLLR_NF17 , 0x21 },
384 { R0900_RCCFGH , 0x20 }, 527 { R0900_RCCFG2 , 0x20 },
385 { R0900_P1_FECM , 0x01 }, /*disable DSS modes*/ 528 { R0900_P1_FECM , 0x01 }, /*disable DSS modes*/
386 { R0900_P2_FECM , 0x01 }, /*disable DSS modes*/ 529 { R0900_P2_FECM , 0x01 }, /*disable DSS modes*/
387 { R0900_P1_PRVIT , 0x2F }, /*disable puncture rate 6/7*/ 530 { R0900_P1_PRVIT , 0x2F }, /*disable puncture rate 6/7*/
diff --git a/drivers/media/dvb/frontends/stv0900_priv.h b/drivers/media/dvb/frontends/stv0900_priv.h
index 5ed7a145c7d3..b62b0f0a4fef 100644
--- a/drivers/media/dvb/frontends/stv0900_priv.h
+++ b/drivers/media/dvb/frontends/stv0900_priv.h
@@ -46,22 +46,6 @@
46#define FALSE (!TRUE) 46#define FALSE (!TRUE)
47#endif 47#endif
48 48
49#define dmd_reg(a, b, c) \
50 do { \
51 a = 0; \
52 switch (demod) { \
53 case STV0900_DEMOD_1: \
54 default: \
55 a = b; \
56 break; \
57 case STV0900_DEMOD_2: \
58 a = c; \
59 break; \
60 } \
61 } while (0)
62
63static int stvdebug;
64
65#define dprintk(args...) \ 49#define dprintk(args...) \
66 do { \ 50 do { \
67 if (stvdebug) \ 51 if (stvdebug) \
@@ -70,6 +54,8 @@ static int stvdebug;
70 54
71#define STV0900_MAXLOOKUPSIZE 500 55#define STV0900_MAXLOOKUPSIZE 500
72#define STV0900_BLIND_SEARCH_AGC2_TH 700 56#define STV0900_BLIND_SEARCH_AGC2_TH 700
57#define STV0900_BLIND_SEARCH_AGC2_TH_CUT30 1400
58#define IQPOWER_THRESHOLD 30
73 59
74/* One point of the lookup table */ 60/* One point of the lookup table */
75struct stv000_lookpoint { 61struct stv000_lookpoint {
@@ -261,16 +247,18 @@ struct stv0900_init_params{
261 247
262 u8 tun1_maddress; 248 u8 tun1_maddress;
263 int tuner1_adc; 249 int tuner1_adc;
250 int tuner1_type;
264 251
265 /* IQ from the tuner1 to the demod */ 252 /* IQ from the tuner1 to the demod */
266 enum stv0900_iq_inversion tun1_iq_inversion; 253 enum stv0900_iq_inversion tun1_iq_inv;
267 enum fe_stv0900_clock_type path2_ts_clock; 254 enum fe_stv0900_clock_type path2_ts_clock;
268 255
269 u8 tun2_maddress; 256 u8 tun2_maddress;
270 int tuner2_adc; 257 int tuner2_adc;
258 int tuner2_type;
271 259
272 /* IQ from the tuner2 to the demod */ 260 /* IQ from the tuner2 to the demod */
273 enum stv0900_iq_inversion tun2_iq_inversion; 261 enum stv0900_iq_inversion tun2_iq_inv;
274 struct stv0900_reg *ts_config; 262 struct stv0900_reg *ts_config;
275}; 263};
276 264
@@ -300,7 +288,7 @@ struct stv0900_signal_info {
300 enum fe_stv0900_modcode modcode; 288 enum fe_stv0900_modcode modcode;
301 enum fe_stv0900_modulation modulation; 289 enum fe_stv0900_modulation modulation;
302 enum fe_stv0900_pilot pilot; 290 enum fe_stv0900_pilot pilot;
303 enum fe_stv0900_frame_length frame_length; 291 enum fe_stv0900_frame_length frame_len;
304 enum stv0900_iq_inversion spectrum; 292 enum stv0900_iq_inversion spectrum;
305 enum fe_stv0900_rolloff rolloff; 293 enum fe_stv0900_rolloff rolloff;
306 294
@@ -318,47 +306,27 @@ struct stv0900_internal{
318 /* Demodulator use for single demod or for dual demod) */ 306 /* Demodulator use for single demod or for dual demod) */
319 enum fe_stv0900_demod_mode demod_mode; 307 enum fe_stv0900_demod_mode demod_mode;
320 308
321 /*Demod 1*/ 309 /*Demods */
322 s32 tuner1_freq; 310 s32 freq[2];
323 s32 tuner1_bw; 311 s32 bw[2];
324 s32 dmd1_symbol_rate; 312 s32 symbol_rate[2];
325 s32 dmd1_srch_range; 313 s32 srch_range[2];
314 /* for software/auto tuner */
315 int tuner_type[2];
326 316
327 /* algorithm for search Blind, Cold or Warm*/ 317 /* algorithm for search Blind, Cold or Warm*/
328 enum fe_stv0900_search_algo dmd1_srch_algo; 318 enum fe_stv0900_search_algo srch_algo[2];
329 /* search standard: Auto, DVBS1/DSS only or DVBS2 only*/ 319 /* search standard: Auto, DVBS1/DSS only or DVBS2 only*/
330 enum fe_stv0900_search_standard dmd1_srch_standard; 320 enum fe_stv0900_search_standard srch_standard[2];
331 /* inversion search : auto, auto norma first, normal or inverted */ 321 /* inversion search : auto, auto norma first, normal or inverted */
332 enum fe_stv0900_search_iq dmd1_srch_iq_inv; 322 enum fe_stv0900_search_iq srch_iq_inv[2];
333 enum fe_stv0900_modcode dmd1_modcode; 323 enum fe_stv0900_modcode modcode[2];
334 enum fe_stv0900_modulation dmd1_modulation; 324 enum fe_stv0900_modulation modulation[2];
335 enum fe_stv0900_fec dmd1_fec; 325 enum fe_stv0900_fec fec[2];
336
337 struct stv0900_signal_info dmd1_rslts;
338 enum fe_stv0900_signal_type dmd1_state;
339
340 enum fe_stv0900_error dmd1_err;
341 326
342 /*Demod 2*/ 327 struct stv0900_signal_info result[2];
343 s32 tuner2_freq; 328 enum fe_stv0900_error err[2];
344 s32 tuner2_bw;
345 s32 dmd2_symbol_rate;
346 s32 dmd2_srch_range;
347 329
348 enum fe_stv0900_search_algo dmd2_srch_algo;
349 enum fe_stv0900_search_standard dmd2_srch_stndrd;
350 /* inversion search : auto, auto normal first, normal or inverted */
351 enum fe_stv0900_search_iq dmd2_srch_iq_inv;
352 enum fe_stv0900_modcode dmd2_modcode;
353 enum fe_stv0900_modulation dmd2_modulation;
354 enum fe_stv0900_fec dmd2_fec;
355
356 /* results of the search*/
357 struct stv0900_signal_info dmd2_rslts;
358 /* current state of the search algorithm */
359 enum fe_stv0900_signal_type dmd2_state;
360
361 enum fe_stv0900_error dmd2_err;
362 330
363 struct i2c_adapter *i2c_adap; 331 struct i2c_adapter *i2c_adap;
364 u8 i2c_addr; 332 u8 i2c_addr;
@@ -379,6 +347,8 @@ struct stv0900_state {
379 int demod; 347 int demod;
380}; 348};
381 349
350extern int stvdebug;
351
382extern s32 ge2comp(s32 a, s32 width); 352extern s32 ge2comp(s32 a, s32 width);
383 353
384extern void stv0900_write_reg(struct stv0900_internal *i_params, 354extern void stv0900_write_reg(struct stv0900_internal *i_params,
@@ -418,13 +388,21 @@ extern u8 stv0900_get_optim_short_carr_loop(s32 srate,
418extern void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, 388extern void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params,
419 enum fe_stv0900_demod_num demod); 389 enum fe_stv0900_demod_num demod);
420 390
421extern void stv0900_activate_s2_modcode(struct stv0900_internal *i_params, 391extern void stv0900_activate_s2_modcod(struct stv0900_internal *i_params,
422 enum fe_stv0900_demod_num demod); 392 enum fe_stv0900_demod_num demod);
423 393
424extern void stv0900_activate_s2_modcode_single(struct stv0900_internal *i_params, 394extern void stv0900_activate_s2_modcod_single(struct stv0900_internal *i_params,
425 enum fe_stv0900_demod_num demod); 395 enum fe_stv0900_demod_num demod);
426 396
427extern enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe, 397extern enum
398fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe,
428 enum fe_stv0900_demod_num demod); 399 enum fe_stv0900_demod_num demod);
429 400
401extern u32
402stv0900_get_freq_auto(struct stv0900_internal *intp, int demod);
403
404extern void
405stv0900_set_tuner_auto(struct stv0900_internal *intp, u32 Frequency,
406 u32 Bandwidth, int demod);
407
430#endif 408#endif
diff --git a/drivers/media/dvb/frontends/stv0900_reg.h b/drivers/media/dvb/frontends/stv0900_reg.h
index 264f9cf9a17e..731afe93a823 100644
--- a/drivers/media/dvb/frontends/stv0900_reg.h
+++ b/drivers/media/dvb/frontends/stv0900_reg.h
@@ -14,7 +14,7 @@
14 * 14 *
15 * This program is distributed in the hope that it will be useful, 15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * 18 *
19 * GNU General Public License for more details. 19 * GNU General Public License for more details.
20 * 20 *
@@ -26,3762 +26,3956 @@
26#ifndef STV0900_REG_H 26#ifndef STV0900_REG_H
27#define STV0900_REG_H 27#define STV0900_REG_H
28 28
29extern s32 shiftx(s32 x, int demod, s32 shift);
30
31#define REGx(x) shiftx(x, demod, 0x200)
32#define FLDx(x) shiftx(x, demod, 0x2000000)
33
29/*MID*/ 34/*MID*/
30#define R0900_MID 0xf100 35#define R0900_MID 0xf100
31#define F0900_MCHIP_IDENT 0xf10000f0 36#define F0900_MCHIP_IDENT 0xf10000f0
32#define F0900_MRELEASE 0xf100000f 37#define F0900_MRELEASE 0xf100000f
33 38
34/*DACR1*/ 39/*DACR1*/
35#define R0900_DACR1 0xf113 40#define R0900_DACR1 0xf113
36#define F0900_DAC_MODE 0xf11300e0 41#define F0900_DAC_MODE 0xf11300e0
37#define F0900_DAC_VALUE1 0xf113000f 42#define F0900_DAC_VALUE1 0xf113000f
38 43
39/*DACR2*/ 44/*DACR2*/
40#define R0900_DACR2 0xf114 45#define R0900_DACR2 0xf114
41#define F0900_DAC_VALUE0 0xf11400ff 46#define F0900_DAC_VALUE0 0xf11400ff
42 47
43/*OUTCFG*/ 48/*OUTCFG*/
44#define R0900_OUTCFG 0xf11c 49#define R0900_OUTCFG 0xf11c
45#define F0900_INV_DATA6 0xf11c0080 50#define F0900_OUTSERRS1_HZ 0xf11c0040
46#define F0900_OUTSERRS1_HZ 0xf11c0040 51#define F0900_OUTSERRS2_HZ 0xf11c0020
47#define F0900_OUTSERRS2_HZ 0xf11c0020 52#define F0900_OUTSERRS3_HZ 0xf11c0010
48#define F0900_OUTSERRS3_HZ 0xf11c0010 53#define F0900_OUTPARRS3_HZ 0xf11c0008
49#define F0900_OUTPARRS3_HZ 0xf11c0008
50#define F0900_OUTHZ3_CONTROL 0xf11c0007
51
52/*MODECFG*/
53#define R0900_MODECFG 0xf11d
54#define F0900_FECSPY_SEL_2 0xf11d0020
55#define F0900_HWARE_SEL_2 0xf11d0010
56#define F0900_PKTDEL_SEL_2 0xf11d0008
57#define F0900_DISEQC_SEL_2 0xf11d0004
58#define F0900_VIT_SEL_2 0xf11d0002
59#define F0900_DEMOD_SEL_2 0xf11d0001
60 54
61/*IRQSTATUS3*/ 55/*IRQSTATUS3*/
62#define R0900_IRQSTATUS3 0xf120 56#define R0900_IRQSTATUS3 0xf120
63#define F0900_SPLL_LOCK 0xf1200020 57#define F0900_SPLL_LOCK 0xf1200020
64#define F0900_SSTREAM_LCK_3 0xf1200010 58#define F0900_SSTREAM_LCK_3 0xf1200010
65#define F0900_SSTREAM_LCK_2 0xf1200008 59#define F0900_SSTREAM_LCK_2 0xf1200008
66#define F0900_SSTREAM_LCK_1 0xf1200004 60#define F0900_SSTREAM_LCK_1 0xf1200004
67#define F0900_SDVBS1_PRF_2 0xf1200002 61#define F0900_SDVBS1_PRF_2 0xf1200002
68#define F0900_SDVBS1_PRF_1 0xf1200001 62#define F0900_SDVBS1_PRF_1 0xf1200001
69 63
70/*IRQSTATUS2*/ 64/*IRQSTATUS2*/
71#define R0900_IRQSTATUS2 0xf121 65#define R0900_IRQSTATUS2 0xf121
72#define F0900_SSPY_ENDSIM_3 0xf1210080 66#define F0900_SSPY_ENDSIM_3 0xf1210080
73#define F0900_SSPY_ENDSIM_2 0xf1210040 67#define F0900_SSPY_ENDSIM_2 0xf1210040
74#define F0900_SSPY_ENDSIM_1 0xf1210020 68#define F0900_SSPY_ENDSIM_1 0xf1210020
75#define F0900_SPKTDEL_ERROR_2 0xf1210010 69#define F0900_SPKTDEL_ERROR_2 0xf1210010
76#define F0900_SPKTDEL_LOCKB_2 0xf1210008 70#define F0900_SPKTDEL_LOCKB_2 0xf1210008
77#define F0900_SPKTDEL_LOCK_2 0xf1210004 71#define F0900_SPKTDEL_LOCK_2 0xf1210004
78#define F0900_SPKTDEL_ERROR_1 0xf1210002 72#define F0900_SPKTDEL_ERROR_1 0xf1210002
79#define F0900_SPKTDEL_LOCKB_1 0xf1210001 73#define F0900_SPKTDEL_LOCKB_1 0xf1210001
80 74
81/*IRQSTATUS1*/ 75/*IRQSTATUS1*/
82#define R0900_IRQSTATUS1 0xf122 76#define R0900_IRQSTATUS1 0xf122
83#define F0900_SPKTDEL_LOCK_1 0xf1220080 77#define F0900_SPKTDEL_LOCK_1 0xf1220080
84#define F0900_SEXTPINB2 0xf1220040 78#define F0900_SDEMOD_LOCKB_2 0xf1220004
85#define F0900_SEXTPIN2 0xf1220020 79#define F0900_SDEMOD_LOCK_2 0xf1220002
86#define F0900_SEXTPINB1 0xf1220010 80#define F0900_SDEMOD_IRQ_2 0xf1220001
87#define F0900_SEXTPIN1 0xf1220008
88#define F0900_SDEMOD_LOCKB_2 0xf1220004
89#define F0900_SDEMOD_LOCK_2 0xf1220002
90#define F0900_SDEMOD_IRQ_2 0xf1220001
91 81
92/*IRQSTATUS0*/ 82/*IRQSTATUS0*/
93#define R0900_IRQSTATUS0 0xf123 83#define R0900_IRQSTATUS0 0xf123
94#define F0900_SDEMOD_LOCKB_1 0xf1230080 84#define F0900_SDEMOD_LOCKB_1 0xf1230080
95#define F0900_SDEMOD_LOCK_1 0xf1230040 85#define F0900_SDEMOD_LOCK_1 0xf1230040
96#define F0900_SDEMOD_IRQ_1 0xf1230020 86#define F0900_SDEMOD_IRQ_1 0xf1230020
97#define F0900_SBCH_ERRFLAG 0xf1230010 87#define F0900_SBCH_ERRFLAG 0xf1230010
98#define F0900_SDISEQC2RX_IRQ 0xf1230008 88#define F0900_SDISEQC2RX_IRQ 0xf1230008
99#define F0900_SDISEQC2TX_IRQ 0xf1230004 89#define F0900_SDISEQC2TX_IRQ 0xf1230004
100#define F0900_SDISEQC1RX_IRQ 0xf1230002 90#define F0900_SDISEQC1RX_IRQ 0xf1230002
101#define F0900_SDISEQC1TX_IRQ 0xf1230001 91#define F0900_SDISEQC1TX_IRQ 0xf1230001
102 92
103/*IRQMASK3*/ 93/*IRQMASK3*/
104#define R0900_IRQMASK3 0xf124 94#define R0900_IRQMASK3 0xf124
105#define F0900_MPLL_LOCK 0xf1240020 95#define F0900_MPLL_LOCK 0xf1240020
106#define F0900_MSTREAM_LCK_3 0xf1240010 96#define F0900_MSTREAM_LCK_3 0xf1240010
107#define F0900_MSTREAM_LCK_2 0xf1240008 97#define F0900_MSTREAM_LCK_2 0xf1240008
108#define F0900_MSTREAM_LCK_1 0xf1240004 98#define F0900_MSTREAM_LCK_1 0xf1240004
109#define F0900_MDVBS1_PRF_2 0xf1240002 99#define F0900_MDVBS1_PRF_2 0xf1240002
110#define F0900_MDVBS1_PRF_1 0xf1240001 100#define F0900_MDVBS1_PRF_1 0xf1240001
111 101
112/*IRQMASK2*/ 102/*IRQMASK2*/
113#define R0900_IRQMASK2 0xf125 103#define R0900_IRQMASK2 0xf125
114#define F0900_MSPY_ENDSIM_3 0xf1250080 104#define F0900_MSPY_ENDSIM_3 0xf1250080
115#define F0900_MSPY_ENDSIM_2 0xf1250040 105#define F0900_MSPY_ENDSIM_2 0xf1250040
116#define F0900_MSPY_ENDSIM_1 0xf1250020 106#define F0900_MSPY_ENDSIM_1 0xf1250020
117#define F0900_MPKTDEL_ERROR_2 0xf1250010 107#define F0900_MPKTDEL_ERROR_2 0xf1250010
118#define F0900_MPKTDEL_LOCKB_2 0xf1250008 108#define F0900_MPKTDEL_LOCKB_2 0xf1250008
119#define F0900_MPKTDEL_LOCK_2 0xf1250004 109#define F0900_MPKTDEL_LOCK_2 0xf1250004
120#define F0900_MPKTDEL_ERROR_1 0xf1250002 110#define F0900_MPKTDEL_ERROR_1 0xf1250002
121#define F0900_MPKTDEL_LOCKB_1 0xf1250001 111#define F0900_MPKTDEL_LOCKB_1 0xf1250001
122 112
123/*IRQMASK1*/ 113/*IRQMASK1*/
124#define R0900_IRQMASK1 0xf126 114#define R0900_IRQMASK1 0xf126
125#define F0900_MPKTDEL_LOCK_1 0xf1260080 115#define F0900_MPKTDEL_LOCK_1 0xf1260080
126#define F0900_MEXTPINB2 0xf1260040 116#define F0900_MEXTPINB2 0xf1260040
127#define F0900_MEXTPIN2 0xf1260020 117#define F0900_MEXTPIN2 0xf1260020
128#define F0900_MEXTPINB1 0xf1260010 118#define F0900_MEXTPINB1 0xf1260010
129#define F0900_MEXTPIN1 0xf1260008 119#define F0900_MEXTPIN1 0xf1260008
130#define F0900_MDEMOD_LOCKB_2 0xf1260004 120#define F0900_MDEMOD_LOCKB_2 0xf1260004
131#define F0900_MDEMOD_LOCK_2 0xf1260002 121#define F0900_MDEMOD_LOCK_2 0xf1260002
132#define F0900_MDEMOD_IRQ_2 0xf1260001 122#define F0900_MDEMOD_IRQ_2 0xf1260001
133 123
134/*IRQMASK0*/ 124/*IRQMASK0*/
135#define R0900_IRQMASK0 0xf127 125#define R0900_IRQMASK0 0xf127
136#define F0900_MDEMOD_LOCKB_1 0xf1270080 126#define F0900_MDEMOD_LOCKB_1 0xf1270080
137#define F0900_MDEMOD_LOCK_1 0xf1270040 127#define F0900_MDEMOD_LOCK_1 0xf1270040
138#define F0900_MDEMOD_IRQ_1 0xf1270020 128#define F0900_MDEMOD_IRQ_1 0xf1270020
139#define F0900_MBCH_ERRFLAG 0xf1270010 129#define F0900_MBCH_ERRFLAG 0xf1270010
140#define F0900_MDISEQC2RX_IRQ 0xf1270008 130#define F0900_MDISEQC2RX_IRQ 0xf1270008
141#define F0900_MDISEQC2TX_IRQ 0xf1270004 131#define F0900_MDISEQC2TX_IRQ 0xf1270004
142#define F0900_MDISEQC1RX_IRQ 0xf1270002 132#define F0900_MDISEQC1RX_IRQ 0xf1270002
143#define F0900_MDISEQC1TX_IRQ 0xf1270001 133#define F0900_MDISEQC1TX_IRQ 0xf1270001
144 134
145/*I2CCFG*/ 135/*I2CCFG*/
146#define R0900_I2CCFG 0xf129 136#define R0900_I2CCFG 0xf129
147#define F0900_I2C2_FASTMODE 0xf1290080 137#define F0900_I2C_FASTMODE 0xf1290008
148#define F0900_STATUS_WR2 0xf1290040 138#define F0900_I2CADDR_INC 0xf1290003
149#define F0900_I2C2ADDR_INC 0xf1290030
150#define F0900_I2C_FASTMODE 0xf1290008
151#define F0900_STATUS_WR 0xf1290004
152#define F0900_I2CADDR_INC 0xf1290003
153 139
154/*P1_I2CRPT*/ 140/*P1_I2CRPT*/
155#define R0900_P1_I2CRPT 0xf12a 141#define R0900_P1_I2CRPT 0xf12a
156#define F0900_P1_I2CT_ON 0xf12a0080 142#define I2CRPT shiftx(R0900_P1_I2CRPT, demod, -1)
157#define F0900_P1_ENARPT_LEVEL 0xf12a0070 143#define F0900_P1_I2CT_ON 0xf12a0080
158#define F0900_P1_SCLT_DELAY 0xf12a0008 144#define I2CT_ON shiftx(F0900_P1_I2CT_ON, demod, -0x10000)
159#define F0900_P1_STOP_ENABLE 0xf12a0004 145#define F0900_P1_ENARPT_LEVEL 0xf12a0070
160#define F0900_P1_STOP_SDAT2SDA 0xf12a0002 146#define F0900_P1_SCLT_DELAY 0xf12a0008
147#define F0900_P1_STOP_ENABLE 0xf12a0004
148#define F0900_P1_STOP_SDAT2SDA 0xf12a0002
161 149
162/*P2_I2CRPT*/ 150/*P2_I2CRPT*/
163#define R0900_P2_I2CRPT 0xf12b 151#define R0900_P2_I2CRPT 0xf12b
164#define F0900_P2_I2CT_ON 0xf12b0080 152#define F0900_P2_I2CT_ON 0xf12b0080
165#define F0900_P2_ENARPT_LEVEL 0xf12b0070 153#define F0900_P2_ENARPT_LEVEL 0xf12b0070
166#define F0900_P2_SCLT_DELAY 0xf12b0008 154#define F0900_P2_SCLT_DELAY 0xf12b0008
167#define F0900_P2_STOP_ENABLE 0xf12b0004 155#define F0900_P2_STOP_ENABLE 0xf12b0004
168#define F0900_P2_STOP_SDAT2SDA 0xf12b0002 156#define F0900_P2_STOP_SDAT2SDA 0xf12b0002
157
158/*IOPVALUE6*/
159#define R0900_IOPVALUE6 0xf138
160#define F0900_VSCL 0xf1380004
161#define F0900_VSDA 0xf1380002
162#define F0900_VDATA3_0 0xf1380001
163
164/*IOPVALUE5*/
165#define R0900_IOPVALUE5 0xf139
166#define F0900_VDATA3_1 0xf1390080
167#define F0900_VDATA3_2 0xf1390040
168#define F0900_VDATA3_3 0xf1390020
169#define F0900_VDATA3_4 0xf1390010
170#define F0900_VDATA3_5 0xf1390008
171#define F0900_VDATA3_6 0xf1390004
172#define F0900_VDATA3_7 0xf1390002
173#define F0900_VCLKOUT3 0xf1390001
174
175/*IOPVALUE4*/
176#define R0900_IOPVALUE4 0xf13a
177#define F0900_VSTROUT3 0xf13a0080
178#define F0900_VDPN3 0xf13a0040
179#define F0900_VERROR3 0xf13a0020
180#define F0900_VDATA2_7 0xf13a0010
181#define F0900_VCLKOUT2 0xf13a0008
182#define F0900_VSTROUT2 0xf13a0004
183#define F0900_VDPN2 0xf13a0002
184#define F0900_VERROR2 0xf13a0001
185
186/*IOPVALUE3*/
187#define R0900_IOPVALUE3 0xf13b
188#define F0900_VDATA1_7 0xf13b0080
189#define F0900_VCLKOUT1 0xf13b0040
190#define F0900_VSTROUT1 0xf13b0020
191#define F0900_VDPN1 0xf13b0010
192#define F0900_VERROR1 0xf13b0008
193#define F0900_VCLKOUT27 0xf13b0004
194#define F0900_VDISEQCOUT2 0xf13b0002
195#define F0900_VSCLT2 0xf13b0001
196
197/*IOPVALUE2*/
198#define R0900_IOPVALUE2 0xf13c
199#define F0900_VSDAT2 0xf13c0080
200#define F0900_VAGCRF2 0xf13c0040
201#define F0900_VDISEQCOUT1 0xf13c0020
202#define F0900_VSCLT1 0xf13c0010
203#define F0900_VSDAT1 0xf13c0008
204#define F0900_VAGCRF1 0xf13c0004
205#define F0900_VDIRCLK 0xf13c0002
206#define F0900_VSTDBY 0xf13c0001
207
208/*IOPVALUE1*/
209#define R0900_IOPVALUE1 0xf13d
210#define F0900_VCS1 0xf13d0080
211#define F0900_VCS0 0xf13d0040
212#define F0900_VGPIO13 0xf13d0020
213#define F0900_VGPIO12 0xf13d0010
214#define F0900_VGPIO11 0xf13d0008
215#define F0900_VGPIO10 0xf13d0004
216#define F0900_VGPIO9 0xf13d0002
217#define F0900_VGPIO8 0xf13d0001
218
219/*IOPVALUE0*/
220#define R0900_IOPVALUE0 0xf13e
221#define F0900_VGPIO7 0xf13e0080
222#define F0900_VGPIO6 0xf13e0040
223#define F0900_VGPIO5 0xf13e0020
224#define F0900_VGPIO4 0xf13e0010
225#define F0900_VGPIO3 0xf13e0008
226#define F0900_VGPIO2 0xf13e0004
227#define F0900_VGPIO1 0xf13e0002
228#define F0900_VCLKI2 0xf13e0001
169 229
170/*CLKI2CFG*/ 230/*CLKI2CFG*/
171#define R0900_CLKI2CFG 0xf140 231#define R0900_CLKI2CFG 0xf140
172#define F0900_CLKI2_OPD 0xf1400080 232#define F0900_CLKI2_OPD 0xf1400080
173#define F0900_CLKI2_CONFIG 0xf140007e 233#define F0900_CLKI2_CONFIG 0xf140007e
174#define F0900_CLKI2_XOR 0xf1400001 234#define F0900_CLKI2_XOR 0xf1400001
175 235
176/*GPIO1CFG*/ 236/*GPIO1CFG*/
177#define R0900_GPIO1CFG 0xf141 237#define R0900_GPIO1CFG 0xf141
178#define F0900_GPIO1_OPD 0xf1410080 238#define F0900_GPIO1_OPD 0xf1410080
179#define F0900_GPIO1_CONFIG 0xf141007e 239#define F0900_GPIO1_CONFIG 0xf141007e
180#define F0900_GPIO1_XOR 0xf1410001 240#define F0900_GPIO1_XOR 0xf1410001
181 241
182/*GPIO2CFG*/ 242/*GPIO2CFG*/
183#define R0900_GPIO2CFG 0xf142 243#define R0900_GPIO2CFG 0xf142
184#define F0900_GPIO2_OPD 0xf1420080 244#define F0900_GPIO2_OPD 0xf1420080
185#define F0900_GPIO2_CONFIG 0xf142007e 245#define F0900_GPIO2_CONFIG 0xf142007e
186#define F0900_GPIO2_XOR 0xf1420001 246#define F0900_GPIO2_XOR 0xf1420001
187 247
188/*GPIO3CFG*/ 248/*GPIO3CFG*/
189#define R0900_GPIO3CFG 0xf143 249#define R0900_GPIO3CFG 0xf143
190#define F0900_GPIO3_OPD 0xf1430080 250#define F0900_GPIO3_OPD 0xf1430080
191#define F0900_GPIO3_CONFIG 0xf143007e 251#define F0900_GPIO3_CONFIG 0xf143007e
192#define F0900_GPIO3_XOR 0xf1430001 252#define F0900_GPIO3_XOR 0xf1430001
193 253
194/*GPIO4CFG*/ 254/*GPIO4CFG*/
195#define R0900_GPIO4CFG 0xf144 255#define R0900_GPIO4CFG 0xf144
196#define F0900_GPIO4_OPD 0xf1440080 256#define F0900_GPIO4_OPD 0xf1440080
197#define F0900_GPIO4_CONFIG 0xf144007e 257#define F0900_GPIO4_CONFIG 0xf144007e
198#define F0900_GPIO4_XOR 0xf1440001 258#define F0900_GPIO4_XOR 0xf1440001
199 259
200/*GPIO5CFG*/ 260/*GPIO5CFG*/
201#define R0900_GPIO5CFG 0xf145 261#define R0900_GPIO5CFG 0xf145
202#define F0900_GPIO5_OPD 0xf1450080 262#define F0900_GPIO5_OPD 0xf1450080
203#define F0900_GPIO5_CONFIG 0xf145007e 263#define F0900_GPIO5_CONFIG 0xf145007e
204#define F0900_GPIO5_XOR 0xf1450001 264#define F0900_GPIO5_XOR 0xf1450001
205 265
206/*GPIO6CFG*/ 266/*GPIO6CFG*/
207#define R0900_GPIO6CFG 0xf146 267#define R0900_GPIO6CFG 0xf146
208#define F0900_GPIO6_OPD 0xf1460080 268#define F0900_GPIO6_OPD 0xf1460080
209#define F0900_GPIO6_CONFIG 0xf146007e 269#define F0900_GPIO6_CONFIG 0xf146007e
210#define F0900_GPIO6_XOR 0xf1460001 270#define F0900_GPIO6_XOR 0xf1460001
211 271
212/*GPIO7CFG*/ 272/*GPIO7CFG*/
213#define R0900_GPIO7CFG 0xf147 273#define R0900_GPIO7CFG 0xf147
214#define F0900_GPIO7_OPD 0xf1470080 274#define F0900_GPIO7_OPD 0xf1470080
215#define F0900_GPIO7_CONFIG 0xf147007e 275#define F0900_GPIO7_CONFIG 0xf147007e
216#define F0900_GPIO7_XOR 0xf1470001 276#define F0900_GPIO7_XOR 0xf1470001
217 277
218/*GPIO8CFG*/ 278/*GPIO8CFG*/
219#define R0900_GPIO8CFG 0xf148 279#define R0900_GPIO8CFG 0xf148
220#define F0900_GPIO8_OPD 0xf1480080 280#define F0900_GPIO8_OPD 0xf1480080
221#define F0900_GPIO8_CONFIG 0xf148007e 281#define F0900_GPIO8_CONFIG 0xf148007e
222#define F0900_GPIO8_XOR 0xf1480001 282#define F0900_GPIO8_XOR 0xf1480001
223 283
224/*GPIO9CFG*/ 284/*GPIO9CFG*/
225#define R0900_GPIO9CFG 0xf149 285#define R0900_GPIO9CFG 0xf149
226#define F0900_GPIO9_OPD 0xf1490080 286#define F0900_GPIO9_OPD 0xf1490080
227#define F0900_GPIO9_CONFIG 0xf149007e 287#define F0900_GPIO9_CONFIG 0xf149007e
228#define F0900_GPIO9_XOR 0xf1490001 288#define F0900_GPIO9_XOR 0xf1490001
229 289
230/*GPIO10CFG*/ 290/*GPIO10CFG*/
231#define R0900_GPIO10CFG 0xf14a 291#define R0900_GPIO10CFG 0xf14a
232#define F0900_GPIO10_OPD 0xf14a0080 292#define F0900_GPIO10_OPD 0xf14a0080
233#define F0900_GPIO10_CONFIG 0xf14a007e 293#define F0900_GPIO10_CONFIG 0xf14a007e
234#define F0900_GPIO10_XOR 0xf14a0001 294#define F0900_GPIO10_XOR 0xf14a0001
235 295
236/*GPIO11CFG*/ 296/*GPIO11CFG*/
237#define R0900_GPIO11CFG 0xf14b 297#define R0900_GPIO11CFG 0xf14b
238#define F0900_GPIO11_OPD 0xf14b0080 298#define F0900_GPIO11_OPD 0xf14b0080
239#define F0900_GPIO11_CONFIG 0xf14b007e 299#define F0900_GPIO11_CONFIG 0xf14b007e
240#define F0900_GPIO11_XOR 0xf14b0001 300#define F0900_GPIO11_XOR 0xf14b0001
241 301
242/*GPIO12CFG*/ 302/*GPIO12CFG*/
243#define R0900_GPIO12CFG 0xf14c 303#define R0900_GPIO12CFG 0xf14c
244#define F0900_GPIO12_OPD 0xf14c0080 304#define F0900_GPIO12_OPD 0xf14c0080
245#define F0900_GPIO12_CONFIG 0xf14c007e 305#define F0900_GPIO12_CONFIG 0xf14c007e
246#define F0900_GPIO12_XOR 0xf14c0001 306#define F0900_GPIO12_XOR 0xf14c0001
247 307
248/*GPIO13CFG*/ 308/*GPIO13CFG*/
249#define R0900_GPIO13CFG 0xf14d 309#define R0900_GPIO13CFG 0xf14d
250#define F0900_GPIO13_OPD 0xf14d0080 310#define F0900_GPIO13_OPD 0xf14d0080
251#define F0900_GPIO13_CONFIG 0xf14d007e 311#define F0900_GPIO13_CONFIG 0xf14d007e
252#define F0900_GPIO13_XOR 0xf14d0001 312#define F0900_GPIO13_XOR 0xf14d0001
253 313
254/*CS0CFG*/ 314/*CS0CFG*/
255#define R0900_CS0CFG 0xf14e 315#define R0900_CS0CFG 0xf14e
256#define F0900_CS0_OPD 0xf14e0080 316#define F0900_CS0_OPD 0xf14e0080
257#define F0900_CS0_CONFIG 0xf14e007e 317#define F0900_CS0_CONFIG 0xf14e007e
258#define F0900_CS0_XOR 0xf14e0001 318#define F0900_CS0_XOR 0xf14e0001
259 319
260/*CS1CFG*/ 320/*CS1CFG*/
261#define R0900_CS1CFG 0xf14f 321#define R0900_CS1CFG 0xf14f
262#define F0900_CS1_OPD 0xf14f0080 322#define F0900_CS1_OPD 0xf14f0080
263#define F0900_CS1_CONFIG 0xf14f007e 323#define F0900_CS1_CONFIG 0xf14f007e
264#define F0900_CS1_XOR 0xf14f0001 324#define F0900_CS1_XOR 0xf14f0001
265 325
266/*STDBYCFG*/ 326/*STDBYCFG*/
267#define R0900_STDBYCFG 0xf150 327#define R0900_STDBYCFG 0xf150
268#define F0900_STDBY_OPD 0xf1500080 328#define F0900_STDBY_OPD 0xf1500080
269#define F0900_STDBY_CONFIG 0xf150007e 329#define F0900_STDBY_CONFIG 0xf150007e
270#define F0900_STBDY_XOR 0xf1500001 330#define F0900_STBDY_XOR 0xf1500001
271 331
272/*DIRCLKCFG*/ 332/*DIRCLKCFG*/
273#define R0900_DIRCLKCFG 0xf151 333#define R0900_DIRCLKCFG 0xf151
274#define F0900_DIRCLK_OPD 0xf1510080 334#define F0900_DIRCLK_OPD 0xf1510080
275#define F0900_DIRCLK_CONFIG 0xf151007e 335#define F0900_DIRCLK_CONFIG 0xf151007e
276#define F0900_DIRCLK_XOR 0xf1510001 336#define F0900_DIRCLK_XOR 0xf1510001
277 337
278/*AGCRF1CFG*/ 338/*AGCRF1CFG*/
279#define R0900_AGCRF1CFG 0xf152 339#define R0900_AGCRF1CFG 0xf152
280#define F0900_AGCRF1_OPD 0xf1520080 340#define F0900_AGCRF1_OPD 0xf1520080
281#define F0900_AGCRF1_CONFIG 0xf152007e 341#define F0900_AGCRF1_CONFIG 0xf152007e
282#define F0900_AGCRF1_XOR 0xf1520001 342#define F0900_AGCRF1_XOR 0xf1520001
283 343
284/*SDAT1CFG*/ 344/*SDAT1CFG*/
285#define R0900_SDAT1CFG 0xf153 345#define R0900_SDAT1CFG 0xf153
286#define F0900_SDAT1_OPD 0xf1530080 346#define F0900_SDAT1_OPD 0xf1530080
287#define F0900_SDAT1_CONFIG 0xf153007e 347#define F0900_SDAT1_CONFIG 0xf153007e
288#define F0900_SDAT1_XOR 0xf1530001 348#define F0900_SDAT1_XOR 0xf1530001
289 349
290/*SCLT1CFG*/ 350/*SCLT1CFG*/
291#define R0900_SCLT1CFG 0xf154 351#define R0900_SCLT1CFG 0xf154
292#define F0900_SCLT1_OPD 0xf1540080 352#define F0900_SCLT1_OPD 0xf1540080
293#define F0900_SCLT1_CONFIG 0xf154007e 353#define F0900_SCLT1_CONFIG 0xf154007e
294#define F0900_SCLT1_XOR 0xf1540001 354#define F0900_SCLT1_XOR 0xf1540001
295 355
296/*DISEQCO1CFG*/ 356/*DISEQCO1CFG*/
297#define R0900_DISEQCO1CFG 0xf155 357#define R0900_DISEQCO1CFG 0xf155
298#define F0900_DISEQCO1_OPD 0xf1550080 358#define F0900_DISEQCO1_OPD 0xf1550080
299#define F0900_DISEQCO1_CONFIG 0xf155007e 359#define F0900_DISEQCO1_CONFIG 0xf155007e
300#define F0900_DISEQC1_XOR 0xf1550001 360#define F0900_DISEQC1_XOR 0xf1550001
301 361
302/*AGCRF2CFG*/ 362/*AGCRF2CFG*/
303#define R0900_AGCRF2CFG 0xf156 363#define R0900_AGCRF2CFG 0xf156
304#define F0900_AGCRF2_OPD 0xf1560080 364#define F0900_AGCRF2_OPD 0xf1560080
305#define F0900_AGCRF2_CONFIG 0xf156007e 365#define F0900_AGCRF2_CONFIG 0xf156007e
306#define F0900_AGCRF2_XOR 0xf1560001 366#define F0900_AGCRF2_XOR 0xf1560001
307 367
308/*SDAT2CFG*/ 368/*SDAT2CFG*/
309#define R0900_SDAT2CFG 0xf157 369#define R0900_SDAT2CFG 0xf157
310#define F0900_SDAT2_OPD 0xf1570080 370#define F0900_SDAT2_OPD 0xf1570080
311#define F0900_SDAT2_CONFIG 0xf157007e 371#define F0900_SDAT2_CONFIG 0xf157007e
312#define F0900_SDAT2_XOR 0xf1570001 372#define F0900_SDAT2_XOR 0xf1570001
313 373
314/*SCLT2CFG*/ 374/*SCLT2CFG*/
315#define R0900_SCLT2CFG 0xf158 375#define R0900_SCLT2CFG 0xf158
316#define F0900_SCLT2_OPD 0xf1580080 376#define F0900_SCLT2_OPD 0xf1580080
317#define F0900_SCLT2_CONFIG 0xf158007e 377#define F0900_SCLT2_CONFIG 0xf158007e
318#define F0900_SCLT2_XOR 0xf1580001 378#define F0900_SCLT2_XOR 0xf1580001
319 379
320/*DISEQCO2CFG*/ 380/*DISEQCO2CFG*/
321#define R0900_DISEQCO2CFG 0xf159 381#define R0900_DISEQCO2CFG 0xf159
322#define F0900_DISEQCO2_OPD 0xf1590080 382#define F0900_DISEQCO2_OPD 0xf1590080
323#define F0900_DISEQCO2_CONFIG 0xf159007e 383#define F0900_DISEQCO2_CONFIG 0xf159007e
324#define F0900_DISEQC2_XOR 0xf1590001 384#define F0900_DISEQC2_XOR 0xf1590001
325 385
326/*CLKOUT27CFG*/ 386/*CLKOUT27CFG*/
327#define R0900_CLKOUT27CFG 0xf15a 387#define R0900_CLKOUT27CFG 0xf15a
328#define F0900_CLKOUT27_OPD 0xf15a0080 388#define F0900_CLKOUT27_OPD 0xf15a0080
329#define F0900_CLKOUT27_CONFIG 0xf15a007e 389#define F0900_CLKOUT27_CONFIG 0xf15a007e
330#define F0900_CLKOUT27_XOR 0xf15a0001 390#define F0900_CLKOUT27_XOR 0xf15a0001
331 391
332/*ERROR1CFG*/ 392/*ERROR1CFG*/
333#define R0900_ERROR1CFG 0xf15b 393#define R0900_ERROR1CFG 0xf15b
334#define F0900_ERROR1_OPD 0xf15b0080 394#define F0900_ERROR1_OPD 0xf15b0080
335#define F0900_ERROR1_CONFIG 0xf15b007e 395#define F0900_ERROR1_CONFIG 0xf15b007e
336#define F0900_ERROR1_XOR 0xf15b0001 396#define F0900_ERROR1_XOR 0xf15b0001
337 397
338/*DPN1CFG*/ 398/*DPN1CFG*/
339#define R0900_DPN1CFG 0xf15c 399#define R0900_DPN1CFG 0xf15c
340#define F0900_DPN1_OPD 0xf15c0080 400#define F0900_DPN1_OPD 0xf15c0080
341#define F0900_DPN1_CONFIG 0xf15c007e 401#define F0900_DPN1_CONFIG 0xf15c007e
342#define F0900_DPN1_XOR 0xf15c0001 402#define F0900_DPN1_XOR 0xf15c0001
343 403
344/*STROUT1CFG*/ 404/*STROUT1CFG*/
345#define R0900_STROUT1CFG 0xf15d 405#define R0900_STROUT1CFG 0xf15d
346#define F0900_STROUT1_OPD 0xf15d0080 406#define F0900_STROUT1_OPD 0xf15d0080
347#define F0900_STROUT1_CONFIG 0xf15d007e 407#define F0900_STROUT1_CONFIG 0xf15d007e
348#define F0900_STROUT1_XOR 0xf15d0001 408#define F0900_STROUT1_XOR 0xf15d0001
349 409
350/*CLKOUT1CFG*/ 410/*CLKOUT1CFG*/
351#define R0900_CLKOUT1CFG 0xf15e 411#define R0900_CLKOUT1CFG 0xf15e
352#define F0900_CLKOUT1_OPD 0xf15e0080 412#define F0900_CLKOUT1_OPD 0xf15e0080
353#define F0900_CLKOUT1_CONFIG 0xf15e007e 413#define F0900_CLKOUT1_CONFIG 0xf15e007e
354#define F0900_CLKOUT1_XOR 0xf15e0001 414#define F0900_CLKOUT1_XOR 0xf15e0001
355 415
356/*DATA71CFG*/ 416/*DATA71CFG*/
357#define R0900_DATA71CFG 0xf15f 417#define R0900_DATA71CFG 0xf15f
358#define F0900_DATA71_OPD 0xf15f0080 418#define F0900_DATA71_OPD 0xf15f0080
359#define F0900_DATA71_CONFIG 0xf15f007e 419#define F0900_DATA71_CONFIG 0xf15f007e
360#define F0900_DATA71_XOR 0xf15f0001 420#define F0900_DATA71_XOR 0xf15f0001
361 421
362/*ERROR2CFG*/ 422/*ERROR2CFG*/
363#define R0900_ERROR2CFG 0xf160 423#define R0900_ERROR2CFG 0xf160
364#define F0900_ERROR2_OPD 0xf1600080 424#define F0900_ERROR2_OPD 0xf1600080
365#define F0900_ERROR2_CONFIG 0xf160007e 425#define F0900_ERROR2_CONFIG 0xf160007e
366#define F0900_ERROR2_XOR 0xf1600001 426#define F0900_ERROR2_XOR 0xf1600001
367 427
368/*DPN2CFG*/ 428/*DPN2CFG*/
369#define R0900_DPN2CFG 0xf161 429#define R0900_DPN2CFG 0xf161
370#define F0900_DPN2_OPD 0xf1610080 430#define F0900_DPN2_OPD 0xf1610080
371#define F0900_DPN2_CONFIG 0xf161007e 431#define F0900_DPN2_CONFIG 0xf161007e
372#define F0900_DPN2_XOR 0xf1610001 432#define F0900_DPN2_XOR 0xf1610001
373 433
374/*STROUT2CFG*/ 434/*STROUT2CFG*/
375#define R0900_STROUT2CFG 0xf162 435#define R0900_STROUT2CFG 0xf162
376#define F0900_STROUT2_OPD 0xf1620080 436#define F0900_STROUT2_OPD 0xf1620080
377#define F0900_STROUT2_CONFIG 0xf162007e 437#define F0900_STROUT2_CONFIG 0xf162007e
378#define F0900_STROUT2_XOR 0xf1620001 438#define F0900_STROUT2_XOR 0xf1620001
379 439
380/*CLKOUT2CFG*/ 440/*CLKOUT2CFG*/
381#define R0900_CLKOUT2CFG 0xf163 441#define R0900_CLKOUT2CFG 0xf163
382#define F0900_CLKOUT2_OPD 0xf1630080 442#define F0900_CLKOUT2_OPD 0xf1630080
383#define F0900_CLKOUT2_CONFIG 0xf163007e 443#define F0900_CLKOUT2_CONFIG 0xf163007e
384#define F0900_CLKOUT2_XOR 0xf1630001 444#define F0900_CLKOUT2_XOR 0xf1630001
385 445
386/*DATA72CFG*/ 446/*DATA72CFG*/
387#define R0900_DATA72CFG 0xf164 447#define R0900_DATA72CFG 0xf164
388#define F0900_DATA72_OPD 0xf1640080 448#define F0900_DATA72_OPD 0xf1640080
389#define F0900_DATA72_CONFIG 0xf164007e 449#define F0900_DATA72_CONFIG 0xf164007e
390#define F0900_DATA72_XOR 0xf1640001 450#define F0900_DATA72_XOR 0xf1640001
391 451
392/*ERROR3CFG*/ 452/*ERROR3CFG*/
393#define R0900_ERROR3CFG 0xf165 453#define R0900_ERROR3CFG 0xf165
394#define F0900_ERROR3_OPD 0xf1650080 454#define F0900_ERROR3_OPD 0xf1650080
395#define F0900_ERROR3_CONFIG 0xf165007e 455#define F0900_ERROR3_CONFIG 0xf165007e
396#define F0900_ERROR3_XOR 0xf1650001 456#define F0900_ERROR3_XOR 0xf1650001
397 457
398/*DPN3CFG*/ 458/*DPN3CFG*/
399#define R0900_DPN3CFG 0xf166 459#define R0900_DPN3CFG 0xf166
400#define F0900_DPN3_OPD 0xf1660080 460#define F0900_DPN3_OPD 0xf1660080
401#define F0900_DPN3_CONFIG 0xf166007e 461#define F0900_DPN3_CONFIG 0xf166007e
402#define F0900_DPN3_XOR 0xf1660001 462#define F0900_DPN3_XOR 0xf1660001
403 463
404/*STROUT3CFG*/ 464/*STROUT3CFG*/
405#define R0900_STROUT3CFG 0xf167 465#define R0900_STROUT3CFG 0xf167
406#define F0900_STROUT3_OPD 0xf1670080 466#define F0900_STROUT3_OPD 0xf1670080
407#define F0900_STROUT3_CONFIG 0xf167007e 467#define F0900_STROUT3_CONFIG 0xf167007e
408#define F0900_STROUT3_XOR 0xf1670001 468#define F0900_STROUT3_XOR 0xf1670001
409 469
410/*CLKOUT3CFG*/ 470/*CLKOUT3CFG*/
411#define R0900_CLKOUT3CFG 0xf168 471#define R0900_CLKOUT3CFG 0xf168
412#define F0900_CLKOUT3_OPD 0xf1680080 472#define F0900_CLKOUT3_OPD 0xf1680080
413#define F0900_CLKOUT3_CONFIG 0xf168007e 473#define F0900_CLKOUT3_CONFIG 0xf168007e
414#define F0900_CLKOUT3_XOR 0xf1680001 474#define F0900_CLKOUT3_XOR 0xf1680001
415 475
416/*DATA73CFG*/ 476/*DATA73CFG*/
417#define R0900_DATA73CFG 0xf169 477#define R0900_DATA73CFG 0xf169
418#define F0900_DATA73_OPD 0xf1690080 478#define F0900_DATA73_OPD 0xf1690080
419#define F0900_DATA73_CONFIG 0xf169007e 479#define F0900_DATA73_CONFIG 0xf169007e
420#define F0900_DATA73_XOR 0xf1690001 480#define F0900_DATA73_XOR 0xf1690001
481
482/*STRSTATUS1*/
483#define R0900_STRSTATUS1 0xf16a
484#define F0900_STRSTATUS_SEL2 0xf16a00f0
485#define F0900_STRSTATUS_SEL1 0xf16a000f
486
487/*STRSTATUS2*/
488#define R0900_STRSTATUS2 0xf16b
489#define F0900_STRSTATUS_SEL4 0xf16b00f0
490#define F0900_STRSTATUS_SEL3 0xf16b000f
491
492/*STRSTATUS3*/
493#define R0900_STRSTATUS3 0xf16c
494#define F0900_STRSTATUS_SEL6 0xf16c00f0
495#define F0900_STRSTATUS_SEL5 0xf16c000f
421 496
422/*FSKTFC2*/ 497/*FSKTFC2*/
423#define R0900_FSKTFC2 0xf170 498#define R0900_FSKTFC2 0xf170
424#define F0900_FSKT_KMOD 0xf17000fc 499#define F0900_FSKT_KMOD 0xf17000fc
425#define F0900_FSKT_CAR2 0xf1700003 500#define F0900_FSKT_CAR2 0xf1700003
426 501
427/*FSKTFC1*/ 502/*FSKTFC1*/
428#define R0900_FSKTFC1 0xf171 503#define R0900_FSKTFC1 0xf171
429#define F0900_FSKT_CAR1 0xf17100ff 504#define F0900_FSKT_CAR1 0xf17100ff
430 505
431/*FSKTFC0*/ 506/*FSKTFC0*/
432#define R0900_FSKTFC0 0xf172 507#define R0900_FSKTFC0 0xf172
433#define F0900_FSKT_CAR0 0xf17200ff 508#define F0900_FSKT_CAR0 0xf17200ff
434 509
435/*FSKTDELTAF1*/ 510/*FSKTDELTAF1*/
436#define R0900_FSKTDELTAF1 0xf173 511#define R0900_FSKTDELTAF1 0xf173
437#define F0900_FSKT_DELTAF1 0xf173000f 512#define F0900_FSKT_DELTAF1 0xf173000f
438 513
439/*FSKTDELTAF0*/ 514/*FSKTDELTAF0*/
440#define R0900_FSKTDELTAF0 0xf174 515#define R0900_FSKTDELTAF0 0xf174
441#define F0900_FSKT_DELTAF0 0xf17400ff 516#define F0900_FSKT_DELTAF0 0xf17400ff
442 517
443/*FSKTCTRL*/ 518/*FSKTCTRL*/
444#define R0900_FSKTCTRL 0xf175 519#define R0900_FSKTCTRL 0xf175
445#define F0900_FSKT_EN_SGN 0xf1750040 520#define F0900_FSKT_EN_SGN 0xf1750040
446#define F0900_FSKT_MOD_SGN 0xf1750020 521#define F0900_FSKT_MOD_SGN 0xf1750020
447#define F0900_FSKT_MOD_EN 0xf175001c 522#define F0900_FSKT_MOD_EN 0xf175001c
448#define F0900_FSKT_DACMODE 0xf1750003 523#define F0900_FSKT_DACMODE 0xf1750003
449 524
450/*FSKRFC2*/ 525/*FSKRFC2*/
451#define R0900_FSKRFC2 0xf176 526#define R0900_FSKRFC2 0xf176
452#define F0900_FSKR_DETSGN 0xf1760040 527#define F0900_FSKR_DETSGN 0xf1760040
453#define F0900_FSKR_OUTSGN 0xf1760020 528#define F0900_FSKR_OUTSGN 0xf1760020
454#define F0900_FSKR_KAGC 0xf176001c 529#define F0900_FSKR_KAGC 0xf176001c
455#define F0900_FSKR_CAR2 0xf1760003 530#define F0900_FSKR_CAR2 0xf1760003
456 531
457/*FSKRFC1*/ 532/*FSKRFC1*/
458#define R0900_FSKRFC1 0xf177 533#define R0900_FSKRFC1 0xf177
459#define F0900_FSKR_CAR1 0xf17700ff 534#define F0900_FSKR_CAR1 0xf17700ff
460 535
461/*FSKRFC0*/ 536/*FSKRFC0*/
462#define R0900_FSKRFC0 0xf178 537#define R0900_FSKRFC0 0xf178
463#define F0900_FSKR_CAR0 0xf17800ff 538#define F0900_FSKR_CAR0 0xf17800ff
464 539
465/*FSKRK1*/ 540/*FSKRK1*/
466#define R0900_FSKRK1 0xf179 541#define R0900_FSKRK1 0xf179
467#define F0900_FSKR_K1_EXP 0xf17900e0 542#define F0900_FSKR_K1_EXP 0xf17900e0
468#define F0900_FSKR_K1_MANT 0xf179001f 543#define F0900_FSKR_K1_MANT 0xf179001f
469 544
470/*FSKRK2*/ 545/*FSKRK2*/
471#define R0900_FSKRK2 0xf17a 546#define R0900_FSKRK2 0xf17a
472#define F0900_FSKR_K2_EXP 0xf17a00e0 547#define F0900_FSKR_K2_EXP 0xf17a00e0
473#define F0900_FSKR_K2_MANT 0xf17a001f 548#define F0900_FSKR_K2_MANT 0xf17a001f
474 549
475/*FSKRAGCR*/ 550/*FSKRAGCR*/
476#define R0900_FSKRAGCR 0xf17b 551#define R0900_FSKRAGCR 0xf17b
477#define F0900_FSKR_OUTCTL 0xf17b00c0 552#define F0900_FSKR_OUTCTL 0xf17b00c0
478#define F0900_FSKR_AGC_REF 0xf17b003f 553#define F0900_FSKR_AGC_REF 0xf17b003f
479 554
480/*FSKRAGC*/ 555/*FSKRAGC*/
481#define R0900_FSKRAGC 0xf17c 556#define R0900_FSKRAGC 0xf17c
482#define F0900_FSKR_AGC_ACCU 0xf17c00ff 557#define F0900_FSKR_AGC_ACCU 0xf17c00ff
483 558
484/*FSKRALPHA*/ 559/*FSKRALPHA*/
485#define R0900_FSKRALPHA 0xf17d 560#define R0900_FSKRALPHA 0xf17d
486#define F0900_FSKR_ALPHA_EXP 0xf17d001c 561#define F0900_FSKR_ALPHA_EXP 0xf17d001c
487#define F0900_FSKR_ALPHA_M 0xf17d0003 562#define F0900_FSKR_ALPHA_M 0xf17d0003
488 563
489/*FSKRPLTH1*/ 564/*FSKRPLTH1*/
490#define R0900_FSKRPLTH1 0xf17e 565#define R0900_FSKRPLTH1 0xf17e
491#define F0900_FSKR_BETA 0xf17e00f0 566#define F0900_FSKR_BETA 0xf17e00f0
492#define F0900_FSKR_PLL_TRESH1 0xf17e000f 567#define F0900_FSKR_PLL_TRESH1 0xf17e000f
493 568
494/*FSKRPLTH0*/ 569/*FSKRPLTH0*/
495#define R0900_FSKRPLTH0 0xf17f 570#define R0900_FSKRPLTH0 0xf17f
496#define F0900_FSKR_PLL_TRESH0 0xf17f00ff 571#define F0900_FSKR_PLL_TRESH0 0xf17f00ff
497 572
498/*FSKRDF1*/ 573/*FSKRDF1*/
499#define R0900_FSKRDF1 0xf180 574#define R0900_FSKRDF1 0xf180
500#define F0900_FSKR_OUT 0xf1800080 575#define F0900_FSKR_OUT 0xf1800080
501#define F0900_FSKR_DELTAF1 0xf180001f 576#define F0900_FSKR_DELTAF1 0xf180001f
502 577
503/*FSKRDF0*/ 578/*FSKRDF0*/
504#define R0900_FSKRDF0 0xf181 579#define R0900_FSKRDF0 0xf181
505#define F0900_FSKR_DELTAF0 0xf18100ff 580#define F0900_FSKR_DELTAF0 0xf18100ff
506 581
507/*FSKRSTEPP*/ 582/*FSKRSTEPP*/
508#define R0900_FSKRSTEPP 0xf182 583#define R0900_FSKRSTEPP 0xf182
509#define F0900_FSKR_STEP_PLUS 0xf18200ff 584#define F0900_FSKR_STEP_PLUS 0xf18200ff
510 585
511/*FSKRSTEPM*/ 586/*FSKRSTEPM*/
512#define R0900_FSKRSTEPM 0xf183 587#define R0900_FSKRSTEPM 0xf183
513#define F0900_FSKR_STEP_MINUS 0xf18300ff 588#define F0900_FSKR_STEP_MINUS 0xf18300ff
514 589
515/*FSKRDET1*/ 590/*FSKRDET1*/
516#define R0900_FSKRDET1 0xf184 591#define R0900_FSKRDET1 0xf184
517#define F0900_FSKR_DETECT 0xf1840080 592#define F0900_FSKR_DETECT 0xf1840080
518#define F0900_FSKR_CARDET_ACCU1 0xf184000f 593#define F0900_FSKR_CARDET_ACCU1 0xf184000f
519 594
520/*FSKRDET0*/ 595/*FSKRDET0*/
521#define R0900_FSKRDET0 0xf185 596#define R0900_FSKRDET0 0xf185
522#define F0900_FSKR_CARDET_ACCU0 0xf18500ff 597#define F0900_FSKR_CARDET_ACCU0 0xf18500ff
523 598
524/*FSKRDTH1*/ 599/*FSKRDTH1*/
525#define R0900_FSKRDTH1 0xf186 600#define R0900_FSKRDTH1 0xf186
526#define F0900_FSKR_CARLOSS_THRESH1 0xf18600f0 601#define F0900_FSKR_CARLOSS_THRESH1 0xf18600f0
527#define F0900_FSKR_CARDET_THRESH1 0xf186000f 602#define F0900_FSKR_CARDET_THRESH1 0xf186000f
528 603
529/*FSKRDTH0*/ 604/*FSKRDTH0*/
530#define R0900_FSKRDTH0 0xf187 605#define R0900_FSKRDTH0 0xf187
531#define F0900_FSKR_CARDET_THRESH0 0xf18700ff 606#define F0900_FSKR_CARDET_THRESH0 0xf18700ff
532 607
533/*FSKRLOSS*/ 608/*FSKRLOSS*/
534#define R0900_FSKRLOSS 0xf188 609#define R0900_FSKRLOSS 0xf188
535#define F0900_FSKR_CARLOSS_THRESH0 0xf18800ff 610#define F0900_FSKR_CARLOSS_THRESH0 0xf18800ff
536 611
537/*P2_DISTXCTL*/ 612/*P2_DISTXCTL*/
538#define R0900_P2_DISTXCTL 0xf190 613#define R0900_P2_DISTXCTL 0xf190
539#define F0900_P2_TIM_OFF 0xf1900080 614#define F0900_P2_TIM_OFF 0xf1900080
540#define F0900_P2_DISEQC_RESET 0xf1900040 615#define F0900_P2_DISEQC_RESET 0xf1900040
541#define F0900_P2_TIM_CMD 0xf1900030 616#define F0900_P2_TIM_CMD 0xf1900030
542#define F0900_P2_DIS_PRECHARGE 0xf1900008 617#define F0900_P2_DIS_PRECHARGE 0xf1900008
543#define F0900_P2_DISTX_MODE 0xf1900007 618#define F0900_P2_DISTX_MODE 0xf1900007
544 619
545/*P2_DISRXCTL*/ 620/*P2_DISRXCTL*/
546#define R0900_P2_DISRXCTL 0xf191 621#define R0900_P2_DISRXCTL 0xf191
547#define F0900_P2_RECEIVER_ON 0xf1910080 622#define F0900_P2_RECEIVER_ON 0xf1910080
548#define F0900_P2_IGNO_SHORT22K 0xf1910040 623#define F0900_P2_IGNO_SHORT22K 0xf1910040
549#define F0900_P2_ONECHIP_TRX 0xf1910020 624#define F0900_P2_ONECHIP_TRX 0xf1910020
550#define F0900_P2_EXT_ENVELOP 0xf1910010 625#define F0900_P2_EXT_ENVELOP 0xf1910010
551#define F0900_P2_PIN_SELECT 0xf191000c 626#define F0900_P2_PIN_SELECT0 0xf191000c
552#define F0900_P2_IRQ_RXEND 0xf1910002 627#define F0900_P2_IRQ_RXEND 0xf1910002
553#define F0900_P2_IRQ_4NBYTES 0xf1910001 628#define F0900_P2_IRQ_4NBYTES 0xf1910001
554 629
555/*P2_DISRX_ST0*/ 630/*P2_DISRX_ST0*/
556#define R0900_P2_DISRX_ST0 0xf194 631#define R0900_P2_DISRX_ST0 0xf194
557#define F0900_P2_RX_END 0xf1940080 632#define F0900_P2_RX_END 0xf1940080
558#define F0900_P2_RX_ACTIVE 0xf1940040 633#define F0900_P2_RX_ACTIVE 0xf1940040
559#define F0900_P2_SHORT_22KHZ 0xf1940020 634#define F0900_P2_SHORT_22KHZ 0xf1940020
560#define F0900_P2_CONT_TONE 0xf1940010 635#define F0900_P2_CONT_TONE 0xf1940010
561#define F0900_P2_FIFO_4BREADY 0xf1940008 636#define F0900_P2_FIFO_4BREADY 0xf1940008
562#define F0900_P2_FIFO_EMPTY 0xf1940004 637#define F0900_P2_FIFO_EMPTY 0xf1940004
563#define F0900_P2_ABORT_DISRX 0xf1940001 638#define F0900_P2_ABORT_DISRX 0xf1940001
564 639
565/*P2_DISRX_ST1*/ 640/*P2_DISRX_ST1*/
566#define R0900_P2_DISRX_ST1 0xf195 641#define R0900_P2_DISRX_ST1 0xf195
567#define F0900_P2_RX_FAIL 0xf1950080 642#define F0900_P2_RX_FAIL 0xf1950080
568#define F0900_P2_FIFO_PARITYFAIL 0xf1950040 643#define F0900_P2_FIFO_PARITYFAIL 0xf1950040
569#define F0900_P2_RX_NONBYTE 0xf1950020 644#define F0900_P2_RX_NONBYTE 0xf1950020
570#define F0900_P2_FIFO_OVERFLOW 0xf1950010 645#define F0900_P2_FIFO_OVERFLOW 0xf1950010
571#define F0900_P2_FIFO_BYTENBR 0xf195000f 646#define F0900_P2_FIFO_BYTENBR 0xf195000f
572 647
573/*P2_DISRXDATA*/ 648/*P2_DISRXDATA*/
574#define R0900_P2_DISRXDATA 0xf196 649#define R0900_P2_DISRXDATA 0xf196
575#define F0900_P2_DISRX_DATA 0xf19600ff 650#define F0900_P2_DISRX_DATA 0xf19600ff
576 651
577/*P2_DISTXDATA*/ 652/*P2_DISTXDATA*/
578#define R0900_P2_DISTXDATA 0xf197 653#define R0900_P2_DISTXDATA 0xf197
579#define F0900_P2_DISEQC_FIFO 0xf19700ff 654#define F0900_P2_DISEQC_FIFO 0xf19700ff
580 655
581/*P2_DISTXSTATUS*/ 656/*P2_DISTXSTATUS*/
582#define R0900_P2_DISTXSTATUS 0xf198 657#define R0900_P2_DISTXSTATUS 0xf198
583#define F0900_P2_TX_FAIL 0xf1980080 658#define F0900_P2_TX_FAIL 0xf1980080
584#define F0900_P2_FIFO_FULL 0xf1980040 659#define F0900_P2_FIFO_FULL 0xf1980040
585#define F0900_P2_TX_IDLE 0xf1980020 660#define F0900_P2_TX_IDLE 0xf1980020
586#define F0900_P2_GAP_BURST 0xf1980010 661#define F0900_P2_GAP_BURST 0xf1980010
587#define F0900_P2_TXFIFO_BYTES 0xf198000f 662#define F0900_P2_TXFIFO_BYTES 0xf198000f
588 663
589/*P2_F22TX*/ 664/*P2_F22TX*/
590#define R0900_P2_F22TX 0xf199 665#define R0900_P2_F22TX 0xf199
591#define F0900_P2_F22_REG 0xf19900ff 666#define F0900_P2_F22_REG 0xf19900ff
592 667
593/*P2_F22RX*/ 668/*P2_F22RX*/
594#define R0900_P2_F22RX 0xf19a 669#define R0900_P2_F22RX 0xf19a
595#define F0900_P2_F22RX_REG 0xf19a00ff 670#define F0900_P2_F22RX_REG 0xf19a00ff
596 671
597/*P2_ACRPRESC*/ 672/*P2_ACRPRESC*/
598#define R0900_P2_ACRPRESC 0xf19c 673#define R0900_P2_ACRPRESC 0xf19c
599#define F0900_P2_ACR_CODFRDY 0xf19c0008 674#define F0900_P2_ACR_PRESC 0xf19c0007
600#define F0900_P2_ACR_PRESC 0xf19c0007
601 675
602/*P2_ACRDIV*/ 676/*P2_ACRDIV*/
603#define R0900_P2_ACRDIV 0xf19d 677#define R0900_P2_ACRDIV 0xf19d
604#define F0900_P2_ACR_DIV 0xf19d00ff 678#define F0900_P2_ACR_DIV 0xf19d00ff
605 679
606/*P1_DISTXCTL*/ 680/*P1_DISTXCTL*/
607#define R0900_P1_DISTXCTL 0xf1a0 681#define R0900_P1_DISTXCTL 0xf1a0
608#define F0900_P1_TIM_OFF 0xf1a00080 682#define DISTXCTL shiftx(R0900_P1_DISTXCTL, demod, 0x10)
609#define F0900_P1_DISEQC_RESET 0xf1a00040 683#define F0900_P1_TIM_OFF 0xf1a00080
610#define F0900_P1_TIM_CMD 0xf1a00030 684#define F0900_P1_DISEQC_RESET 0xf1a00040
611#define F0900_P1_DIS_PRECHARGE 0xf1a00008 685#define DISEQC_RESET shiftx(F0900_P1_DISEQC_RESET, demod, 0x100000)
612#define F0900_P1_DISTX_MODE 0xf1a00007 686#define F0900_P1_TIM_CMD 0xf1a00030
687#define F0900_P1_DIS_PRECHARGE 0xf1a00008
688#define DIS_PRECHARGE shiftx(F0900_P1_DIS_PRECHARGE, demod, 0x100000)
689#define F0900_P1_DISTX_MODE 0xf1a00007
690#define DISTX_MODE shiftx(F0900_P1_DISTX_MODE, demod, 0x100000)
613 691
614/*P1_DISRXCTL*/ 692/*P1_DISRXCTL*/
615#define R0900_P1_DISRXCTL 0xf1a1 693#define R0900_P1_DISRXCTL 0xf1a1
616#define F0900_P1_RECEIVER_ON 0xf1a10080 694#define DISRXCTL shiftx(R0900_P1_DISRXCTL, demod, 0x10)
617#define F0900_P1_IGNO_SHORT22K 0xf1a10040 695#define F0900_P1_RECEIVER_ON 0xf1a10080
618#define F0900_P1_ONECHIP_TRX 0xf1a10020 696#define F0900_P1_IGNO_SHORT22K 0xf1a10040
619#define F0900_P1_EXT_ENVELOP 0xf1a10010 697#define F0900_P1_ONECHIP_TRX 0xf1a10020
620#define F0900_P1_PIN_SELECT 0xf1a1000c 698#define F0900_P1_EXT_ENVELOP 0xf1a10010
621#define F0900_P1_IRQ_RXEND 0xf1a10002 699#define F0900_P1_PIN_SELECT0 0xf1a1000c
622#define F0900_P1_IRQ_4NBYTES 0xf1a10001 700#define F0900_P1_IRQ_RXEND 0xf1a10002
701#define F0900_P1_IRQ_4NBYTES 0xf1a10001
623 702
624/*P1_DISRX_ST0*/ 703/*P1_DISRX_ST0*/
625#define R0900_P1_DISRX_ST0 0xf1a4 704#define R0900_P1_DISRX_ST0 0xf1a4
626#define F0900_P1_RX_END 0xf1a40080 705#define DISRX_ST0 shiftx(R0900_P1_DISRX_ST0, demod, 0x10)
627#define F0900_P1_RX_ACTIVE 0xf1a40040 706#define F0900_P1_RX_END 0xf1a40080
628#define F0900_P1_SHORT_22KHZ 0xf1a40020 707#define RX_END shiftx(F0900_P1_RX_END, demod, 0x100000)
629#define F0900_P1_CONT_TONE 0xf1a40010 708#define F0900_P1_RX_ACTIVE 0xf1a40040
630#define F0900_P1_FIFO_4BREADY 0xf1a40008 709#define F0900_P1_SHORT_22KHZ 0xf1a40020
631#define F0900_P1_FIFO_EMPTY 0xf1a40004 710#define F0900_P1_CONT_TONE 0xf1a40010
632#define F0900_P1_ABORT_DISRX 0xf1a40001 711#define F0900_P1_FIFO_4BREADY 0xf1a40008
712#define F0900_P1_FIFO_EMPTY 0xf1a40004
713#define F0900_P1_ABORT_DISRX 0xf1a40001
633 714
634/*P1_DISRX_ST1*/ 715/*P1_DISRX_ST1*/
635#define R0900_P1_DISRX_ST1 0xf1a5 716#define R0900_P1_DISRX_ST1 0xf1a5
636#define F0900_P1_RX_FAIL 0xf1a50080 717#define DISRX_ST1 shiftx(R0900_P1_DISRX_ST1, demod, 0x10)
637#define F0900_P1_FIFO_PARITYFAIL 0xf1a50040 718#define F0900_P1_RX_FAIL 0xf1a50080
638#define F0900_P1_RX_NONBYTE 0xf1a50020 719#define F0900_P1_FIFO_PARITYFAIL 0xf1a50040
639#define F0900_P1_FIFO_OVERFLOW 0xf1a50010 720#define F0900_P1_RX_NONBYTE 0xf1a50020
640#define F0900_P1_FIFO_BYTENBR 0xf1a5000f 721#define F0900_P1_FIFO_OVERFLOW 0xf1a50010
722#define F0900_P1_FIFO_BYTENBR 0xf1a5000f
723#define FIFO_BYTENBR shiftx(F0900_P1_FIFO_BYTENBR, demod, 0x100000)
641 724
642/*P1_DISRXDATA*/ 725/*P1_DISRXDATA*/
643#define R0900_P1_DISRXDATA 0xf1a6 726#define R0900_P1_DISRXDATA 0xf1a6
644#define F0900_P1_DISRX_DATA 0xf1a600ff 727#define DISRXDATA shiftx(R0900_P1_DISRXDATA, demod, 0x10)
728#define F0900_P1_DISRX_DATA 0xf1a600ff
645 729
646/*P1_DISTXDATA*/ 730/*P1_DISTXDATA*/
647#define R0900_P1_DISTXDATA 0xf1a7 731#define R0900_P1_DISTXDATA 0xf1a7
648#define F0900_P1_DISEQC_FIFO 0xf1a700ff 732#define DISTXDATA shiftx(R0900_P1_DISTXDATA, demod, 0x10)
733#define F0900_P1_DISEQC_FIFO 0xf1a700ff
649 734
650/*P1_DISTXSTATUS*/ 735/*P1_DISTXSTATUS*/
651#define R0900_P1_DISTXSTATUS 0xf1a8 736#define R0900_P1_DISTXSTATUS 0xf1a8
652#define F0900_P1_TX_FAIL 0xf1a80080 737#define F0900_P1_TX_FAIL 0xf1a80080
653#define F0900_P1_FIFO_FULL 0xf1a80040 738#define F0900_P1_FIFO_FULL 0xf1a80040
654#define F0900_P1_TX_IDLE 0xf1a80020 739#define FIFO_FULL shiftx(F0900_P1_FIFO_FULL, demod, 0x100000)
655#define F0900_P1_GAP_BURST 0xf1a80010 740#define F0900_P1_TX_IDLE 0xf1a80020
656#define F0900_P1_TXFIFO_BYTES 0xf1a8000f 741#define TX_IDLE shiftx(F0900_P1_TX_IDLE, demod, 0x100000)
742#define F0900_P1_GAP_BURST 0xf1a80010
743#define F0900_P1_TXFIFO_BYTES 0xf1a8000f
657 744
658/*P1_F22TX*/ 745/*P1_F22TX*/
659#define R0900_P1_F22TX 0xf1a9 746#define R0900_P1_F22TX 0xf1a9
660#define F0900_P1_F22_REG 0xf1a900ff 747#define F22TX shiftx(R0900_P1_F22TX, demod, 0x10)
748#define F0900_P1_F22_REG 0xf1a900ff
661 749
662/*P1_F22RX*/ 750/*P1_F22RX*/
663#define R0900_P1_F22RX 0xf1aa 751#define R0900_P1_F22RX 0xf1aa
664#define F0900_P1_F22RX_REG 0xf1aa00ff 752#define F22RX shiftx(R0900_P1_F22RX, demod, 0x10)
753#define F0900_P1_F22RX_REG 0xf1aa00ff
665 754
666/*P1_ACRPRESC*/ 755/*P1_ACRPRESC*/
667#define R0900_P1_ACRPRESC 0xf1ac 756#define R0900_P1_ACRPRESC 0xf1ac
668#define F0900_P1_ACR_CODFRDY 0xf1ac0008 757#define ACRPRESC shiftx(R0900_P1_ACRPRESC, demod, 0x10)
669#define F0900_P1_ACR_PRESC 0xf1ac0007 758#define F0900_P1_ACR_PRESC 0xf1ac0007
670 759
671/*P1_ACRDIV*/ 760/*P1_ACRDIV*/
672#define R0900_P1_ACRDIV 0xf1ad 761#define R0900_P1_ACRDIV 0xf1ad
673#define F0900_P1_ACR_DIV 0xf1ad00ff 762#define ACRDIV shiftx(R0900_P1_ACRDIV, demod, 0x10)
763#define F0900_P1_ACR_DIV 0xf1ad00ff
674 764
675/*NCOARSE*/ 765/*NCOARSE*/
676#define R0900_NCOARSE 0xf1b3 766#define R0900_NCOARSE 0xf1b3
677#define F0900_M_DIV 0xf1b300ff 767#define F0900_M_DIV 0xf1b300ff
678 768
679/*SYNTCTRL*/ 769/*SYNTCTRL*/
680#define R0900_SYNTCTRL 0xf1b6 770#define R0900_SYNTCTRL 0xf1b6
681#define F0900_STANDBY 0xf1b60080 771#define F0900_STANDBY 0xf1b60080
682#define F0900_BYPASSPLLCORE 0xf1b60040 772#define F0900_BYPASSPLLCORE 0xf1b60040
683#define F0900_SELX1RATIO 0xf1b60020 773#define F0900_SELX1RATIO 0xf1b60020
684#define F0900_I2C_TUD 0xf1b60010 774#define F0900_STOP_PLL 0xf1b60008
685#define F0900_STOP_PLL 0xf1b60008 775#define F0900_BYPASSPLLFSK 0xf1b60004
686#define F0900_BYPASSPLLFSK 0xf1b60004 776#define F0900_SELOSCI 0xf1b60002
687#define F0900_SELOSCI 0xf1b60002 777#define F0900_BYPASSPLLADC 0xf1b60001
688#define F0900_BYPASSPLLADC 0xf1b60001
689 778
690/*FILTCTRL*/ 779/*FILTCTRL*/
691#define R0900_FILTCTRL 0xf1b7 780#define R0900_FILTCTRL 0xf1b7
692#define F0900_INV_CLK135 0xf1b70080 781#define F0900_INV_CLK135 0xf1b70080
693#define F0900_PERM_BYPDIS 0xf1b70040 782#define F0900_SEL_FSKCKDIV 0xf1b70004
694#define F0900_SEL_FSKCKDIV 0xf1b70004 783#define F0900_INV_CLKFSK 0xf1b70002
695#define F0900_INV_CLKFSK 0xf1b70002 784#define F0900_BYPASS_APPLI 0xf1b70001
696#define F0900_BYPASS_APPLI 0xf1b70001
697 785
698/*PLLSTAT*/ 786/*PLLSTAT*/
699#define R0900_PLLSTAT 0xf1b8 787#define R0900_PLLSTAT 0xf1b8
700#define F0900_ACM_SEL 0xf1b80080 788#define F0900_PLLLOCK 0xf1b80001
701#define F0900_DTV_SEL 0xf1b80040
702#define F0900_PLLLOCK 0xf1b80001
703 789
704/*STOPCLK1*/ 790/*STOPCLK1*/
705#define R0900_STOPCLK1 0xf1c2 791#define R0900_STOPCLK1 0xf1c2
706#define F0900_STOP_CLKPKDT2 0xf1c20040 792#define F0900_STOP_CLKPKDT2 0xf1c20040
707#define F0900_STOP_CLKPKDT1 0xf1c20020 793#define F0900_STOP_CLKPKDT1 0xf1c20020
708#define F0900_STOP_CLKFEC 0xf1c20010 794#define F0900_STOP_CLKFEC 0xf1c20010
709#define F0900_STOP_CLKADCI2 0xf1c20008 795#define F0900_STOP_CLKADCI2 0xf1c20008
710#define F0900_INV_CLKADCI2 0xf1c20004 796#define F0900_INV_CLKADCI2 0xf1c20004
711#define F0900_STOP_CLKADCI1 0xf1c20002 797#define F0900_STOP_CLKADCI1 0xf1c20002
712#define F0900_INV_CLKADCI1 0xf1c20001 798#define F0900_INV_CLKADCI1 0xf1c20001
713 799
714/*STOPCLK2*/ 800/*STOPCLK2*/
715#define R0900_STOPCLK2 0xf1c3 801#define R0900_STOPCLK2 0xf1c3
716#define F0900_STOP_CLKSAMP2 0xf1c30010 802#define F0900_STOP_CLKSAMP2 0xf1c30010
717#define F0900_STOP_CLKSAMP1 0xf1c30008 803#define F0900_STOP_CLKSAMP1 0xf1c30008
718#define F0900_STOP_CLKVIT2 0xf1c30004 804#define F0900_STOP_CLKVIT2 0xf1c30004
719#define F0900_STOP_CLKVIT1 0xf1c30002 805#define F0900_STOP_CLKVIT1 0xf1c30002
720#define F0900_STOP_CLKTS 0xf1c30001 806#define STOP_CLKVIT shiftx(F0900_STOP_CLKVIT1, demod, -2)
807#define F0900_STOP_CLKTS 0xf1c30001
721 808
722/*TSTTNR0*/ 809/*TSTTNR0*/
723#define R0900_TSTTNR0 0xf1df 810#define R0900_TSTTNR0 0xf1df
724#define F0900_SEL_FSK 0xf1df0080 811#define F0900_SEL_FSK 0xf1df0080
725#define F0900_FSK_PON 0xf1df0004 812#define F0900_FSK_PON 0xf1df0004
726#define F0900_FSK_OPENLOOP 0xf1df0002
727 813
728/*TSTTNR1*/ 814/*TSTTNR1*/
729#define R0900_TSTTNR1 0xf1e0 815#define R0900_TSTTNR1 0xf1e0
730#define F0900_BYPASS_ADC1 0xf1e00080 816#define F0900_ADC1_PON 0xf1e00002
731#define F0900_INVADC1_CKOUT 0xf1e00040 817#define F0900_ADC1_INMODE 0xf1e00001
732#define F0900_SELIQSRC1 0xf1e00030
733#define F0900_ADC1_PON 0xf1e00002
734#define F0900_ADC1_INMODE 0xf1e00001
735 818
736/*TSTTNR2*/ 819/*TSTTNR2*/
737#define R0900_TSTTNR2 0xf1e1 820#define R0900_TSTTNR2 0xf1e1
738#define F0900_DISEQC1_PON 0xf1e10020 821#define F0900_DISEQC1_PON 0xf1e10020
739#define F0900_DISEQC1_TEST 0xf1e1001f
740 822
741/*TSTTNR3*/ 823/*TSTTNR3*/
742#define R0900_TSTTNR3 0xf1e2 824#define R0900_TSTTNR3 0xf1e2
743#define F0900_BYPASS_ADC2 0xf1e20080 825#define F0900_ADC2_PON 0xf1e20002
744#define F0900_INVADC2_CKOUT 0xf1e20040 826#define F0900_ADC2_INMODE 0xf1e20001
745#define F0900_SELIQSRC2 0xf1e20030
746#define F0900_ADC2_PON 0xf1e20002
747#define F0900_ADC2_INMODE 0xf1e20001
748 827
749/*TSTTNR4*/ 828/*TSTTNR4*/
750#define R0900_TSTTNR4 0xf1e3 829#define R0900_TSTTNR4 0xf1e3
751#define F0900_DISEQC2_PON 0xf1e30020 830#define F0900_DISEQC2_PON 0xf1e30020
752#define F0900_DISEQC2_TEST 0xf1e3001f
753 831
754/*P2_IQCONST*/ 832/*P2_IQCONST*/
755#define R0900_P2_IQCONST 0xf200 833#define R0900_P2_IQCONST 0xf200
756#define F0900_P2_CONSTEL_SELECT 0xf2000060 834#define F0900_P2_CONSTEL_SELECT 0xf2000060
757#define F0900_P2_IQSYMB_SEL 0xf200001f 835#define F0900_P2_IQSYMB_SEL 0xf200001f
758 836
759/*P2_NOSCFG*/ 837/*P2_NOSCFG*/
760#define R0900_P2_NOSCFG 0xf201 838#define R0900_P2_NOSCFG 0xf201
761#define F0900_P2_DUMMYPL_NOSDATA 0xf2010020 839#define F0900_P2_DUMMYPL_NOSDATA 0xf2010020
762#define F0900_P2_NOSPLH_BETA 0xf2010018 840#define F0900_P2_NOSPLH_BETA 0xf2010018
763#define F0900_P2_NOSDATA_BETA 0xf2010007 841#define F0900_P2_NOSDATA_BETA 0xf2010007
764 842
765/*P2_ISYMB*/ 843/*P2_ISYMB*/
766#define R0900_P2_ISYMB 0xf202 844#define R0900_P2_ISYMB 0xf202
767#define F0900_P2_I_SYMBOL 0xf20201ff 845#define F0900_P2_I_SYMBOL 0xf20201ff
768 846
769/*P2_QSYMB*/ 847/*P2_QSYMB*/
770#define R0900_P2_QSYMB 0xf203 848#define R0900_P2_QSYMB 0xf203
771#define F0900_P2_Q_SYMBOL 0xf20301ff 849#define F0900_P2_Q_SYMBOL 0xf20301ff
772 850
773/*P2_AGC1CFG*/ 851/*P2_AGC1CFG*/
774#define R0900_P2_AGC1CFG 0xf204 852#define R0900_P2_AGC1CFG 0xf204
775#define F0900_P2_DC_FROZEN 0xf2040080 853#define F0900_P2_DC_FROZEN 0xf2040080
776#define F0900_P2_DC_CORRECT 0xf2040040 854#define F0900_P2_DC_CORRECT 0xf2040040
777#define F0900_P2_AMM_FROZEN 0xf2040020 855#define F0900_P2_AMM_FROZEN 0xf2040020
778#define F0900_P2_AMM_CORRECT 0xf2040010 856#define F0900_P2_AMM_CORRECT 0xf2040010
779#define F0900_P2_QUAD_FROZEN 0xf2040008 857#define F0900_P2_QUAD_FROZEN 0xf2040008
780#define F0900_P2_QUAD_CORRECT 0xf2040004 858#define F0900_P2_QUAD_CORRECT 0xf2040004
781#define F0900_P2_DCCOMP_SLOW 0xf2040002
782#define F0900_P2_IQMISM_SLOW 0xf2040001
783 859
784/*P2_AGC1CN*/ 860/*P2_AGC1CN*/
785#define R0900_P2_AGC1CN 0xf206 861#define R0900_P2_AGC1CN 0xf206
786#define F0900_P2_AGC1_LOCKED 0xf2060080 862#define F0900_P2_AGC1_LOCKED 0xf2060080
787#define F0900_P2_AGC1_OVERFLOW 0xf2060040 863#define F0900_P2_AGC1_MINPOWER 0xf2060010
788#define F0900_P2_AGC1_NOSLOWLK 0xf2060020 864#define F0900_P2_AGCOUT_FAST 0xf2060008
789#define F0900_P2_AGC1_MINPOWER 0xf2060010 865#define F0900_P2_AGCIQ_BETA 0xf2060007
790#define F0900_P2_AGCOUT_FAST 0xf2060008
791#define F0900_P2_AGCIQ_BETA 0xf2060007
792 866
793/*P2_AGC1REF*/ 867/*P2_AGC1REF*/
794#define R0900_P2_AGC1REF 0xf207 868#define R0900_P2_AGC1REF 0xf207
795#define F0900_P2_AGCIQ_REF 0xf20700ff 869#define F0900_P2_AGCIQ_REF 0xf20700ff
796 870
797/*P2_IDCCOMP*/ 871/*P2_IDCCOMP*/
798#define R0900_P2_IDCCOMP 0xf208 872#define R0900_P2_IDCCOMP 0xf208
799#define F0900_P2_IAVERAGE_ADJ 0xf20801ff 873#define F0900_P2_IAVERAGE_ADJ 0xf20801ff
800 874
801/*P2_QDCCOMP*/ 875/*P2_QDCCOMP*/
802#define R0900_P2_QDCCOMP 0xf209 876#define R0900_P2_QDCCOMP 0xf209
803#define F0900_P2_QAVERAGE_ADJ 0xf20901ff 877#define F0900_P2_QAVERAGE_ADJ 0xf20901ff
804 878
805/*P2_POWERI*/ 879/*P2_POWERI*/
806#define R0900_P2_POWERI 0xf20a 880#define R0900_P2_POWERI 0xf20a
807#define F0900_P2_POWER_I 0xf20a00ff 881#define F0900_P2_POWER_I 0xf20a00ff
808 882
809/*P2_POWERQ*/ 883/*P2_POWERQ*/
810#define R0900_P2_POWERQ 0xf20b 884#define R0900_P2_POWERQ 0xf20b
811#define F0900_P2_POWER_Q 0xf20b00ff 885#define F0900_P2_POWER_Q 0xf20b00ff
812 886
813/*P2_AGC1AMM*/ 887/*P2_AGC1AMM*/
814#define R0900_P2_AGC1AMM 0xf20c 888#define R0900_P2_AGC1AMM 0xf20c
815#define F0900_P2_AMM_VALUE 0xf20c00ff 889#define F0900_P2_AMM_VALUE 0xf20c00ff
816 890
817/*P2_AGC1QUAD*/ 891/*P2_AGC1QUAD*/
818#define R0900_P2_AGC1QUAD 0xf20d 892#define R0900_P2_AGC1QUAD 0xf20d
819#define F0900_P2_QUAD_VALUE 0xf20d01ff 893#define F0900_P2_QUAD_VALUE 0xf20d01ff
820 894
821/*P2_AGCIQIN1*/ 895/*P2_AGCIQIN1*/
822#define R0900_P2_AGCIQIN1 0xf20e 896#define R0900_P2_AGCIQIN1 0xf20e
823#define F0900_P2_AGCIQ_VALUE1 0xf20e00ff 897#define F0900_P2_AGCIQ_VALUE1 0xf20e00ff
824 898
825/*P2_AGCIQIN0*/ 899/*P2_AGCIQIN0*/
826#define R0900_P2_AGCIQIN0 0xf20f 900#define R0900_P2_AGCIQIN0 0xf20f
827#define F0900_P2_AGCIQ_VALUE0 0xf20f00ff 901#define F0900_P2_AGCIQ_VALUE0 0xf20f00ff
828 902
829/*P2_DEMOD*/ 903/*P2_DEMOD*/
830#define R0900_P2_DEMOD 0xf210 904#define R0900_P2_DEMOD 0xf210
831#define F0900_P2_DEMOD_STOP 0xf2100040 905#define F0900_P2_MANUALS2_ROLLOFF 0xf2100080
832#define F0900_P2_SPECINV_CONTROL 0xf2100030 906#define F0900_P2_SPECINV_CONTROL 0xf2100030
833#define F0900_P2_FORCE_ENASAMP 0xf2100008 907#define F0900_P2_FORCE_ENASAMP 0xf2100008
834#define F0900_P2_MANUAL_ROLLOFF 0xf2100004 908#define F0900_P2_MANUALSX_ROLLOFF 0xf2100004
835#define F0900_P2_ROLLOFF_CONTROL 0xf2100003 909#define F0900_P2_ROLLOFF_CONTROL 0xf2100003
836 910
837/*P2_DMDMODCOD*/ 911/*P2_DMDMODCOD*/
838#define R0900_P2_DMDMODCOD 0xf211 912#define R0900_P2_DMDMODCOD 0xf211
839#define F0900_P2_MANUAL_MODCOD 0xf2110080 913#define F0900_P2_MANUAL_MODCOD 0xf2110080
840#define F0900_P2_DEMOD_MODCOD 0xf211007c 914#define F0900_P2_DEMOD_MODCOD 0xf211007c
841#define F0900_P2_DEMOD_TYPE 0xf2110003 915#define F0900_P2_DEMOD_TYPE 0xf2110003
842 916
843/*P2_DSTATUS*/ 917/*P2_DSTATUS*/
844#define R0900_P2_DSTATUS 0xf212 918#define R0900_P2_DSTATUS 0xf212
845#define F0900_P2_CAR_LOCK 0xf2120080 919#define F0900_P2_CAR_LOCK 0xf2120080
846#define F0900_P2_TMGLOCK_QUALITY 0xf2120060 920#define F0900_P2_TMGLOCK_QUALITY 0xf2120060
847#define F0900_P2_SDVBS1_ENABLE 0xf2120010 921#define F0900_P2_LOCK_DEFINITIF 0xf2120008
848#define F0900_P2_LOCK_DEFINITIF 0xf2120008 922#define F0900_P2_OVADC_DETECT 0xf2120001
849#define F0900_P2_TIMING_IS_LOCKED 0xf2120004
850#define F0900_P2_COARSE_TMGLOCK 0xf2120002
851#define F0900_P2_COARSE_CARLOCK 0xf2120001
852 923
853/*P2_DSTATUS2*/ 924/*P2_DSTATUS2*/
854#define R0900_P2_DSTATUS2 0xf213 925#define R0900_P2_DSTATUS2 0xf213
855#define F0900_P2_DEMOD_DELOCK 0xf2130080 926#define F0900_P2_DEMOD_DELOCK 0xf2130080
856#define F0900_P2_DEMOD_TIMEOUT 0xf2130040 927#define F0900_P2_AGC1_NOSIGNALACK 0xf2130008
857#define F0900_P2_MODCODRQ_SYNCTAG 0xf2130020 928#define F0900_P2_AGC2_OVERFLOW 0xf2130004
858#define F0900_P2_POLYPH_SATEVENT 0xf2130010 929#define F0900_P2_CFR_OVERFLOW 0xf2130002
859#define F0900_P2_AGC1_NOSIGNALACK 0xf2130008 930#define F0900_P2_GAMMA_OVERUNDER 0xf2130001
860#define F0900_P2_AGC2_OVERFLOW 0xf2130004
861#define F0900_P2_CFR_OVERFLOW 0xf2130002
862#define F0900_P2_GAMMA_OVERUNDER 0xf2130001
863 931
864/*P2_DMDCFGMD*/ 932/*P2_DMDCFGMD*/
865#define R0900_P2_DMDCFGMD 0xf214 933#define R0900_P2_DMDCFGMD 0xf214
866#define F0900_P2_DVBS2_ENABLE 0xf2140080 934#define F0900_P2_DVBS2_ENABLE 0xf2140080
867#define F0900_P2_DVBS1_ENABLE 0xf2140040 935#define F0900_P2_DVBS1_ENABLE 0xf2140040
868#define F0900_P2_CFR_AUTOSCAN 0xf2140020 936#define F0900_P2_SCAN_ENABLE 0xf2140010
869#define F0900_P2_SCAN_ENABLE 0xf2140010 937#define F0900_P2_CFR_AUTOSCAN 0xf2140008
870#define F0900_P2_TUN_AUTOSCAN 0xf2140008 938#define F0900_P2_TUN_RNG 0xf2140003
871#define F0900_P2_NOFORCE_RELOCK 0xf2140004
872#define F0900_P2_TUN_RNG 0xf2140003
873 939
874/*P2_DMDCFG2*/ 940/*P2_DMDCFG2*/
875#define R0900_P2_DMDCFG2 0xf215 941#define R0900_P2_DMDCFG2 0xf215
876#define F0900_P2_AGC1_WAITLOCK 0xf2150080 942#define F0900_P2_S1S2_SEQUENTIAL 0xf2150040
877#define F0900_P2_S1S2_SEQUENTIAL 0xf2150040 943#define F0900_P2_INFINITE_RELOCK 0xf2150010
878#define F0900_P2_OVERFLOW_TIMEOUT 0xf2150020
879#define F0900_P2_SCANFAIL_TIMEOUT 0xf2150010
880#define F0900_P2_DMDTOUT_BACK 0xf2150008
881#define F0900_P2_CARLOCK_S1ENABLE 0xf2150004
882#define F0900_P2_COARSE_LK3MODE 0xf2150002
883#define F0900_P2_COARSE_LK2MODE 0xf2150001
884 944
885/*P2_DMDISTATE*/ 945/*P2_DMDISTATE*/
886#define R0900_P2_DMDISTATE 0xf216 946#define R0900_P2_DMDISTATE 0xf216
887#define F0900_P2_I2C_NORESETDMODE 0xf2160080 947#define F0900_P2_I2C_DEMOD_MODE 0xf216001f
888#define F0900_P2_FORCE_ETAPED 0xf2160040
889#define F0900_P2_SDMDRST_DIRCLK 0xf2160020
890#define F0900_P2_I2C_DEMOD_MODE 0xf216001f
891 948
892/*P2_DMDT0M*/ 949/*P2_DMDT0M*/
893#define R0900_P2_DMDT0M 0xf217 950#define R0900_P2_DMDT0M 0xf217
894#define F0900_P2_DMDT0_MIN 0xf21700ff 951#define F0900_P2_DMDT0_MIN 0xf21700ff
895 952
896/*P2_DMDSTATE*/ 953/*P2_DMDSTATE*/
897#define R0900_P2_DMDSTATE 0xf21b 954#define R0900_P2_DMDSTATE 0xf21b
898#define F0900_P2_DEMOD_LOCKED 0xf21b0080 955#define F0900_P2_HEADER_MODE 0xf21b0060
899#define F0900_P2_HEADER_MODE 0xf21b0060
900#define F0900_P2_DEMOD_MODE 0xf21b001f
901 956
902/*P2_DMDFLYW*/ 957/*P2_DMDFLYW*/
903#define R0900_P2_DMDFLYW 0xf21c 958#define R0900_P2_DMDFLYW 0xf21c
904#define F0900_P2_I2C_IRQVAL 0xf21c00f0 959#define F0900_P2_I2C_IRQVAL 0xf21c00f0
905#define F0900_P2_FLYWHEEL_CPT 0xf21c000f 960#define F0900_P2_FLYWHEEL_CPT 0xf21c000f
906 961
907/*P2_DSTATUS3*/ 962/*P2_DSTATUS3*/
908#define R0900_P2_DSTATUS3 0xf21d 963#define R0900_P2_DSTATUS3 0xf21d
909#define F0900_P2_CFR_ZIGZAG 0xf21d0080 964#define F0900_P2_DEMOD_CFGMODE 0xf21d0060
910#define F0900_P2_DEMOD_CFGMODE 0xf21d0060
911#define F0900_P2_GAMMA_LOWBAUDRATE 0xf21d0010
912#define F0900_P2_RELOCK_MODE 0xf21d0008
913#define F0900_P2_DEMOD_FAIL 0xf21d0004
914#define F0900_P2_ETAPE1A_DVBXMEM 0xf21d0003
915 965
916/*P2_DMDCFG3*/ 966/*P2_DMDCFG3*/
917#define R0900_P2_DMDCFG3 0xf21e 967#define R0900_P2_DMDCFG3 0xf21e
918#define F0900_P2_DVBS1_TMGWAIT 0xf21e0080 968#define F0900_P2_NOSTOP_FIFOFULL 0xf21e0008
919#define F0900_P2_NO_BWCENTERING 0xf21e0040
920#define F0900_P2_INV_SEQSRCH 0xf21e0020
921#define F0900_P2_DIS_SFRUPLOW_TRK 0xf21e0010
922#define F0900_P2_NOSTOP_FIFOFULL 0xf21e0008
923#define F0900_P2_LOCKTIME_MODE 0xf21e0007
924 969
925/*P2_DMDCFG4*/ 970/*P2_DMDCFG4*/
926#define R0900_P2_DMDCFG4 0xf21f 971#define R0900_P2_DMDCFG4 0xf21f
927#define F0900_P2_TUNER_NRELAUNCH 0xf21f0008 972#define F0900_P2_TUNER_NRELAUNCH 0xf21f0008
928#define F0900_P2_DIS_CLKENABLE 0xf21f0004
929#define F0900_P2_DIS_HDRDIVLOCK 0xf21f0002
930#define F0900_P2_NO_TNRWBINIT 0xf21f0001
931 973
932/*P2_CORRELMANT*/ 974/*P2_CORRELMANT*/
933#define R0900_P2_CORRELMANT 0xf220 975#define R0900_P2_CORRELMANT 0xf220
934#define F0900_P2_CORREL_MANT 0xf22000ff 976#define F0900_P2_CORREL_MANT 0xf22000ff
935 977
936/*P2_CORRELABS*/ 978/*P2_CORRELABS*/
937#define R0900_P2_CORRELABS 0xf221 979#define R0900_P2_CORRELABS 0xf221
938#define F0900_P2_CORREL_ABS 0xf22100ff 980#define F0900_P2_CORREL_ABS 0xf22100ff
939 981
940/*P2_CORRELEXP*/ 982/*P2_CORRELEXP*/
941#define R0900_P2_CORRELEXP 0xf222 983#define R0900_P2_CORRELEXP 0xf222
942#define F0900_P2_CORREL_ABSEXP 0xf22200f0 984#define F0900_P2_CORREL_ABSEXP 0xf22200f0
943#define F0900_P2_CORREL_EXP 0xf222000f 985#define F0900_P2_CORREL_EXP 0xf222000f
944 986
945/*P2_PLHMODCOD*/ 987/*P2_PLHMODCOD*/
946#define R0900_P2_PLHMODCOD 0xf224 988#define R0900_P2_PLHMODCOD 0xf224
947#define F0900_P2_SPECINV_DEMOD 0xf2240080 989#define F0900_P2_SPECINV_DEMOD 0xf2240080
948#define F0900_P2_PLH_MODCOD 0xf224007c 990#define F0900_P2_PLH_MODCOD 0xf224007c
949#define F0900_P2_PLH_TYPE 0xf2240003 991#define F0900_P2_PLH_TYPE 0xf2240003
950 992
951/*P2_AGCK32*/ 993/*P2_DMDREG*/
952#define R0900_P2_AGCK32 0xf22b 994#define R0900_P2_DMDREG 0xf225
953#define F0900_P2_R3ADJOFF_32APSK 0xf22b0080 995#define F0900_P2_DECIM_PLFRAMES 0xf2250001
954#define F0900_P2_R2ADJOFF_32APSK 0xf22b0040
955#define F0900_P2_R1ADJOFF_32APSK 0xf22b0020
956#define F0900_P2_RADJ_32APSK 0xf22b001f
957 996
958/*P2_AGC2O*/ 997/*P2_AGC2O*/
959#define R0900_P2_AGC2O 0xf22c 998#define R0900_P2_AGC2O 0xf22c
960#define F0900_P2_AGC2REF_ADJUSTING 0xf22c0080 999#define F0900_P2_AGC2_COEF 0xf22c0007
961#define F0900_P2_AGC2_COARSEFAST 0xf22c0040
962#define F0900_P2_AGC2_LKSQRT 0xf22c0020
963#define F0900_P2_AGC2_LKMODE 0xf22c0010
964#define F0900_P2_AGC2_LKEQUA 0xf22c0008
965#define F0900_P2_AGC2_COEF 0xf22c0007
966 1000
967/*P2_AGC2REF*/ 1001/*P2_AGC2REF*/
968#define R0900_P2_AGC2REF 0xf22d 1002#define R0900_P2_AGC2REF 0xf22d
969#define F0900_P2_AGC2_REF 0xf22d00ff 1003#define F0900_P2_AGC2_REF 0xf22d00ff
970 1004
971/*P2_AGC1ADJ*/ 1005/*P2_AGC1ADJ*/
972#define R0900_P2_AGC1ADJ 0xf22e 1006#define R0900_P2_AGC1ADJ 0xf22e
973#define F0900_P2_AGC1ADJ_MANUAL 0xf22e0080 1007#define F0900_P2_AGC1_ADJUSTED 0xf22e007f
974#define F0900_P2_AGC1_ADJUSTED 0xf22e017f
975 1008
976/*P2_AGC2I1*/ 1009/*P2_AGC2I1*/
977#define R0900_P2_AGC2I1 0xf236 1010#define R0900_P2_AGC2I1 0xf236
978#define F0900_P2_AGC2_INTEGRATOR1 0xf23600ff 1011#define F0900_P2_AGC2_INTEGRATOR1 0xf23600ff
979 1012
980/*P2_AGC2I0*/ 1013/*P2_AGC2I0*/
981#define R0900_P2_AGC2I0 0xf237 1014#define R0900_P2_AGC2I0 0xf237
982#define F0900_P2_AGC2_INTEGRATOR0 0xf23700ff 1015#define F0900_P2_AGC2_INTEGRATOR0 0xf23700ff
983 1016
984/*P2_CARCFG*/ 1017/*P2_CARCFG*/
985#define R0900_P2_CARCFG 0xf238 1018#define R0900_P2_CARCFG 0xf238
986#define F0900_P2_CFRUPLOW_AUTO 0xf2380080 1019#define F0900_P2_CFRUPLOW_AUTO 0xf2380080
987#define F0900_P2_CFRUPLOW_TEST 0xf2380040 1020#define F0900_P2_CFRUPLOW_TEST 0xf2380040
988#define F0900_P2_EN_CAR2CENTER 0xf2380020 1021#define F0900_P2_ROTAON 0xf2380004
989#define F0900_P2_CARHDR_NODIV8 0xf2380010 1022#define F0900_P2_PH_DET_ALGO 0xf2380003
990#define F0900_P2_I2C_ROTA 0xf2380008
991#define F0900_P2_ROTAON 0xf2380004
992#define F0900_P2_PH_DET_ALGO 0xf2380003
993 1023
994/*P2_ACLC*/ 1024/*P2_ACLC*/
995#define R0900_P2_ACLC 0xf239 1025#define R0900_P2_ACLC 0xf239
996#define F0900_P2_STOP_S2ALPHA 0xf23900c0 1026#define F0900_P2_CAR_ALPHA_MANT 0xf2390030
997#define F0900_P2_CAR_ALPHA_MANT 0xf2390030 1027#define F0900_P2_CAR_ALPHA_EXP 0xf239000f
998#define F0900_P2_CAR_ALPHA_EXP 0xf239000f
999 1028
1000/*P2_BCLC*/ 1029/*P2_BCLC*/
1001#define R0900_P2_BCLC 0xf23a 1030#define R0900_P2_BCLC 0xf23a
1002#define F0900_P2_STOP_S2BETA 0xf23a00c0 1031#define F0900_P2_CAR_BETA_MANT 0xf23a0030
1003#define F0900_P2_CAR_BETA_MANT 0xf23a0030 1032#define F0900_P2_CAR_BETA_EXP 0xf23a000f
1004#define F0900_P2_CAR_BETA_EXP 0xf23a000f
1005 1033
1006/*P2_CARFREQ*/ 1034/*P2_CARFREQ*/
1007#define R0900_P2_CARFREQ 0xf23d 1035#define R0900_P2_CARFREQ 0xf23d
1008#define F0900_P2_KC_COARSE_EXP 0xf23d00f0 1036#define F0900_P2_KC_COARSE_EXP 0xf23d00f0
1009#define F0900_P2_BETA_FREQ 0xf23d000f 1037#define F0900_P2_BETA_FREQ 0xf23d000f
1010 1038
1011/*P2_CARHDR*/ 1039/*P2_CARHDR*/
1012#define R0900_P2_CARHDR 0xf23e 1040#define R0900_P2_CARHDR 0xf23e
1013#define F0900_P2_K_FREQ_HDR 0xf23e00ff 1041#define F0900_P2_K_FREQ_HDR 0xf23e00ff
1014 1042
1015/*P2_LDT*/ 1043/*P2_LDT*/
1016#define R0900_P2_LDT 0xf23f 1044#define R0900_P2_LDT 0xf23f
1017#define F0900_P2_CARLOCK_THRES 0xf23f01ff 1045#define F0900_P2_CARLOCK_THRES 0xf23f01ff
1018 1046
1019/*P2_LDT2*/ 1047/*P2_LDT2*/
1020#define R0900_P2_LDT2 0xf240 1048#define R0900_P2_LDT2 0xf240
1021#define F0900_P2_CARLOCK_THRES2 0xf24001ff 1049#define F0900_P2_CARLOCK_THRES2 0xf24001ff
1022 1050
1023/*P2_CFRICFG*/ 1051/*P2_CFRICFG*/
1024#define R0900_P2_CFRICFG 0xf241 1052#define R0900_P2_CFRICFG 0xf241
1025#define F0900_P2_CFRINIT_UNVALRNG 0xf2410080 1053#define F0900_P2_NEG_CFRSTEP 0xf2410001
1026#define F0900_P2_CFRINIT_LUNVALCPT 0xf2410040
1027#define F0900_P2_CFRINIT_ABORTDBL 0xf2410020
1028#define F0900_P2_CFRINIT_ABORTPRED 0xf2410010
1029#define F0900_P2_CFRINIT_UNVALSKIP 0xf2410008
1030#define F0900_P2_CFRINIT_CSTINC 0xf2410004
1031#define F0900_P2_NEG_CFRSTEP 0xf2410001
1032 1054
1033/*P2_CFRUP1*/ 1055/*P2_CFRUP1*/
1034#define R0900_P2_CFRUP1 0xf242 1056#define R0900_P2_CFRUP1 0xf242
1035#define F0900_P2_CFR_UP1 0xf24201ff 1057#define F0900_P2_CFR_UP1 0xf24201ff
1036 1058
1037/*P2_CFRUP0*/ 1059/*P2_CFRUP0*/
1038#define R0900_P2_CFRUP0 0xf243 1060#define R0900_P2_CFRUP0 0xf243
1039#define F0900_P2_CFR_UP0 0xf24300ff 1061#define F0900_P2_CFR_UP0 0xf24300ff
1040 1062
1041/*P2_CFRLOW1*/ 1063/*P2_CFRLOW1*/
1042#define R0900_P2_CFRLOW1 0xf246 1064#define R0900_P2_CFRLOW1 0xf246
1043#define F0900_P2_CFR_LOW1 0xf24601ff 1065#define F0900_P2_CFR_LOW1 0xf24601ff
1044 1066
1045/*P2_CFRLOW0*/ 1067/*P2_CFRLOW0*/
1046#define R0900_P2_CFRLOW0 0xf247 1068#define R0900_P2_CFRLOW0 0xf247
1047#define F0900_P2_CFR_LOW0 0xf24700ff 1069#define F0900_P2_CFR_LOW0 0xf24700ff
1048 1070
1049/*P2_CFRINIT1*/ 1071/*P2_CFRINIT1*/
1050#define R0900_P2_CFRINIT1 0xf248 1072#define R0900_P2_CFRINIT1 0xf248
1051#define F0900_P2_CFR_INIT1 0xf24801ff 1073#define F0900_P2_CFR_INIT1 0xf24801ff
1052 1074
1053/*P2_CFRINIT0*/ 1075/*P2_CFRINIT0*/
1054#define R0900_P2_CFRINIT0 0xf249 1076#define R0900_P2_CFRINIT0 0xf249
1055#define F0900_P2_CFR_INIT0 0xf24900ff 1077#define F0900_P2_CFR_INIT0 0xf24900ff
1056 1078
1057/*P2_CFRINC1*/ 1079/*P2_CFRINC1*/
1058#define R0900_P2_CFRINC1 0xf24a 1080#define R0900_P2_CFRINC1 0xf24a
1059#define F0900_P2_MANUAL_CFRINC 0xf24a0080 1081#define F0900_P2_MANUAL_CFRINC 0xf24a0080
1060#define F0900_P2_CFR_INC1 0xf24a017f 1082#define F0900_P2_CFR_INC1 0xf24a003f
1061 1083
1062/*P2_CFRINC0*/ 1084/*P2_CFRINC0*/
1063#define R0900_P2_CFRINC0 0xf24b 1085#define R0900_P2_CFRINC0 0xf24b
1064#define F0900_P2_CFR_INC0 0xf24b00f0 1086#define F0900_P2_CFR_INC0 0xf24b00f8
1065 1087
1066/*P2_CFR2*/ 1088/*P2_CFR2*/
1067#define R0900_P2_CFR2 0xf24c 1089#define R0900_P2_CFR2 0xf24c
1068#define F0900_P2_CAR_FREQ2 0xf24c01ff 1090#define F0900_P2_CAR_FREQ2 0xf24c01ff
1069 1091
1070/*P2_CFR1*/ 1092/*P2_CFR1*/
1071#define R0900_P2_CFR1 0xf24d 1093#define R0900_P2_CFR1 0xf24d
1072#define F0900_P2_CAR_FREQ1 0xf24d00ff 1094#define F0900_P2_CAR_FREQ1 0xf24d00ff
1073 1095
1074/*P2_CFR0*/ 1096/*P2_CFR0*/
1075#define R0900_P2_CFR0 0xf24e 1097#define R0900_P2_CFR0 0xf24e
1076#define F0900_P2_CAR_FREQ0 0xf24e00ff 1098#define F0900_P2_CAR_FREQ0 0xf24e00ff
1077 1099
1078/*P2_LDI*/ 1100/*P2_LDI*/
1079#define R0900_P2_LDI 0xf24f 1101#define R0900_P2_LDI 0xf24f
1080#define F0900_P2_LOCK_DET_INTEGR 0xf24f01ff 1102#define F0900_P2_LOCK_DET_INTEGR 0xf24f01ff
1081 1103
1082/*P2_TMGCFG*/ 1104/*P2_TMGCFG*/
1083#define R0900_P2_TMGCFG 0xf250 1105#define R0900_P2_TMGCFG 0xf250
1084#define F0900_P2_TMGLOCK_BETA 0xf25000c0 1106#define F0900_P2_TMGLOCK_BETA 0xf25000c0
1085#define F0900_P2_NOTMG_GROUPDELAY 0xf2500020 1107#define F0900_P2_DO_TIMING_CORR 0xf2500010
1086#define F0900_P2_DO_TIMING_CORR 0xf2500010 1108#define F0900_P2_TMG_MINFREQ 0xf2500003
1087#define F0900_P2_MANUAL_SCAN 0xf250000c
1088#define F0900_P2_TMG_MINFREQ 0xf2500003
1089 1109
1090/*P2_RTC*/ 1110/*P2_RTC*/
1091#define R0900_P2_RTC 0xf251 1111#define R0900_P2_RTC 0xf251
1092#define F0900_P2_TMGALPHA_EXP 0xf25100f0 1112#define F0900_P2_TMGALPHA_EXP 0xf25100f0
1093#define F0900_P2_TMGBETA_EXP 0xf251000f 1113#define F0900_P2_TMGBETA_EXP 0xf251000f
1094 1114
1095/*P2_RTCS2*/ 1115/*P2_RTCS2*/
1096#define R0900_P2_RTCS2 0xf252 1116#define R0900_P2_RTCS2 0xf252
1097#define F0900_P2_TMGALPHAS2_EXP 0xf25200f0 1117#define F0900_P2_TMGALPHAS2_EXP 0xf25200f0
1098#define F0900_P2_TMGBETAS2_EXP 0xf252000f 1118#define F0900_P2_TMGBETAS2_EXP 0xf252000f
1099 1119
1100/*P2_TMGTHRISE*/ 1120/*P2_TMGTHRISE*/
1101#define R0900_P2_TMGTHRISE 0xf253 1121#define R0900_P2_TMGTHRISE 0xf253
1102#define F0900_P2_TMGLOCK_THRISE 0xf25300ff 1122#define F0900_P2_TMGLOCK_THRISE 0xf25300ff
1103 1123
1104/*P2_TMGTHFALL*/ 1124/*P2_TMGTHFALL*/
1105#define R0900_P2_TMGTHFALL 0xf254 1125#define R0900_P2_TMGTHFALL 0xf254
1106#define F0900_P2_TMGLOCK_THFALL 0xf25400ff 1126#define F0900_P2_TMGLOCK_THFALL 0xf25400ff
1107 1127
1108/*P2_SFRUPRATIO*/ 1128/*P2_SFRUPRATIO*/
1109#define R0900_P2_SFRUPRATIO 0xf255 1129#define R0900_P2_SFRUPRATIO 0xf255
1110#define F0900_P2_SFR_UPRATIO 0xf25500ff 1130#define F0900_P2_SFR_UPRATIO 0xf25500ff
1111 1131
1112/*P2_SFRLOWRATIO*/ 1132/*P2_SFRLOWRATIO*/
1113#define R0900_P2_SFRLOWRATIO 0xf256 1133#define R0900_P2_SFRLOWRATIO 0xf256
1114#define F0900_P2_SFR_LOWRATIO 0xf25600ff 1134#define F0900_P2_SFR_LOWRATIO 0xf25600ff
1115 1135
1116/*P2_KREFTMG*/ 1136/*P2_KREFTMG*/
1117#define R0900_P2_KREFTMG 0xf258 1137#define R0900_P2_KREFTMG 0xf258
1118#define F0900_P2_KREF_TMG 0xf25800ff 1138#define F0900_P2_KREF_TMG 0xf25800ff
1119 1139
1120/*P2_SFRSTEP*/ 1140/*P2_SFRSTEP*/
1121#define R0900_P2_SFRSTEP 0xf259 1141#define R0900_P2_SFRSTEP 0xf259
1122#define F0900_P2_SFR_SCANSTEP 0xf25900f0 1142#define F0900_P2_SFR_SCANSTEP 0xf25900f0
1123#define F0900_P2_SFR_CENTERSTEP 0xf259000f 1143#define F0900_P2_SFR_CENTERSTEP 0xf259000f
1124 1144
1125/*P2_TMGCFG2*/ 1145/*P2_TMGCFG2*/
1126#define R0900_P2_TMGCFG2 0xf25a 1146#define R0900_P2_TMGCFG2 0xf25a
1127#define F0900_P2_DIS_AUTOSAMP 0xf25a0008 1147#define F0900_P2_SFRRATIO_FINE 0xf25a0001
1128#define F0900_P2_SCANINIT_QUART 0xf25a0004 1148
1129#define F0900_P2_NOTMG_DVBS1DERAT 0xf25a0002 1149/*P2_KREFTMG2*/
1130#define F0900_P2_SFRRATIO_FINE 0xf25a0001 1150#define R0900_P2_KREFTMG2 0xf25b
1151#define F0900_P2_KREF_TMG2 0xf25b00ff
1131 1152
1132/*P2_SFRINIT1*/ 1153/*P2_SFRINIT1*/
1133#define R0900_P2_SFRINIT1 0xf25e 1154#define R0900_P2_SFRINIT1 0xf25e
1134#define F0900_P2_SFR_INIT1 0xf25e00ff 1155#define F0900_P2_SFR_INIT1 0xf25e007f
1135 1156
1136/*P2_SFRINIT0*/ 1157/*P2_SFRINIT0*/
1137#define R0900_P2_SFRINIT0 0xf25f 1158#define R0900_P2_SFRINIT0 0xf25f
1138#define F0900_P2_SFR_INIT0 0xf25f00ff 1159#define F0900_P2_SFR_INIT0 0xf25f00ff
1139 1160
1140/*P2_SFRUP1*/ 1161/*P2_SFRUP1*/
1141#define R0900_P2_SFRUP1 0xf260 1162#define R0900_P2_SFRUP1 0xf260
1142#define F0900_P2_AUTO_GUP 0xf2600080 1163#define F0900_P2_AUTO_GUP 0xf2600080
1143#define F0900_P2_SYMB_FREQ_UP1 0xf260007f 1164#define F0900_P2_SYMB_FREQ_UP1 0xf260007f
1144 1165
1145/*P2_SFRUP0*/ 1166/*P2_SFRUP0*/
1146#define R0900_P2_SFRUP0 0xf261 1167#define R0900_P2_SFRUP0 0xf261
1147#define F0900_P2_SYMB_FREQ_UP0 0xf26100ff 1168#define F0900_P2_SYMB_FREQ_UP0 0xf26100ff
1148 1169
1149/*P2_SFRLOW1*/ 1170/*P2_SFRLOW1*/
1150#define R0900_P2_SFRLOW1 0xf262 1171#define R0900_P2_SFRLOW1 0xf262
1151#define F0900_P2_AUTO_GLOW 0xf2620080 1172#define F0900_P2_AUTO_GLOW 0xf2620080
1152#define F0900_P2_SYMB_FREQ_LOW1 0xf262007f 1173#define F0900_P2_SYMB_FREQ_LOW1 0xf262007f
1153 1174
1154/*P2_SFRLOW0*/ 1175/*P2_SFRLOW0*/
1155#define R0900_P2_SFRLOW0 0xf263 1176#define R0900_P2_SFRLOW0 0xf263
1156#define F0900_P2_SYMB_FREQ_LOW0 0xf26300ff 1177#define F0900_P2_SYMB_FREQ_LOW0 0xf26300ff
1157 1178
1158/*P2_SFR3*/ 1179/*P2_SFR3*/
1159#define R0900_P2_SFR3 0xf264 1180#define R0900_P2_SFR3 0xf264
1160#define F0900_P2_SYMB_FREQ3 0xf26400ff 1181#define F0900_P2_SYMB_FREQ3 0xf26400ff
1161 1182
1162/*P2_SFR2*/ 1183/*P2_SFR2*/
1163#define R0900_P2_SFR2 0xf265 1184#define R0900_P2_SFR2 0xf265
1164#define F0900_P2_SYMB_FREQ2 0xf26500ff 1185#define F0900_P2_SYMB_FREQ2 0xf26500ff
1165 1186
1166/*P2_SFR1*/ 1187/*P2_SFR1*/
1167#define R0900_P2_SFR1 0xf266 1188#define R0900_P2_SFR1 0xf266
1168#define F0900_P2_SYMB_FREQ1 0xf26600ff 1189#define F0900_P2_SYMB_FREQ1 0xf26600ff
1169 1190
1170/*P2_SFR0*/ 1191/*P2_SFR0*/
1171#define R0900_P2_SFR0 0xf267 1192#define R0900_P2_SFR0 0xf267
1172#define F0900_P2_SYMB_FREQ0 0xf26700ff 1193#define F0900_P2_SYMB_FREQ0 0xf26700ff
1173 1194
1174/*P2_TMGREG2*/ 1195/*P2_TMGREG2*/
1175#define R0900_P2_TMGREG2 0xf268 1196#define R0900_P2_TMGREG2 0xf268
1176#define F0900_P2_TMGREG2 0xf26800ff 1197#define F0900_P2_TMGREG2 0xf26800ff
1177 1198
1178/*P2_TMGREG1*/ 1199/*P2_TMGREG1*/
1179#define R0900_P2_TMGREG1 0xf269 1200#define R0900_P2_TMGREG1 0xf269
1180#define F0900_P2_TMGREG1 0xf26900ff 1201#define F0900_P2_TMGREG1 0xf26900ff
1181 1202
1182/*P2_TMGREG0*/ 1203/*P2_TMGREG0*/
1183#define R0900_P2_TMGREG0 0xf26a 1204#define R0900_P2_TMGREG0 0xf26a
1184#define F0900_P2_TMGREG0 0xf26a00ff 1205#define F0900_P2_TMGREG0 0xf26a00ff
1185 1206
1186/*P2_TMGLOCK1*/ 1207/*P2_TMGLOCK1*/
1187#define R0900_P2_TMGLOCK1 0xf26b 1208#define R0900_P2_TMGLOCK1 0xf26b
1188#define F0900_P2_TMGLOCK_LEVEL1 0xf26b01ff 1209#define F0900_P2_TMGLOCK_LEVEL1 0xf26b01ff
1189 1210
1190/*P2_TMGLOCK0*/ 1211/*P2_TMGLOCK0*/
1191#define R0900_P2_TMGLOCK0 0xf26c 1212#define R0900_P2_TMGLOCK0 0xf26c
1192#define F0900_P2_TMGLOCK_LEVEL0 0xf26c00ff 1213#define F0900_P2_TMGLOCK_LEVEL0 0xf26c00ff
1193 1214
1194/*P2_TMGOBS*/ 1215/*P2_TMGOBS*/
1195#define R0900_P2_TMGOBS 0xf26d 1216#define R0900_P2_TMGOBS 0xf26d
1196#define F0900_P2_ROLLOFF_STATUS 0xf26d00c0 1217#define F0900_P2_ROLLOFF_STATUS 0xf26d00c0
1197#define F0900_P2_SCAN_SIGN 0xf26d0030
1198#define F0900_P2_TMG_SCANNING 0xf26d0008
1199#define F0900_P2_CHCENTERING_MODE 0xf26d0004
1200#define F0900_P2_TMG_SCANFAIL 0xf26d0002
1201 1218
1202/*P2_EQUALCFG*/ 1219/*P2_EQUALCFG*/
1203#define R0900_P2_EQUALCFG 0xf26f 1220#define R0900_P2_EQUALCFG 0xf26f
1204#define F0900_P2_NOTMG_NEGALWAIT 0xf26f0080 1221#define F0900_P2_EQUAL_ON 0xf26f0040
1205#define F0900_P2_EQUAL_ON 0xf26f0040 1222#define F0900_P2_MU_EQUALDFE 0xf26f0007
1206#define F0900_P2_SEL_EQUALCOR 0xf26f0038
1207#define F0900_P2_MU_EQUALDFE 0xf26f0007
1208 1223
1209/*P2_EQUAI1*/ 1224/*P2_EQUAI1*/
1210#define R0900_P2_EQUAI1 0xf270 1225#define R0900_P2_EQUAI1 0xf270
1211#define F0900_P2_EQUA_ACCI1 0xf27001ff 1226#define F0900_P2_EQUA_ACCI1 0xf27001ff
1212 1227
1213/*P2_EQUAQ1*/ 1228/*P2_EQUAQ1*/
1214#define R0900_P2_EQUAQ1 0xf271 1229#define R0900_P2_EQUAQ1 0xf271
1215#define F0900_P2_EQUA_ACCQ1 0xf27101ff 1230#define F0900_P2_EQUA_ACCQ1 0xf27101ff
1216 1231
1217/*P2_EQUAI2*/ 1232/*P2_EQUAI2*/
1218#define R0900_P2_EQUAI2 0xf272 1233#define R0900_P2_EQUAI2 0xf272
1219#define F0900_P2_EQUA_ACCI2 0xf27201ff 1234#define F0900_P2_EQUA_ACCI2 0xf27201ff
1220 1235
1221/*P2_EQUAQ2*/ 1236/*P2_EQUAQ2*/
1222#define R0900_P2_EQUAQ2 0xf273 1237#define R0900_P2_EQUAQ2 0xf273
1223#define F0900_P2_EQUA_ACCQ2 0xf27301ff 1238#define F0900_P2_EQUA_ACCQ2 0xf27301ff
1224 1239
1225/*P2_EQUAI3*/ 1240/*P2_EQUAI3*/
1226#define R0900_P2_EQUAI3 0xf274 1241#define R0900_P2_EQUAI3 0xf274
1227#define F0900_P2_EQUA_ACCI3 0xf27401ff 1242#define F0900_P2_EQUA_ACCI3 0xf27401ff
1228 1243
1229/*P2_EQUAQ3*/ 1244/*P2_EQUAQ3*/
1230#define R0900_P2_EQUAQ3 0xf275 1245#define R0900_P2_EQUAQ3 0xf275
1231#define F0900_P2_EQUA_ACCQ3 0xf27501ff 1246#define F0900_P2_EQUA_ACCQ3 0xf27501ff
1232 1247
1233/*P2_EQUAI4*/ 1248/*P2_EQUAI4*/
1234#define R0900_P2_EQUAI4 0xf276 1249#define R0900_P2_EQUAI4 0xf276
1235#define F0900_P2_EQUA_ACCI4 0xf27601ff 1250#define F0900_P2_EQUA_ACCI4 0xf27601ff
1236 1251
1237/*P2_EQUAQ4*/ 1252/*P2_EQUAQ4*/
1238#define R0900_P2_EQUAQ4 0xf277 1253#define R0900_P2_EQUAQ4 0xf277
1239#define F0900_P2_EQUA_ACCQ4 0xf27701ff 1254#define F0900_P2_EQUA_ACCQ4 0xf27701ff
1240 1255
1241/*P2_EQUAI5*/ 1256/*P2_EQUAI5*/
1242#define R0900_P2_EQUAI5 0xf278 1257#define R0900_P2_EQUAI5 0xf278
1243#define F0900_P2_EQUA_ACCI5 0xf27801ff 1258#define F0900_P2_EQUA_ACCI5 0xf27801ff
1244 1259
1245/*P2_EQUAQ5*/ 1260/*P2_EQUAQ5*/
1246#define R0900_P2_EQUAQ5 0xf279 1261#define R0900_P2_EQUAQ5 0xf279
1247#define F0900_P2_EQUA_ACCQ5 0xf27901ff 1262#define F0900_P2_EQUA_ACCQ5 0xf27901ff
1248 1263
1249/*P2_EQUAI6*/ 1264/*P2_EQUAI6*/
1250#define R0900_P2_EQUAI6 0xf27a 1265#define R0900_P2_EQUAI6 0xf27a
1251#define F0900_P2_EQUA_ACCI6 0xf27a01ff 1266#define F0900_P2_EQUA_ACCI6 0xf27a01ff
1252 1267
1253/*P2_EQUAQ6*/ 1268/*P2_EQUAQ6*/
1254#define R0900_P2_EQUAQ6 0xf27b 1269#define R0900_P2_EQUAQ6 0xf27b
1255#define F0900_P2_EQUA_ACCQ6 0xf27b01ff 1270#define F0900_P2_EQUA_ACCQ6 0xf27b01ff
1256 1271
1257/*P2_EQUAI7*/ 1272/*P2_EQUAI7*/
1258#define R0900_P2_EQUAI7 0xf27c 1273#define R0900_P2_EQUAI7 0xf27c
1259#define F0900_P2_EQUA_ACCI7 0xf27c01ff 1274#define F0900_P2_EQUA_ACCI7 0xf27c01ff
1260 1275
1261/*P2_EQUAQ7*/ 1276/*P2_EQUAQ7*/
1262#define R0900_P2_EQUAQ7 0xf27d 1277#define R0900_P2_EQUAQ7 0xf27d
1263#define F0900_P2_EQUA_ACCQ7 0xf27d01ff 1278#define F0900_P2_EQUA_ACCQ7 0xf27d01ff
1264 1279
1265/*P2_EQUAI8*/ 1280/*P2_EQUAI8*/
1266#define R0900_P2_EQUAI8 0xf27e 1281#define R0900_P2_EQUAI8 0xf27e
1267#define F0900_P2_EQUA_ACCI8 0xf27e01ff 1282#define F0900_P2_EQUA_ACCI8 0xf27e01ff
1268 1283
1269/*P2_EQUAQ8*/ 1284/*P2_EQUAQ8*/
1270#define R0900_P2_EQUAQ8 0xf27f 1285#define R0900_P2_EQUAQ8 0xf27f
1271#define F0900_P2_EQUA_ACCQ8 0xf27f01ff 1286#define F0900_P2_EQUA_ACCQ8 0xf27f01ff
1272 1287
1273/*P2_NNOSDATAT1*/ 1288/*P2_NNOSDATAT1*/
1274#define R0900_P2_NNOSDATAT1 0xf280 1289#define R0900_P2_NNOSDATAT1 0xf280
1275#define F0900_P2_NOSDATAT_NORMED1 0xf28000ff 1290#define F0900_P2_NOSDATAT_NORMED1 0xf28000ff
1276 1291
1277/*P2_NNOSDATAT0*/ 1292/*P2_NNOSDATAT0*/
1278#define R0900_P2_NNOSDATAT0 0xf281 1293#define R0900_P2_NNOSDATAT0 0xf281
1279#define F0900_P2_NOSDATAT_NORMED0 0xf28100ff 1294#define F0900_P2_NOSDATAT_NORMED0 0xf28100ff
1280 1295
1281/*P2_NNOSDATA1*/ 1296/*P2_NNOSDATA1*/
1282#define R0900_P2_NNOSDATA1 0xf282 1297#define R0900_P2_NNOSDATA1 0xf282
1283#define F0900_P2_NOSDATA_NORMED1 0xf28200ff 1298#define F0900_P2_NOSDATA_NORMED1 0xf28200ff
1284 1299
1285/*P2_NNOSDATA0*/ 1300/*P2_NNOSDATA0*/
1286#define R0900_P2_NNOSDATA0 0xf283 1301#define R0900_P2_NNOSDATA0 0xf283
1287#define F0900_P2_NOSDATA_NORMED0 0xf28300ff 1302#define F0900_P2_NOSDATA_NORMED0 0xf28300ff
1288 1303
1289/*P2_NNOSPLHT1*/ 1304/*P2_NNOSPLHT1*/
1290#define R0900_P2_NNOSPLHT1 0xf284 1305#define R0900_P2_NNOSPLHT1 0xf284
1291#define F0900_P2_NOSPLHT_NORMED1 0xf28400ff 1306#define F0900_P2_NOSPLHT_NORMED1 0xf28400ff
1292 1307
1293/*P2_NNOSPLHT0*/ 1308/*P2_NNOSPLHT0*/
1294#define R0900_P2_NNOSPLHT0 0xf285 1309#define R0900_P2_NNOSPLHT0 0xf285
1295#define F0900_P2_NOSPLHT_NORMED0 0xf28500ff 1310#define F0900_P2_NOSPLHT_NORMED0 0xf28500ff
1296 1311
1297/*P2_NNOSPLH1*/ 1312/*P2_NNOSPLH1*/
1298#define R0900_P2_NNOSPLH1 0xf286 1313#define R0900_P2_NNOSPLH1 0xf286
1299#define F0900_P2_NOSPLH_NORMED1 0xf28600ff 1314#define F0900_P2_NOSPLH_NORMED1 0xf28600ff
1300 1315
1301/*P2_NNOSPLH0*/ 1316/*P2_NNOSPLH0*/
1302#define R0900_P2_NNOSPLH0 0xf287 1317#define R0900_P2_NNOSPLH0 0xf287
1303#define F0900_P2_NOSPLH_NORMED0 0xf28700ff 1318#define F0900_P2_NOSPLH_NORMED0 0xf28700ff
1304 1319
1305/*P2_NOSDATAT1*/ 1320/*P2_NOSDATAT1*/
1306#define R0900_P2_NOSDATAT1 0xf288 1321#define R0900_P2_NOSDATAT1 0xf288
1307#define F0900_P2_NOSDATAT_UNNORMED1 0xf28800ff 1322#define F0900_P2_NOSDATAT_UNNORMED1 0xf28800ff
1308 1323
1309/*P2_NOSDATAT0*/ 1324/*P2_NOSDATAT0*/
1310#define R0900_P2_NOSDATAT0 0xf289 1325#define R0900_P2_NOSDATAT0 0xf289
1311#define F0900_P2_NOSDATAT_UNNORMED0 0xf28900ff 1326#define F0900_P2_NOSDATAT_UNNORMED0 0xf28900ff
1312 1327
1313/*P2_NOSDATA1*/ 1328/*P2_NOSDATA1*/
1314#define R0900_P2_NOSDATA1 0xf28a 1329#define R0900_P2_NOSDATA1 0xf28a
1315#define F0900_P2_NOSDATA_UNNORMED1 0xf28a00ff 1330#define F0900_P2_NOSDATA_UNNORMED1 0xf28a00ff
1316 1331
1317/*P2_NOSDATA0*/ 1332/*P2_NOSDATA0*/
1318#define R0900_P2_NOSDATA0 0xf28b 1333#define R0900_P2_NOSDATA0 0xf28b
1319#define F0900_P2_NOSDATA_UNNORMED0 0xf28b00ff 1334#define F0900_P2_NOSDATA_UNNORMED0 0xf28b00ff
1320 1335
1321/*P2_NOSPLHT1*/ 1336/*P2_NOSPLHT1*/
1322#define R0900_P2_NOSPLHT1 0xf28c 1337#define R0900_P2_NOSPLHT1 0xf28c
1323#define F0900_P2_NOSPLHT_UNNORMED1 0xf28c00ff 1338#define F0900_P2_NOSPLHT_UNNORMED1 0xf28c00ff
1324 1339
1325/*P2_NOSPLHT0*/ 1340/*P2_NOSPLHT0*/
1326#define R0900_P2_NOSPLHT0 0xf28d 1341#define R0900_P2_NOSPLHT0 0xf28d
1327#define F0900_P2_NOSPLHT_UNNORMED0 0xf28d00ff 1342#define F0900_P2_NOSPLHT_UNNORMED0 0xf28d00ff
1328 1343
1329/*P2_NOSPLH1*/ 1344/*P2_NOSPLH1*/
1330#define R0900_P2_NOSPLH1 0xf28e 1345#define R0900_P2_NOSPLH1 0xf28e
1331#define F0900_P2_NOSPLH_UNNORMED1 0xf28e00ff 1346#define F0900_P2_NOSPLH_UNNORMED1 0xf28e00ff
1332 1347
1333/*P2_NOSPLH0*/ 1348/*P2_NOSPLH0*/
1334#define R0900_P2_NOSPLH0 0xf28f 1349#define R0900_P2_NOSPLH0 0xf28f
1335#define F0900_P2_NOSPLH_UNNORMED0 0xf28f00ff 1350#define F0900_P2_NOSPLH_UNNORMED0 0xf28f00ff
1336 1351
1337/*P2_CAR2CFG*/ 1352/*P2_CAR2CFG*/
1338#define R0900_P2_CAR2CFG 0xf290 1353#define R0900_P2_CAR2CFG 0xf290
1339#define F0900_P2_DESCRAMB_OFF 0xf2900080 1354#define F0900_P2_CARRIER3_DISABLE 0xf2900040
1340#define F0900_P2_PN4_SELECT 0xf2900040 1355#define F0900_P2_ROTA2ON 0xf2900004
1341#define F0900_P2_CFR2_STOPDVBS1 0xf2900020 1356#define F0900_P2_PH_DET_ALGO2 0xf2900003
1342#define F0900_P2_STOP_CFR2UPDATE 0xf2900010 1357
1343#define F0900_P2_STOP_NCO2UPDATE 0xf2900008 1358/*P2_CFR2CFR1*/
1344#define F0900_P2_ROTA2ON 0xf2900004 1359#define R0900_P2_CFR2CFR1 0xf291
1345#define F0900_P2_PH_DET_ALGO2 0xf2900003 1360#define F0900_P2_CFR2TOCFR1_DVBS1 0xf29100c0
1346 1361#define F0900_P2_EN_S2CAR2CENTER 0xf2910020
1347/*P2_ACLC2*/ 1362#define F0900_P2_DIS_BCHERRCFR2 0xf2910010
1348#define R0900_P2_ACLC2 0xf291 1363#define F0900_P2_CFR2TOCFR1_BETA 0xf2910007
1349#define F0900_P2_CAR2_PUNCT_ADERAT 0xf2910040
1350#define F0900_P2_CAR2_ALPHA_MANT 0xf2910030
1351#define F0900_P2_CAR2_ALPHA_EXP 0xf291000f
1352
1353/*P2_BCLC2*/
1354#define R0900_P2_BCLC2 0xf292
1355#define F0900_P2_DVBS2_NIP 0xf2920080
1356#define F0900_P2_CAR2_PUNCT_BDERAT 0xf2920040
1357#define F0900_P2_CAR2_BETA_MANT 0xf2920030
1358#define F0900_P2_CAR2_BETA_EXP 0xf292000f
1359 1364
1360/*P2_CFR22*/ 1365/*P2_CFR22*/
1361#define R0900_P2_CFR22 0xf293 1366#define R0900_P2_CFR22 0xf293
1362#define F0900_P2_CAR2_FREQ2 0xf29301ff 1367#define F0900_P2_CAR2_FREQ2 0xf29301ff
1363 1368
1364/*P2_CFR21*/ 1369/*P2_CFR21*/
1365#define R0900_P2_CFR21 0xf294 1370#define R0900_P2_CFR21 0xf294
1366#define F0900_P2_CAR2_FREQ1 0xf29400ff 1371#define F0900_P2_CAR2_FREQ1 0xf29400ff
1367 1372
1368/*P2_CFR20*/ 1373/*P2_CFR20*/
1369#define R0900_P2_CFR20 0xf295 1374#define R0900_P2_CFR20 0xf295
1370#define F0900_P2_CAR2_FREQ0 0xf29500ff 1375#define F0900_P2_CAR2_FREQ0 0xf29500ff
1371 1376
1372/*P2_ACLC2S2Q*/ 1377/*P2_ACLC2S2Q*/
1373#define R0900_P2_ACLC2S2Q 0xf297 1378#define R0900_P2_ACLC2S2Q 0xf297
1374#define F0900_P2_ENAB_SPSKSYMB 0xf2970080 1379#define F0900_P2_ENAB_SPSKSYMB 0xf2970080
1375#define F0900_P2_CAR2S2_QADERAT 0xf2970040 1380#define F0900_P2_CAR2S2_Q_ALPH_M 0xf2970030
1376#define F0900_P2_CAR2S2_Q_ALPH_M 0xf2970030 1381#define F0900_P2_CAR2S2_Q_ALPH_E 0xf297000f
1377#define F0900_P2_CAR2S2_Q_ALPH_E 0xf297000f
1378 1382
1379/*P2_ACLC2S28*/ 1383/*P2_ACLC2S28*/
1380#define R0900_P2_ACLC2S28 0xf298 1384#define R0900_P2_ACLC2S28 0xf298
1381#define F0900_P2_OLDI3Q_MODE 0xf2980080 1385#define F0900_P2_OLDI3Q_MODE 0xf2980080
1382#define F0900_P2_CAR2S2_8ADERAT 0xf2980040 1386#define F0900_P2_CAR2S2_8_ALPH_M 0xf2980030
1383#define F0900_P2_CAR2S2_8_ALPH_M 0xf2980030 1387#define F0900_P2_CAR2S2_8_ALPH_E 0xf298000f
1384#define F0900_P2_CAR2S2_8_ALPH_E 0xf298000f
1385 1388
1386/*P2_ACLC2S216A*/ 1389/*P2_ACLC2S216A*/
1387#define R0900_P2_ACLC2S216A 0xf299 1390#define R0900_P2_ACLC2S216A 0xf299
1388#define F0900_P2_CAR2S2_16ADERAT 0xf2990040 1391#define F0900_P2_DIS_C3STOPA2 0xf2990080
1389#define F0900_P2_CAR2S2_16A_ALPH_M 0xf2990030 1392#define F0900_P2_CAR2S2_16ADERAT 0xf2990040
1390#define F0900_P2_CAR2S2_16A_ALPH_E 0xf299000f 1393#define F0900_P2_CAR2S2_16A_ALPH_M 0xf2990030
1394#define F0900_P2_CAR2S2_16A_ALPH_E 0xf299000f
1391 1395
1392/*P2_ACLC2S232A*/ 1396/*P2_ACLC2S232A*/
1393#define R0900_P2_ACLC2S232A 0xf29a 1397#define R0900_P2_ACLC2S232A 0xf29a
1394#define F0900_P2_CAR2S2_32ADERAT 0xf29a0040 1398#define F0900_P2_CAR2S2_32ADERAT 0xf29a0040
1395#define F0900_P2_CAR2S2_32A_ALPH_M 0xf29a0030 1399#define F0900_P2_CAR2S2_32A_ALPH_M 0xf29a0030
1396#define F0900_P2_CAR2S2_32A_ALPH_E 0xf29a000f 1400#define F0900_P2_CAR2S2_32A_ALPH_E 0xf29a000f
1397 1401
1398/*P2_BCLC2S2Q*/ 1402/*P2_BCLC2S2Q*/
1399#define R0900_P2_BCLC2S2Q 0xf29c 1403#define R0900_P2_BCLC2S2Q 0xf29c
1400#define F0900_P2_DVBS2S2Q_NIP 0xf29c0080 1404#define F0900_P2_CAR2S2_Q_BETA_M 0xf29c0030
1401#define F0900_P2_CAR2S2_QBDERAT 0xf29c0040 1405#define F0900_P2_CAR2S2_Q_BETA_E 0xf29c000f
1402#define F0900_P2_CAR2S2_Q_BETA_M 0xf29c0030
1403#define F0900_P2_CAR2S2_Q_BETA_E 0xf29c000f
1404 1406
1405/*P2_BCLC2S28*/ 1407/*P2_BCLC2S28*/
1406#define R0900_P2_BCLC2S28 0xf29d 1408#define R0900_P2_BCLC2S28 0xf29d
1407#define F0900_P2_DVBS2S28_NIP 0xf29d0080 1409#define F0900_P2_CAR2S2_8_BETA_M 0xf29d0030
1408#define F0900_P2_CAR2S2_8BDERAT 0xf29d0040 1410#define F0900_P2_CAR2S2_8_BETA_E 0xf29d000f
1409#define F0900_P2_CAR2S2_8_BETA_M 0xf29d0030
1410#define F0900_P2_CAR2S2_8_BETA_E 0xf29d000f
1411 1411
1412/*P2_BCLC2S216A*/ 1412/*P2_BCLC2S216A*/
1413#define R0900_P2_BCLC2S216A 0xf29e 1413#define R0900_P2_BCLC2S216A 0xf29e
1414#define F0900_P2_DVBS2S216A_NIP 0xf29e0080
1415#define F0900_P2_CAR2S2_16BDERAT 0xf29e0040
1416#define F0900_P2_CAR2S2_16A_BETA_M 0xf29e0030
1417#define F0900_P2_CAR2S2_16A_BETA_E 0xf29e000f
1418 1414
1419/*P2_BCLC2S232A*/ 1415/*P2_BCLC2S232A*/
1420#define R0900_P2_BCLC2S232A 0xf29f 1416#define R0900_P2_BCLC2S232A 0xf29f
1421#define F0900_P2_DVBS2S232A_NIP 0xf29f0080
1422#define F0900_P2_CAR2S2_32BDERAT 0xf29f0040
1423#define F0900_P2_CAR2S2_32A_BETA_M 0xf29f0030
1424#define F0900_P2_CAR2S2_32A_BETA_E 0xf29f000f
1425 1417
1426/*P2_PLROOT2*/ 1418/*P2_PLROOT2*/
1427#define R0900_P2_PLROOT2 0xf2ac 1419#define R0900_P2_PLROOT2 0xf2ac
1428#define F0900_P2_SHORTFR_DISABLE 0xf2ac0080 1420#define F0900_P2_PLSCRAMB_MODE 0xf2ac000c
1429#define F0900_P2_LONGFR_DISABLE 0xf2ac0040 1421#define F0900_P2_PLSCRAMB_ROOT2 0xf2ac0003
1430#define F0900_P2_DUMMYPL_DISABLE 0xf2ac0020
1431#define F0900_P2_SHORTFR_AVOID 0xf2ac0010
1432#define F0900_P2_PLSCRAMB_MODE 0xf2ac000c
1433#define F0900_P2_PLSCRAMB_ROOT2 0xf2ac0003
1434 1422
1435/*P2_PLROOT1*/ 1423/*P2_PLROOT1*/
1436#define R0900_P2_PLROOT1 0xf2ad 1424#define R0900_P2_PLROOT1 0xf2ad
1437#define F0900_P2_PLSCRAMB_ROOT1 0xf2ad00ff 1425#define F0900_P2_PLSCRAMB_ROOT1 0xf2ad00ff
1438 1426
1439/*P2_PLROOT0*/ 1427/*P2_PLROOT0*/
1440#define R0900_P2_PLROOT0 0xf2ae 1428#define R0900_P2_PLROOT0 0xf2ae
1441#define F0900_P2_PLSCRAMB_ROOT0 0xf2ae00ff 1429#define F0900_P2_PLSCRAMB_ROOT0 0xf2ae00ff
1442 1430
1443/*P2_MODCODLST0*/ 1431/*P2_MODCODLST0*/
1444#define R0900_P2_MODCODLST0 0xf2b0 1432#define R0900_P2_MODCODLST0 0xf2b0
1445#define F0900_P2_EN_TOKEN31 0xf2b00080
1446#define F0900_P2_SYNCTAG_SELECT 0xf2b00040
1447#define F0900_P2_MODCODRQ_MODE 0xf2b00030
1448 1433
1449/*P2_MODCODLST1*/ 1434/*P2_MODCODLST1*/
1450#define R0900_P2_MODCODLST1 0xf2b1 1435#define R0900_P2_MODCODLST1 0xf2b1
1451#define F0900_P2_DIS_MODCOD29 0xf2b100f0 1436#define F0900_P2_DIS_MODCOD29 0xf2b100f0
1452#define F0900_P2_DIS_32PSK_9_10 0xf2b1000f 1437#define F0900_P2_DIS_32PSK_9_10 0xf2b1000f
1453 1438
1454/*P2_MODCODLST2*/ 1439/*P2_MODCODLST2*/
1455#define R0900_P2_MODCODLST2 0xf2b2 1440#define R0900_P2_MODCODLST2 0xf2b2
1456#define F0900_P2_DIS_32PSK_8_9 0xf2b200f0 1441#define F0900_P2_DIS_32PSK_8_9 0xf2b200f0
1457#define F0900_P2_DIS_32PSK_5_6 0xf2b2000f 1442#define F0900_P2_DIS_32PSK_5_6 0xf2b2000f
1458 1443
1459/*P2_MODCODLST3*/ 1444/*P2_MODCODLST3*/
1460#define R0900_P2_MODCODLST3 0xf2b3 1445#define R0900_P2_MODCODLST3 0xf2b3
1461#define F0900_P2_DIS_32PSK_4_5 0xf2b300f0 1446#define F0900_P2_DIS_32PSK_4_5 0xf2b300f0
1462#define F0900_P2_DIS_32PSK_3_4 0xf2b3000f 1447#define F0900_P2_DIS_32PSK_3_4 0xf2b3000f
1463 1448
1464/*P2_MODCODLST4*/ 1449/*P2_MODCODLST4*/
1465#define R0900_P2_MODCODLST4 0xf2b4 1450#define R0900_P2_MODCODLST4 0xf2b4
1466#define F0900_P2_DIS_16PSK_9_10 0xf2b400f0 1451#define F0900_P2_DIS_16PSK_9_10 0xf2b400f0
1467#define F0900_P2_DIS_16PSK_8_9 0xf2b4000f 1452#define F0900_P2_DIS_16PSK_8_9 0xf2b4000f
1468 1453
1469/*P2_MODCODLST5*/ 1454/*P2_MODCODLST5*/
1470#define R0900_P2_MODCODLST5 0xf2b5 1455#define R0900_P2_MODCODLST5 0xf2b5
1471#define F0900_P2_DIS_16PSK_5_6 0xf2b500f0 1456#define F0900_P2_DIS_16PSK_5_6 0xf2b500f0
1472#define F0900_P2_DIS_16PSK_4_5 0xf2b5000f 1457#define F0900_P2_DIS_16PSK_4_5 0xf2b5000f
1473 1458
1474/*P2_MODCODLST6*/ 1459/*P2_MODCODLST6*/
1475#define R0900_P2_MODCODLST6 0xf2b6 1460#define R0900_P2_MODCODLST6 0xf2b6
1476#define F0900_P2_DIS_16PSK_3_4 0xf2b600f0 1461#define F0900_P2_DIS_16PSK_3_4 0xf2b600f0
1477#define F0900_P2_DIS_16PSK_2_3 0xf2b6000f 1462#define F0900_P2_DIS_16PSK_2_3 0xf2b6000f
1478 1463
1479/*P2_MODCODLST7*/ 1464/*P2_MODCODLST7*/
1480#define R0900_P2_MODCODLST7 0xf2b7 1465#define R0900_P2_MODCODLST7 0xf2b7
1481#define F0900_P2_DIS_8P_9_10 0xf2b700f0 1466#define F0900_P2_DIS_8P_9_10 0xf2b700f0
1482#define F0900_P2_DIS_8P_8_9 0xf2b7000f 1467#define F0900_P2_DIS_8P_8_9 0xf2b7000f
1483 1468
1484/*P2_MODCODLST8*/ 1469/*P2_MODCODLST8*/
1485#define R0900_P2_MODCODLST8 0xf2b8 1470#define R0900_P2_MODCODLST8 0xf2b8
1486#define F0900_P2_DIS_8P_5_6 0xf2b800f0 1471#define F0900_P2_DIS_8P_5_6 0xf2b800f0
1487#define F0900_P2_DIS_8P_3_4 0xf2b8000f 1472#define F0900_P2_DIS_8P_3_4 0xf2b8000f
1488 1473
1489/*P2_MODCODLST9*/ 1474/*P2_MODCODLST9*/
1490#define R0900_P2_MODCODLST9 0xf2b9 1475#define R0900_P2_MODCODLST9 0xf2b9
1491#define F0900_P2_DIS_8P_2_3 0xf2b900f0 1476#define F0900_P2_DIS_8P_2_3 0xf2b900f0
1492#define F0900_P2_DIS_8P_3_5 0xf2b9000f 1477#define F0900_P2_DIS_8P_3_5 0xf2b9000f
1493 1478
1494/*P2_MODCODLSTA*/ 1479/*P2_MODCODLSTA*/
1495#define R0900_P2_MODCODLSTA 0xf2ba 1480#define R0900_P2_MODCODLSTA 0xf2ba
1496#define F0900_P2_DIS_QP_9_10 0xf2ba00f0 1481#define F0900_P2_DIS_QP_9_10 0xf2ba00f0
1497#define F0900_P2_DIS_QP_8_9 0xf2ba000f 1482#define F0900_P2_DIS_QP_8_9 0xf2ba000f
1498 1483
1499/*P2_MODCODLSTB*/ 1484/*P2_MODCODLSTB*/
1500#define R0900_P2_MODCODLSTB 0xf2bb 1485#define R0900_P2_MODCODLSTB 0xf2bb
1501#define F0900_P2_DIS_QP_5_6 0xf2bb00f0 1486#define F0900_P2_DIS_QP_5_6 0xf2bb00f0
1502#define F0900_P2_DIS_QP_4_5 0xf2bb000f 1487#define F0900_P2_DIS_QP_4_5 0xf2bb000f
1503 1488
1504/*P2_MODCODLSTC*/ 1489/*P2_MODCODLSTC*/
1505#define R0900_P2_MODCODLSTC 0xf2bc 1490#define R0900_P2_MODCODLSTC 0xf2bc
1506#define F0900_P2_DIS_QP_3_4 0xf2bc00f0 1491#define F0900_P2_DIS_QP_3_4 0xf2bc00f0
1507#define F0900_P2_DIS_QP_2_3 0xf2bc000f 1492#define F0900_P2_DIS_QP_2_3 0xf2bc000f
1508 1493
1509/*P2_MODCODLSTD*/ 1494/*P2_MODCODLSTD*/
1510#define R0900_P2_MODCODLSTD 0xf2bd 1495#define R0900_P2_MODCODLSTD 0xf2bd
1511#define F0900_P2_DIS_QP_3_5 0xf2bd00f0 1496#define F0900_P2_DIS_QP_3_5 0xf2bd00f0
1512#define F0900_P2_DIS_QP_1_2 0xf2bd000f 1497#define F0900_P2_DIS_QP_1_2 0xf2bd000f
1513 1498
1514/*P2_MODCODLSTE*/ 1499/*P2_MODCODLSTE*/
1515#define R0900_P2_MODCODLSTE 0xf2be 1500#define R0900_P2_MODCODLSTE 0xf2be
1516#define F0900_P2_DIS_QP_2_5 0xf2be00f0 1501#define F0900_P2_DIS_QP_2_5 0xf2be00f0
1517#define F0900_P2_DIS_QP_1_3 0xf2be000f 1502#define F0900_P2_DIS_QP_1_3 0xf2be000f
1518 1503
1519/*P2_MODCODLSTF*/ 1504/*P2_MODCODLSTF*/
1520#define R0900_P2_MODCODLSTF 0xf2bf 1505#define R0900_P2_MODCODLSTF 0xf2bf
1521#define F0900_P2_DIS_QP_1_4 0xf2bf00f0 1506#define F0900_P2_DIS_QP_1_4 0xf2bf00f0
1522#define F0900_P2_DDEMOD_SET 0xf2bf0002 1507
1523#define F0900_P2_DDEMOD_MASK 0xf2bf0001 1508/*P2_GAUSSR0*/
1509#define R0900_P2_GAUSSR0 0xf2c0
1510#define F0900_P2_EN_CCIMODE 0xf2c00080
1511#define F0900_P2_R0_GAUSSIEN 0xf2c0007f
1512
1513/*P2_CCIR0*/
1514#define R0900_P2_CCIR0 0xf2c1
1515#define F0900_P2_CCIDETECT_PLHONLY 0xf2c10080
1516#define F0900_P2_R0_CCI 0xf2c1007f
1517
1518/*P2_CCIQUANT*/
1519#define R0900_P2_CCIQUANT 0xf2c2
1520#define F0900_P2_CCI_BETA 0xf2c200e0
1521#define F0900_P2_CCI_QUANT 0xf2c2001f
1522
1523/*P2_CCITHRES*/
1524#define R0900_P2_CCITHRES 0xf2c3
1525#define F0900_P2_CCI_THRESHOLD 0xf2c300ff
1526
1527/*P2_CCIACC*/
1528#define R0900_P2_CCIACC 0xf2c4
1529#define F0900_P2_CCI_VALUE 0xf2c400ff
1524 1530
1525/*P2_DMDRESCFG*/ 1531/*P2_DMDRESCFG*/
1526#define R0900_P2_DMDRESCFG 0xf2c6 1532#define R0900_P2_DMDRESCFG 0xf2c6
1527#define F0900_P2_DMDRES_RESET 0xf2c60080 1533#define F0900_P2_DMDRES_RESET 0xf2c60080
1528#define F0900_P2_DMDRES_NOISESQR 0xf2c60010 1534#define F0900_P2_DMDRES_STRALL 0xf2c60008
1529#define F0900_P2_DMDRES_STRALL 0xf2c60008 1535#define F0900_P2_DMDRES_NEWONLY 0xf2c60004
1530#define F0900_P2_DMDRES_NEWONLY 0xf2c60004 1536#define F0900_P2_DMDRES_NOSTORE 0xf2c60002
1531#define F0900_P2_DMDRES_NOSTORE 0xf2c60002
1532#define F0900_P2_DMDRES_AGC2MEM 0xf2c60001
1533 1537
1534/*P2_DMDRESADR*/ 1538/*P2_DMDRESADR*/
1535#define R0900_P2_DMDRESADR 0xf2c7 1539#define R0900_P2_DMDRESADR 0xf2c7
1536#define F0900_P2_SUSP_PREDCANAL 0xf2c70080 1540#define F0900_P2_DMDRES_VALIDCFR 0xf2c70040
1537#define F0900_P2_DMDRES_VALIDCFR 0xf2c70040 1541#define F0900_P2_DMDRES_MEMFULL 0xf2c70030
1538#define F0900_P2_DMDRES_MEMFULL 0xf2c70030 1542#define F0900_P2_DMDRES_RESNBR 0xf2c7000f
1539#define F0900_P2_DMDRES_RESNBR 0xf2c7000f
1540 1543
1541/*P2_DMDRESDATA7*/ 1544/*P2_DMDRESDATA7*/
1542#define R0900_P2_DMDRESDATA7 0xf2c8 1545#define R0900_P2_DMDRESDATA7 0xf2c8
1543#define F0900_P2_DMDRES_DATA7 0xf2c800ff 1546#define F0900_P2_DMDRES_DATA7 0xf2c800ff
1544 1547
1545/*P2_DMDRESDATA6*/ 1548/*P2_DMDRESDATA6*/
1546#define R0900_P2_DMDRESDATA6 0xf2c9 1549#define R0900_P2_DMDRESDATA6 0xf2c9
1547#define F0900_P2_DMDRES_DATA6 0xf2c900ff 1550#define F0900_P2_DMDRES_DATA6 0xf2c900ff
1548 1551
1549/*P2_DMDRESDATA5*/ 1552/*P2_DMDRESDATA5*/
1550#define R0900_P2_DMDRESDATA5 0xf2ca 1553#define R0900_P2_DMDRESDATA5 0xf2ca
1551#define F0900_P2_DMDRES_DATA5 0xf2ca00ff 1554#define F0900_P2_DMDRES_DATA5 0xf2ca00ff
1552 1555
1553/*P2_DMDRESDATA4*/ 1556/*P2_DMDRESDATA4*/
1554#define R0900_P2_DMDRESDATA4 0xf2cb 1557#define R0900_P2_DMDRESDATA4 0xf2cb
1555#define F0900_P2_DMDRES_DATA4 0xf2cb00ff 1558#define F0900_P2_DMDRES_DATA4 0xf2cb00ff
1556 1559
1557/*P2_DMDRESDATA3*/ 1560/*P2_DMDRESDATA3*/
1558#define R0900_P2_DMDRESDATA3 0xf2cc 1561#define R0900_P2_DMDRESDATA3 0xf2cc
1559#define F0900_P2_DMDRES_DATA3 0xf2cc00ff 1562#define F0900_P2_DMDRES_DATA3 0xf2cc00ff
1560 1563
1561/*P2_DMDRESDATA2*/ 1564/*P2_DMDRESDATA2*/
1562#define R0900_P2_DMDRESDATA2 0xf2cd 1565#define R0900_P2_DMDRESDATA2 0xf2cd
1563#define F0900_P2_DMDRES_DATA2 0xf2cd00ff 1566#define F0900_P2_DMDRES_DATA2 0xf2cd00ff
1564 1567
1565/*P2_DMDRESDATA1*/ 1568/*P2_DMDRESDATA1*/
1566#define R0900_P2_DMDRESDATA1 0xf2ce 1569#define R0900_P2_DMDRESDATA1 0xf2ce
1567#define F0900_P2_DMDRES_DATA1 0xf2ce00ff 1570#define F0900_P2_DMDRES_DATA1 0xf2ce00ff
1568 1571
1569/*P2_DMDRESDATA0*/ 1572/*P2_DMDRESDATA0*/
1570#define R0900_P2_DMDRESDATA0 0xf2cf 1573#define R0900_P2_DMDRESDATA0 0xf2cf
1571#define F0900_P2_DMDRES_DATA0 0xf2cf00ff 1574#define F0900_P2_DMDRES_DATA0 0xf2cf00ff
1572 1575
1573/*P2_FFEI1*/ 1576/*P2_FFEI1*/
1574#define R0900_P2_FFEI1 0xf2d0 1577#define R0900_P2_FFEI1 0xf2d0
1575#define F0900_P2_FFE_ACCI1 0xf2d001ff 1578#define F0900_P2_FFE_ACCI1 0xf2d001ff
1576 1579
1577/*P2_FFEQ1*/ 1580/*P2_FFEQ1*/
1578#define R0900_P2_FFEQ1 0xf2d1 1581#define R0900_P2_FFEQ1 0xf2d1
1579#define F0900_P2_FFE_ACCQ1 0xf2d101ff 1582#define F0900_P2_FFE_ACCQ1 0xf2d101ff
1580 1583
1581/*P2_FFEI2*/ 1584/*P2_FFEI2*/
1582#define R0900_P2_FFEI2 0xf2d2 1585#define R0900_P2_FFEI2 0xf2d2
1583#define F0900_P2_FFE_ACCI2 0xf2d201ff 1586#define F0900_P2_FFE_ACCI2 0xf2d201ff
1584 1587
1585/*P2_FFEQ2*/ 1588/*P2_FFEQ2*/
1586#define R0900_P2_FFEQ2 0xf2d3 1589#define R0900_P2_FFEQ2 0xf2d3
1587#define F0900_P2_FFE_ACCQ2 0xf2d301ff 1590#define F0900_P2_FFE_ACCQ2 0xf2d301ff
1588 1591
1589/*P2_FFEI3*/ 1592/*P2_FFEI3*/
1590#define R0900_P2_FFEI3 0xf2d4 1593#define R0900_P2_FFEI3 0xf2d4
1591#define F0900_P2_FFE_ACCI3 0xf2d401ff 1594#define F0900_P2_FFE_ACCI3 0xf2d401ff
1592 1595
1593/*P2_FFEQ3*/ 1596/*P2_FFEQ3*/
1594#define R0900_P2_FFEQ3 0xf2d5 1597#define R0900_P2_FFEQ3 0xf2d5
1595#define F0900_P2_FFE_ACCQ3 0xf2d501ff 1598#define F0900_P2_FFE_ACCQ3 0xf2d501ff
1596 1599
1597/*P2_FFEI4*/ 1600/*P2_FFEI4*/
1598#define R0900_P2_FFEI4 0xf2d6 1601#define R0900_P2_FFEI4 0xf2d6
1599#define F0900_P2_FFE_ACCI4 0xf2d601ff 1602#define F0900_P2_FFE_ACCI4 0xf2d601ff
1600 1603
1601/*P2_FFEQ4*/ 1604/*P2_FFEQ4*/
1602#define R0900_P2_FFEQ4 0xf2d7 1605#define R0900_P2_FFEQ4 0xf2d7
1603#define F0900_P2_FFE_ACCQ4 0xf2d701ff 1606#define F0900_P2_FFE_ACCQ4 0xf2d701ff
1604 1607
1605/*P2_FFECFG*/ 1608/*P2_FFECFG*/
1606#define R0900_P2_FFECFG 0xf2d8 1609#define R0900_P2_FFECFG 0xf2d8
1607#define F0900_P2_EQUALFFE_ON 0xf2d80040 1610#define F0900_P2_EQUALFFE_ON 0xf2d80040
1608#define F0900_P2_EQUAL_USEDSYMB 0xf2d80030 1611#define F0900_P2_MU_EQUALFFE 0xf2d80007
1609#define F0900_P2_MU_EQUALFFE 0xf2d80007
1610 1612
1611/*P2_TNRCFG*/ 1613/*P2_TNRCFG*/
1612#define R0900_P2_TNRCFG 0xf2e0 1614#define R0900_P2_TNRCFG 0xf2e0
1613#define F0900_P2_TUN_ACKFAIL 0xf2e00080 1615#define F0900_P2_TUN_ACKFAIL 0xf2e00080
1614#define F0900_P2_TUN_TYPE 0xf2e00070 1616#define F0900_P2_TUN_TYPE 0xf2e00070
1615#define F0900_P2_TUN_SECSTOP 0xf2e00008 1617#define F0900_P2_TUN_SECSTOP 0xf2e00008
1616#define F0900_P2_TUN_VCOSRCH 0xf2e00004 1618#define F0900_P2_TUN_VCOSRCH 0xf2e00004
1617#define F0900_P2_TUN_MADDRESS 0xf2e00003 1619#define F0900_P2_TUN_MADDRESS 0xf2e00003
1618 1620
1619/*P2_TNRCFG2*/ 1621/*P2_TNRCFG2*/
1620#define R0900_P2_TNRCFG2 0xf2e1 1622#define R0900_P2_TNRCFG2 0xf2e1
1621#define F0900_P2_TUN_IQSWAP 0xf2e10080 1623#define F0900_P2_TUN_IQSWAP 0xf2e10080
1622#define F0900_P2_STB6110_STEP2MHZ 0xf2e10040 1624#define F0900_P2_DIS_BWCALC 0xf2e10004
1623#define F0900_P2_STB6120_DBLI2C 0xf2e10020 1625#define F0900_P2_SHORT_WAITSTATES 0xf2e10002
1624#define F0900_P2_DIS_FCCK 0xf2e10010
1625#define F0900_P2_DIS_LPEN 0xf2e10008
1626#define F0900_P2_DIS_BWCALC 0xf2e10004
1627#define F0900_P2_SHORT_WAITSTATES 0xf2e10002
1628#define F0900_P2_DIS_2BWAGC1 0xf2e10001
1629 1626
1630/*P2_TNRXTAL*/ 1627/*P2_TNRXTAL*/
1631#define R0900_P2_TNRXTAL 0xf2e4 1628#define R0900_P2_TNRXTAL 0xf2e4
1632#define F0900_P2_TUN_MCLKDECIMAL 0xf2e400e0 1629#define F0900_P2_TUN_XTALFREQ 0xf2e4001f
1633#define F0900_P2_TUN_XTALFREQ 0xf2e4001f
1634 1630
1635/*P2_TNRSTEPS*/ 1631/*P2_TNRSTEPS*/
1636#define R0900_P2_TNRSTEPS 0xf2e7 1632#define R0900_P2_TNRSTEPS 0xf2e7
1637#define F0900_P2_TUNER_BW1P6 0xf2e70080 1633#define F0900_P2_TUNER_BW0P125 0xf2e70080
1638#define F0900_P2_BWINC_OFFSET 0xf2e70070 1634#define F0900_P2_BWINC_OFFSET 0xf2e70170
1639#define F0900_P2_SOFTSTEP_RNG 0xf2e70008 1635#define F0900_P2_SOFTSTEP_RNG 0xf2e70008
1640#define F0900_P2_TUN_BWOFFSET 0xf2e70107 1636#define F0900_P2_TUN_BWOFFSET 0xf2e70007
1641 1637
1642/*P2_TNRGAIN*/ 1638/*P2_TNRGAIN*/
1643#define R0900_P2_TNRGAIN 0xf2e8 1639#define R0900_P2_TNRGAIN 0xf2e8
1644#define F0900_P2_TUN_KDIVEN 0xf2e800c0 1640#define F0900_P2_TUN_KDIVEN 0xf2e800c0
1645#define F0900_P2_STB6X00_OCK 0xf2e80030 1641#define F0900_P2_STB6X00_OCK 0xf2e80030
1646#define F0900_P2_TUN_GAIN 0xf2e8000f 1642#define F0900_P2_TUN_GAIN 0xf2e8000f
1647 1643
1648/*P2_TNRRF1*/ 1644/*P2_TNRRF1*/
1649#define R0900_P2_TNRRF1 0xf2e9 1645#define R0900_P2_TNRRF1 0xf2e9
1650#define F0900_P2_TUN_RFFREQ2 0xf2e900ff 1646#define F0900_P2_TUN_RFFREQ2 0xf2e900ff
1651 1647
1652/*P2_TNRRF0*/ 1648/*P2_TNRRF0*/
1653#define R0900_P2_TNRRF0 0xf2ea 1649#define R0900_P2_TNRRF0 0xf2ea
1654#define F0900_P2_TUN_RFFREQ1 0xf2ea00ff 1650#define F0900_P2_TUN_RFFREQ1 0xf2ea00ff
1655 1651
1656/*P2_TNRBW*/ 1652/*P2_TNRBW*/
1657#define R0900_P2_TNRBW 0xf2eb 1653#define R0900_P2_TNRBW 0xf2eb
1658#define F0900_P2_TUN_RFFREQ0 0xf2eb00c0 1654#define F0900_P2_TUN_RFFREQ0 0xf2eb00c0
1659#define F0900_P2_TUN_BW 0xf2eb003f 1655#define F0900_P2_TUN_BW 0xf2eb003f
1660 1656
1661/*P2_TNRADJ*/ 1657/*P2_TNRADJ*/
1662#define R0900_P2_TNRADJ 0xf2ec 1658#define R0900_P2_TNRADJ 0xf2ec
1663#define F0900_P2_STB61X0_RCLK 0xf2ec0080 1659#define F0900_P2_STB61X0_CALTIME 0xf2ec0040
1664#define F0900_P2_STB61X0_CALTIME 0xf2ec0040
1665#define F0900_P2_STB6X00_DLB 0xf2ec0038
1666#define F0900_P2_STB6000_FCL 0xf2ec0007
1667 1660
1668/*P2_TNRCTL2*/ 1661/*P2_TNRCTL2*/
1669#define R0900_P2_TNRCTL2 0xf2ed 1662#define R0900_P2_TNRCTL2 0xf2ed
1670#define F0900_P2_STB61X0_LCP1_RCCKOFF 0xf2ed0080 1663#define F0900_P2_STB61X0_RCCKOFF 0xf2ed0080
1671#define F0900_P2_STB61X0_LCP0 0xf2ed0040 1664#define F0900_P2_STB61X0_ICP_SDOFF 0xf2ed0040
1672#define F0900_P2_STB61X0_XTOUT_RFOUTS 0xf2ed0020 1665#define F0900_P2_STB61X0_DCLOOPOFF 0xf2ed0020
1673#define F0900_P2_STB61X0_XTON_MCKDV 0xf2ed0010 1666#define F0900_P2_STB61X0_REFOUTSEL 0xf2ed0010
1674#define F0900_P2_STB61X0_CALOFF_DCOFF 0xf2ed0008 1667#define F0900_P2_STB61X0_CALOFF 0xf2ed0008
1675#define F0900_P2_STB6110_LPT 0xf2ed0004 1668#define F0900_P2_STB6XX0_LPT_BEN 0xf2ed0004
1676#define F0900_P2_STB6110_RX 0xf2ed0002 1669#define F0900_P2_STB6XX0_RX_OSCP 0xf2ed0002
1677#define F0900_P2_STB6110_SYN 0xf2ed0001 1670#define F0900_P2_STB6XX0_SYN 0xf2ed0001
1678 1671
1679/*P2_TNRCFG3*/ 1672/*P2_TNRCFG3*/
1680#define R0900_P2_TNRCFG3 0xf2ee 1673#define R0900_P2_TNRCFG3 0xf2ee
1681#define F0900_P2_STB6120_DISCTRL1 0xf2ee0080 1674#define F0900_P2_TUN_PLLFREQ 0xf2ee001c
1682#define F0900_P2_STB6120_INVORDER 0xf2ee0040 1675#define F0900_P2_TUN_I2CFREQ_MODE 0xf2ee0003
1683#define F0900_P2_STB6120_ENCTRL6 0xf2ee0020
1684#define F0900_P2_TUN_PLLFREQ 0xf2ee001c
1685#define F0900_P2_TUN_I2CFREQ_MODE 0xf2ee0003
1686 1676
1687/*P2_TNRLAUNCH*/ 1677/*P2_TNRLAUNCH*/
1688#define R0900_P2_TNRLAUNCH 0xf2f0 1678#define R0900_P2_TNRLAUNCH 0xf2f0
1689 1679
1690/*P2_TNRLD*/ 1680/*P2_TNRLD*/
1691#define R0900_P2_TNRLD 0xf2f0 1681#define R0900_P2_TNRLD 0xf2f0
1692#define F0900_P2_TUNLD_VCOING 0xf2f00080 1682#define F0900_P2_TUNLD_VCOING 0xf2f00080
1693#define F0900_P2_TUN_REG1FAIL 0xf2f00040 1683#define F0900_P2_TUN_REG1FAIL 0xf2f00040
1694#define F0900_P2_TUN_REG2FAIL 0xf2f00020 1684#define F0900_P2_TUN_REG2FAIL 0xf2f00020
1695#define F0900_P2_TUN_REG3FAIL 0xf2f00010 1685#define F0900_P2_TUN_REG3FAIL 0xf2f00010
1696#define F0900_P2_TUN_REG4FAIL 0xf2f00008 1686#define F0900_P2_TUN_REG4FAIL 0xf2f00008
1697#define F0900_P2_TUN_REG5FAIL 0xf2f00004 1687#define F0900_P2_TUN_REG5FAIL 0xf2f00004
1698#define F0900_P2_TUN_BWING 0xf2f00002 1688#define F0900_P2_TUN_BWING 0xf2f00002
1699#define F0900_P2_TUN_LOCKED 0xf2f00001 1689#define F0900_P2_TUN_LOCKED 0xf2f00001
1700 1690
1701/*P2_TNROBSL*/ 1691/*P2_TNROBSL*/
1702#define R0900_P2_TNROBSL 0xf2f6 1692#define R0900_P2_TNROBSL 0xf2f6
1703#define F0900_P2_TUN_I2CABORTED 0xf2f60080 1693#define F0900_P2_TUN_I2CABORTED 0xf2f60080
1704#define F0900_P2_TUN_LPEN 0xf2f60040 1694#define F0900_P2_TUN_LPEN 0xf2f60040
1705#define F0900_P2_TUN_FCCK 0xf2f60020 1695#define F0900_P2_TUN_FCCK 0xf2f60020
1706#define F0900_P2_TUN_I2CLOCKED 0xf2f60010 1696#define F0900_P2_TUN_I2CLOCKED 0xf2f60010
1707#define F0900_P2_TUN_PROGDONE 0xf2f6000c 1697#define F0900_P2_TUN_PROGDONE 0xf2f6000c
1708#define F0900_P2_TUN_RFRESTE1 0xf2f60003 1698#define F0900_P2_TUN_RFRESTE1 0xf2f60003
1709 1699
1710/*P2_TNRRESTE*/ 1700/*P2_TNRRESTE*/
1711#define R0900_P2_TNRRESTE 0xf2f7 1701#define R0900_P2_TNRRESTE 0xf2f7
1712#define F0900_P2_TUN_RFRESTE0 0xf2f700ff 1702#define F0900_P2_TUN_RFRESTE0 0xf2f700ff
1713 1703
1714/*P2_SMAPCOEF7*/ 1704/*P2_SMAPCOEF7*/
1715#define R0900_P2_SMAPCOEF7 0xf300 1705#define R0900_P2_SMAPCOEF7 0xf300
1716#define F0900_P2_DIS_QSCALE 0xf3000080 1706#define F0900_P2_DIS_QSCALE 0xf3000080
1717#define F0900_P2_SMAPCOEF_Q_LLR12 0xf300017f 1707#define F0900_P2_SMAPCOEF_Q_LLR12 0xf300017f
1718 1708
1719/*P2_SMAPCOEF6*/ 1709/*P2_SMAPCOEF6*/
1720#define R0900_P2_SMAPCOEF6 0xf301 1710#define R0900_P2_SMAPCOEF6 0xf301
1721#define F0900_P2_DIS_NEWSCALE 0xf3010008 1711#define F0900_P2_ADJ_8PSKLLR1 0xf3010004
1722#define F0900_P2_ADJ_8PSKLLR1 0xf3010004 1712#define F0900_P2_OLD_8PSKLLR1 0xf3010002
1723#define F0900_P2_OLD_8PSKLLR1 0xf3010002 1713#define F0900_P2_DIS_AB8PSK 0xf3010001
1724#define F0900_P2_DIS_AB8PSK 0xf3010001
1725 1714
1726/*P2_SMAPCOEF5*/ 1715/*P2_SMAPCOEF5*/
1727#define R0900_P2_SMAPCOEF5 0xf302 1716#define R0900_P2_SMAPCOEF5 0xf302
1728#define F0900_P2_DIS_8SCALE 0xf3020080 1717#define F0900_P2_DIS_8SCALE 0xf3020080
1729#define F0900_P2_SMAPCOEF_8P_LLR23 0xf302017f 1718#define F0900_P2_SMAPCOEF_8P_LLR23 0xf302017f
1719
1720/*P2_NCO2MAX1*/
1721#define R0900_P2_NCO2MAX1 0xf314
1722#define F0900_P2_TETA2_MAXVABS1 0xf31400ff
1723
1724/*P2_NCO2MAX0*/
1725#define R0900_P2_NCO2MAX0 0xf315
1726#define F0900_P2_TETA2_MAXVABS0 0xf31500ff
1727
1728/*P2_NCO2FR1*/
1729#define R0900_P2_NCO2FR1 0xf316
1730#define F0900_P2_NCO2FINAL_ANGLE1 0xf31600ff
1731
1732/*P2_NCO2FR0*/
1733#define R0900_P2_NCO2FR0 0xf317
1734#define F0900_P2_NCO2FINAL_ANGLE0 0xf31700ff
1735
1736/*P2_CFR2AVRGE1*/
1737#define R0900_P2_CFR2AVRGE1 0xf318
1738#define F0900_P2_I2C_CFR2AVERAGE1 0xf31800ff
1739
1740/*P2_CFR2AVRGE0*/
1741#define R0900_P2_CFR2AVRGE0 0xf319
1742#define F0900_P2_I2C_CFR2AVERAGE0 0xf31900ff
1730 1743
1731/*P2_DMDPLHSTAT*/ 1744/*P2_DMDPLHSTAT*/
1732#define R0900_P2_DMDPLHSTAT 0xf320 1745#define R0900_P2_DMDPLHSTAT 0xf320
1733#define F0900_P2_PLH_STATISTIC 0xf32000ff 1746#define F0900_P2_PLH_STATISTIC 0xf32000ff
1734 1747
1735/*P2_LOCKTIME3*/ 1748/*P2_LOCKTIME3*/
1736#define R0900_P2_LOCKTIME3 0xf322 1749#define R0900_P2_LOCKTIME3 0xf322
1737#define F0900_P2_DEMOD_LOCKTIME3 0xf32200ff 1750#define F0900_P2_DEMOD_LOCKTIME3 0xf32200ff
1738 1751
1739/*P2_LOCKTIME2*/ 1752/*P2_LOCKTIME2*/
1740#define R0900_P2_LOCKTIME2 0xf323 1753#define R0900_P2_LOCKTIME2 0xf323
1741#define F0900_P2_DEMOD_LOCKTIME2 0xf32300ff 1754#define F0900_P2_DEMOD_LOCKTIME2 0xf32300ff
1742 1755
1743/*P2_LOCKTIME1*/ 1756/*P2_LOCKTIME1*/
1744#define R0900_P2_LOCKTIME1 0xf324 1757#define R0900_P2_LOCKTIME1 0xf324
1745#define F0900_P2_DEMOD_LOCKTIME1 0xf32400ff 1758#define F0900_P2_DEMOD_LOCKTIME1 0xf32400ff
1746 1759
1747/*P2_LOCKTIME0*/ 1760/*P2_LOCKTIME0*/
1748#define R0900_P2_LOCKTIME0 0xf325 1761#define R0900_P2_LOCKTIME0 0xf325
1749#define F0900_P2_DEMOD_LOCKTIME0 0xf32500ff 1762#define F0900_P2_DEMOD_LOCKTIME0 0xf32500ff
1750 1763
1751/*P2_VITSCALE*/ 1764/*P2_VITSCALE*/
1752#define R0900_P2_VITSCALE 0xf332 1765#define R0900_P2_VITSCALE 0xf332
1753#define F0900_P2_NVTH_NOSRANGE 0xf3320080 1766#define F0900_P2_NVTH_NOSRANGE 0xf3320080
1754#define F0900_P2_VERROR_MAXMODE 0xf3320040 1767#define F0900_P2_VERROR_MAXMODE 0xf3320040
1755#define F0900_P2_KDIV_MODE 0xf3320030 1768#define F0900_P2_NSLOWSN_LOCKED 0xf3320008
1756#define F0900_P2_NSLOWSN_LOCKED 0xf3320008 1769#define F0900_P2_DIS_RSFLOCK 0xf3320002
1757#define F0900_P2_DELOCK_PRFLOSS 0xf3320004
1758#define F0900_P2_DIS_RSFLOCK 0xf3320002
1759 1770
1760/*P2_FECM*/ 1771/*P2_FECM*/
1761#define R0900_P2_FECM 0xf333 1772#define R0900_P2_FECM 0xf333
1762#define F0900_P2_DSS_DVB 0xf3330080 1773#define F0900_P2_DSS_DVB 0xf3330080
1763#define F0900_P2_DEMOD_BYPASS 0xf3330040 1774#define F0900_P2_DSS_SRCH 0xf3330010
1764#define F0900_P2_CMP_SLOWMODE 0xf3330020 1775#define F0900_P2_SYNCVIT 0xf3330002
1765#define F0900_P2_DSS_SRCH 0xf3330010 1776#define F0900_P2_IQINV 0xf3330001
1766#define F0900_P2_DIFF_MODEVIT 0xf3330004
1767#define F0900_P2_SYNCVIT 0xf3330002
1768#define F0900_P2_IQINV 0xf3330001
1769 1777
1770/*P2_VTH12*/ 1778/*P2_VTH12*/
1771#define R0900_P2_VTH12 0xf334 1779#define R0900_P2_VTH12 0xf334
1772#define F0900_P2_VTH12 0xf33400ff 1780#define F0900_P2_VTH12 0xf33400ff
1773 1781
1774/*P2_VTH23*/ 1782/*P2_VTH23*/
1775#define R0900_P2_VTH23 0xf335 1783#define R0900_P2_VTH23 0xf335
1776#define F0900_P2_VTH23 0xf33500ff 1784#define F0900_P2_VTH23 0xf33500ff
1777 1785
1778/*P2_VTH34*/ 1786/*P2_VTH34*/
1779#define R0900_P2_VTH34 0xf336 1787#define R0900_P2_VTH34 0xf336
1780#define F0900_P2_VTH34 0xf33600ff 1788#define F0900_P2_VTH34 0xf33600ff
1781 1789
1782/*P2_VTH56*/ 1790/*P2_VTH56*/
1783#define R0900_P2_VTH56 0xf337 1791#define R0900_P2_VTH56 0xf337
1784#define F0900_P2_VTH56 0xf33700ff 1792#define F0900_P2_VTH56 0xf33700ff
1785 1793
1786/*P2_VTH67*/ 1794/*P2_VTH67*/
1787#define R0900_P2_VTH67 0xf338 1795#define R0900_P2_VTH67 0xf338
1788#define F0900_P2_VTH67 0xf33800ff 1796#define F0900_P2_VTH67 0xf33800ff
1789 1797
1790/*P2_VTH78*/ 1798/*P2_VTH78*/
1791#define R0900_P2_VTH78 0xf339 1799#define R0900_P2_VTH78 0xf339
1792#define F0900_P2_VTH78 0xf33900ff 1800#define F0900_P2_VTH78 0xf33900ff
1793 1801
1794/*P2_VITCURPUN*/ 1802/*P2_VITCURPUN*/
1795#define R0900_P2_VITCURPUN 0xf33a 1803#define R0900_P2_VITCURPUN 0xf33a
1796#define F0900_P2_VIT_MAPPING 0xf33a00e0 1804#define F0900_P2_VIT_CURPUN 0xf33a001f
1797#define F0900_P2_VIT_CURPUN 0xf33a001f
1798 1805
1799/*P2_VERROR*/ 1806/*P2_VERROR*/
1800#define R0900_P2_VERROR 0xf33b 1807#define R0900_P2_VERROR 0xf33b
1801#define F0900_P2_REGERR_VIT 0xf33b00ff 1808#define F0900_P2_REGERR_VIT 0xf33b00ff
1802 1809
1803/*P2_PRVIT*/ 1810/*P2_PRVIT*/
1804#define R0900_P2_PRVIT 0xf33c 1811#define R0900_P2_PRVIT 0xf33c
1805#define F0900_P2_DIS_VTHLOCK 0xf33c0040 1812#define F0900_P2_DIS_VTHLOCK 0xf33c0040
1806#define F0900_P2_E7_8VIT 0xf33c0020 1813#define F0900_P2_E7_8VIT 0xf33c0020
1807#define F0900_P2_E6_7VIT 0xf33c0010 1814#define F0900_P2_E6_7VIT 0xf33c0010
1808#define F0900_P2_E5_6VIT 0xf33c0008 1815#define F0900_P2_E5_6VIT 0xf33c0008
1809#define F0900_P2_E3_4VIT 0xf33c0004 1816#define F0900_P2_E3_4VIT 0xf33c0004
1810#define F0900_P2_E2_3VIT 0xf33c0002 1817#define F0900_P2_E2_3VIT 0xf33c0002
1811#define F0900_P2_E1_2VIT 0xf33c0001 1818#define F0900_P2_E1_2VIT 0xf33c0001
1812 1819
1813/*P2_VAVSRVIT*/ 1820/*P2_VAVSRVIT*/
1814#define R0900_P2_VAVSRVIT 0xf33d 1821#define R0900_P2_VAVSRVIT 0xf33d
1815#define F0900_P2_AMVIT 0xf33d0080 1822#define F0900_P2_AMVIT 0xf33d0080
1816#define F0900_P2_FROZENVIT 0xf33d0040 1823#define F0900_P2_FROZENVIT 0xf33d0040
1817#define F0900_P2_SNVIT 0xf33d0030 1824#define F0900_P2_SNVIT 0xf33d0030
1818#define F0900_P2_TOVVIT 0xf33d000c 1825#define F0900_P2_TOVVIT 0xf33d000c
1819#define F0900_P2_HYPVIT 0xf33d0003 1826#define F0900_P2_HYPVIT 0xf33d0003
1820 1827
1821/*P2_VSTATUSVIT*/ 1828/*P2_VSTATUSVIT*/
1822#define R0900_P2_VSTATUSVIT 0xf33e 1829#define R0900_P2_VSTATUSVIT 0xf33e
1823#define F0900_P2_VITERBI_ON 0xf33e0080 1830#define F0900_P2_PRFVIT 0xf33e0010
1824#define F0900_P2_END_LOOPVIT 0xf33e0040 1831#define F0900_P2_LOCKEDVIT 0xf33e0008
1825#define F0900_P2_VITERBI_DEPRF 0xf33e0020
1826#define F0900_P2_PRFVIT 0xf33e0010
1827#define F0900_P2_LOCKEDVIT 0xf33e0008
1828#define F0900_P2_VITERBI_DELOCK 0xf33e0004
1829#define F0900_P2_VIT_DEMODSEL 0xf33e0002
1830#define F0900_P2_VITERBI_COMPOUT 0xf33e0001
1831 1832
1832/*P2_VTHINUSE*/ 1833/*P2_VTHINUSE*/
1833#define R0900_P2_VTHINUSE 0xf33f 1834#define R0900_P2_VTHINUSE 0xf33f
1834#define F0900_P2_VIT_INUSE 0xf33f00ff 1835#define F0900_P2_VIT_INUSE 0xf33f00ff
1835 1836
1836/*P2_KDIV12*/ 1837/*P2_KDIV12*/
1837#define R0900_P2_KDIV12 0xf340 1838#define R0900_P2_KDIV12 0xf340
1838#define F0900_P2_KDIV12_MANUAL 0xf3400080 1839#define F0900_P2_K_DIVIDER_12 0xf340007f
1839#define F0900_P2_K_DIVIDER_12 0xf340007f
1840 1840
1841/*P2_KDIV23*/ 1841/*P2_KDIV23*/
1842#define R0900_P2_KDIV23 0xf341 1842#define R0900_P2_KDIV23 0xf341
1843#define F0900_P2_KDIV23_MANUAL 0xf3410080 1843#define F0900_P2_K_DIVIDER_23 0xf341007f
1844#define F0900_P2_K_DIVIDER_23 0xf341007f
1845 1844
1846/*P2_KDIV34*/ 1845/*P2_KDIV34*/
1847#define R0900_P2_KDIV34 0xf342 1846#define R0900_P2_KDIV34 0xf342
1848#define F0900_P2_KDIV34_MANUAL 0xf3420080 1847#define F0900_P2_K_DIVIDER_34 0xf342007f
1849#define F0900_P2_K_DIVIDER_34 0xf342007f
1850 1848
1851/*P2_KDIV56*/ 1849/*P2_KDIV56*/
1852#define R0900_P2_KDIV56 0xf343 1850#define R0900_P2_KDIV56 0xf343
1853#define F0900_P2_KDIV56_MANUAL 0xf3430080 1851#define F0900_P2_K_DIVIDER_56 0xf343007f
1854#define F0900_P2_K_DIVIDER_56 0xf343007f
1855 1852
1856/*P2_KDIV67*/ 1853/*P2_KDIV67*/
1857#define R0900_P2_KDIV67 0xf344 1854#define R0900_P2_KDIV67 0xf344
1858#define F0900_P2_KDIV67_MANUAL 0xf3440080 1855#define F0900_P2_K_DIVIDER_67 0xf344007f
1859#define F0900_P2_K_DIVIDER_67 0xf344007f
1860 1856
1861/*P2_KDIV78*/ 1857/*P2_KDIV78*/
1862#define R0900_P2_KDIV78 0xf345 1858#define R0900_P2_KDIV78 0xf345
1863#define F0900_P2_KDIV78_MANUAL 0xf3450080 1859#define F0900_P2_K_DIVIDER_78 0xf345007f
1864#define F0900_P2_K_DIVIDER_78 0xf345007f
1865 1860
1866/*P2_PDELCTRL1*/ 1861/*P2_PDELCTRL1*/
1867#define R0900_P2_PDELCTRL1 0xf350 1862#define R0900_P2_PDELCTRL1 0xf350
1868#define F0900_P2_INV_MISMASK 0xf3500080 1863#define F0900_P2_INV_MISMASK 0xf3500080
1869#define F0900_P2_FORCE_ACCEPTED 0xf3500040 1864#define F0900_P2_FILTER_EN 0xf3500020
1870#define F0900_P2_FILTER_EN 0xf3500020 1865#define F0900_P2_EN_MIS00 0xf3500002
1871#define F0900_P2_FORCE_PKTDELINUSE 0xf3500010 1866#define F0900_P2_ALGOSWRST 0xf3500001
1872#define F0900_P2_HYSTEN 0xf3500008
1873#define F0900_P2_HYSTSWRST 0xf3500004
1874#define F0900_P2_EN_MIS00 0xf3500002
1875#define F0900_P2_ALGOSWRST 0xf3500001
1876 1867
1877/*P2_PDELCTRL2*/ 1868/*P2_PDELCTRL2*/
1878#define R0900_P2_PDELCTRL2 0xf351 1869#define R0900_P2_PDELCTRL2 0xf351
1879#define F0900_P2_FORCE_CONTINUOUS 0xf3510080 1870#define F0900_P2_RESET_UPKO_COUNT 0xf3510040
1880#define F0900_P2_RESET_UPKO_COUNT 0xf3510040 1871#define F0900_P2_FRAME_MODE 0xf3510002
1881#define F0900_P2_USER_PKTDELIN_NB 0xf3510020 1872#define F0900_P2_NOBCHERRFLG_USE 0xf3510001
1882#define F0900_P2_FORCE_LOCKED 0xf3510010
1883#define F0900_P2_DATA_UNBBSCRAM 0xf3510008
1884#define F0900_P2_FORCE_LONGPKT 0xf3510004
1885#define F0900_P2_FRAME_MODE 0xf3510002
1886 1873
1887/*P2_HYSTTHRESH*/ 1874/*P2_HYSTTHRESH*/
1888#define R0900_P2_HYSTTHRESH 0xf354 1875#define R0900_P2_HYSTTHRESH 0xf354
1889#define F0900_P2_UNLCK_THRESH 0xf35400f0 1876#define F0900_P2_UNLCK_THRESH 0xf35400f0
1890#define F0900_P2_DELIN_LCK_THRESH 0xf354000f 1877#define F0900_P2_DELIN_LCK_THRESH 0xf354000f
1891 1878
1892/*P2_ISIENTRY*/ 1879/*P2_ISIENTRY*/
1893#define R0900_P2_ISIENTRY 0xf35e 1880#define R0900_P2_ISIENTRY 0xf35e
1894#define F0900_P2_ISI_ENTRY 0xf35e00ff 1881#define F0900_P2_ISI_ENTRY 0xf35e00ff
1895 1882
1896/*P2_ISIBITENA*/ 1883/*P2_ISIBITENA*/
1897#define R0900_P2_ISIBITENA 0xf35f 1884#define R0900_P2_ISIBITENA 0xf35f
1898#define F0900_P2_ISI_BIT_EN 0xf35f00ff 1885#define F0900_P2_ISI_BIT_EN 0xf35f00ff
1899 1886
1900/*P2_MATSTR1*/ 1887/*P2_MATSTR1*/
1901#define R0900_P2_MATSTR1 0xf360 1888#define R0900_P2_MATSTR1 0xf360
1902#define F0900_P2_MATYPE_CURRENT1 0xf36000ff 1889#define F0900_P2_MATYPE_CURRENT1 0xf36000ff
1903 1890
1904/*P2_MATSTR0*/ 1891/*P2_MATSTR0*/
1905#define R0900_P2_MATSTR0 0xf361 1892#define R0900_P2_MATSTR0 0xf361
1906#define F0900_P2_MATYPE_CURRENT0 0xf36100ff 1893#define F0900_P2_MATYPE_CURRENT0 0xf36100ff
1907 1894
1908/*P2_UPLSTR1*/ 1895/*P2_UPLSTR1*/
1909#define R0900_P2_UPLSTR1 0xf362 1896#define R0900_P2_UPLSTR1 0xf362
1910#define F0900_P2_UPL_CURRENT1 0xf36200ff 1897#define F0900_P2_UPL_CURRENT1 0xf36200ff
1911 1898
1912/*P2_UPLSTR0*/ 1899/*P2_UPLSTR0*/
1913#define R0900_P2_UPLSTR0 0xf363 1900#define R0900_P2_UPLSTR0 0xf363
1914#define F0900_P2_UPL_CURRENT0 0xf36300ff 1901#define F0900_P2_UPL_CURRENT0 0xf36300ff
1915 1902
1916/*P2_DFLSTR1*/ 1903/*P2_DFLSTR1*/
1917#define R0900_P2_DFLSTR1 0xf364 1904#define R0900_P2_DFLSTR1 0xf364
1918#define F0900_P2_DFL_CURRENT1 0xf36400ff 1905#define F0900_P2_DFL_CURRENT1 0xf36400ff
1919 1906
1920/*P2_DFLSTR0*/ 1907/*P2_DFLSTR0*/
1921#define R0900_P2_DFLSTR0 0xf365 1908#define R0900_P2_DFLSTR0 0xf365
1922#define F0900_P2_DFL_CURRENT0 0xf36500ff 1909#define F0900_P2_DFL_CURRENT0 0xf36500ff
1923 1910
1924/*P2_SYNCSTR*/ 1911/*P2_SYNCSTR*/
1925#define R0900_P2_SYNCSTR 0xf366 1912#define R0900_P2_SYNCSTR 0xf366
1926#define F0900_P2_SYNC_CURRENT 0xf36600ff 1913#define F0900_P2_SYNC_CURRENT 0xf36600ff
1927 1914
1928/*P2_SYNCDSTR1*/ 1915/*P2_SYNCDSTR1*/
1929#define R0900_P2_SYNCDSTR1 0xf367 1916#define R0900_P2_SYNCDSTR1 0xf367
1930#define F0900_P2_SYNCD_CURRENT1 0xf36700ff 1917#define F0900_P2_SYNCD_CURRENT1 0xf36700ff
1931 1918
1932/*P2_SYNCDSTR0*/ 1919/*P2_SYNCDSTR0*/
1933#define R0900_P2_SYNCDSTR0 0xf368 1920#define R0900_P2_SYNCDSTR0 0xf368
1934#define F0900_P2_SYNCD_CURRENT0 0xf36800ff 1921#define F0900_P2_SYNCD_CURRENT0 0xf36800ff
1935 1922
1936/*P2_PDELSTATUS1*/ 1923/*P2_PDELSTATUS1*/
1937#define R0900_P2_PDELSTATUS1 0xf369 1924#define R0900_P2_PDELSTATUS1 0xf369
1938#define F0900_P2_PKTDELIN_DELOCK 0xf3690080 1925#define F0900_P2_PKTDELIN_DELOCK 0xf3690080
1939#define F0900_P2_SYNCDUPDFL_BADDFL 0xf3690040 1926#define F0900_P2_SYNCDUPDFL_BADDFL 0xf3690040
1940#define F0900_P2_CONTINUOUS_STREAM 0xf3690020 1927#define F0900_P2_CONTINUOUS_STREAM 0xf3690020
1941#define F0900_P2_UNACCEPTED_STREAM 0xf3690010 1928#define F0900_P2_UNACCEPTED_STREAM 0xf3690010
1942#define F0900_P2_BCH_ERROR_FLAG 0xf3690008 1929#define F0900_P2_BCH_ERROR_FLAG 0xf3690008
1943#define F0900_P2_BBHCRCKO 0xf3690004 1930#define F0900_P2_PKTDELIN_LOCK 0xf3690002
1944#define F0900_P2_PKTDELIN_LOCK 0xf3690002 1931#define F0900_P2_FIRST_LOCK 0xf3690001
1945#define F0900_P2_FIRST_LOCK 0xf3690001
1946 1932
1947/*P2_PDELSTATUS2*/ 1933/*P2_PDELSTATUS2*/
1948#define R0900_P2_PDELSTATUS2 0xf36a 1934#define R0900_P2_PDELSTATUS2 0xf36a
1949#define F0900_P2_PKTDEL_DEMODSEL 0xf36a0080 1935#define F0900_P2_FRAME_MODCOD 0xf36a007c
1950#define F0900_P2_FRAME_MODCOD 0xf36a007c 1936#define F0900_P2_FRAME_TYPE 0xf36a0003
1951#define F0900_P2_FRAME_TYPE 0xf36a0003
1952 1937
1953/*P2_BBFCRCKO1*/ 1938/*P2_BBFCRCKO1*/
1954#define R0900_P2_BBFCRCKO1 0xf36b 1939#define R0900_P2_BBFCRCKO1 0xf36b
1955#define F0900_P2_BBHCRC_KOCNT1 0xf36b00ff 1940#define F0900_P2_BBHCRC_KOCNT1 0xf36b00ff
1956 1941
1957/*P2_BBFCRCKO0*/ 1942/*P2_BBFCRCKO0*/
1958#define R0900_P2_BBFCRCKO0 0xf36c 1943#define R0900_P2_BBFCRCKO0 0xf36c
1959#define F0900_P2_BBHCRC_KOCNT0 0xf36c00ff 1944#define F0900_P2_BBHCRC_KOCNT0 0xf36c00ff
1960 1945
1961/*P2_UPCRCKO1*/ 1946/*P2_UPCRCKO1*/
1962#define R0900_P2_UPCRCKO1 0xf36d 1947#define R0900_P2_UPCRCKO1 0xf36d
1963#define F0900_P2_PKTCRC_KOCNT1 0xf36d00ff 1948#define F0900_P2_PKTCRC_KOCNT1 0xf36d00ff
1964 1949
1965/*P2_UPCRCKO0*/ 1950/*P2_UPCRCKO0*/
1966#define R0900_P2_UPCRCKO0 0xf36e 1951#define R0900_P2_UPCRCKO0 0xf36e
1967#define F0900_P2_PKTCRC_KOCNT0 0xf36e00ff 1952#define F0900_P2_PKTCRC_KOCNT0 0xf36e00ff
1953
1954/*P2_PDELCTRL3*/
1955#define R0900_P2_PDELCTRL3 0xf36f
1956#define F0900_P2_PKTDEL_CONTFAIL 0xf36f0080
1957#define F0900_P2_NOFIFO_BCHERR 0xf36f0020
1968 1958
1969/*P2_TSSTATEM*/ 1959/*P2_TSSTATEM*/
1970#define R0900_P2_TSSTATEM 0xf370 1960#define R0900_P2_TSSTATEM 0xf370
1971#define F0900_P2_TSDIL_ON 0xf3700080 1961#define F0900_P2_TSDIL_ON 0xf3700080
1972#define F0900_P2_TSSKIPRS_ON 0xf3700040 1962#define F0900_P2_TSRS_ON 0xf3700020
1973#define F0900_P2_TSRS_ON 0xf3700020 1963#define F0900_P2_TSDESCRAMB_ON 0xf3700010
1974#define F0900_P2_TSDESCRAMB_ON 0xf3700010 1964#define F0900_P2_TSFRAME_MODE 0xf3700008
1975#define F0900_P2_TSFRAME_MODE 0xf3700008 1965#define F0900_P2_TS_DISABLE 0xf3700004
1976#define F0900_P2_TS_DISABLE 0xf3700004 1966#define F0900_P2_TSOUT_NOSYNC 0xf3700001
1977#define F0900_P2_TSACM_MODE 0xf3700002
1978#define F0900_P2_TSOUT_NOSYNC 0xf3700001
1979 1967
1980/*P2_TSCFGH*/ 1968/*P2_TSCFGH*/
1981#define R0900_P2_TSCFGH 0xf372 1969#define R0900_P2_TSCFGH 0xf372
1982#define F0900_P2_TSFIFO_DVBCI 0xf3720080 1970#define F0900_P2_TSFIFO_DVBCI 0xf3720080
1983#define F0900_P2_TSFIFO_SERIAL 0xf3720040 1971#define F0900_P2_TSFIFO_SERIAL 0xf3720040
1984#define F0900_P2_TSFIFO_TEIUPDATE 0xf3720020 1972#define F0900_P2_TSFIFO_TEIUPDATE 0xf3720020
1985#define F0900_P2_TSFIFO_DUTY50 0xf3720010 1973#define F0900_P2_TSFIFO_DUTY50 0xf3720010
1986#define F0900_P2_TSFIFO_HSGNLOUT 0xf3720008 1974#define F0900_P2_TSFIFO_HSGNLOUT 0xf3720008
1987#define F0900_P2_TSFIFO_ERRMODE 0xf3720006 1975#define F0900_P2_TSFIFO_ERRMODE 0xf3720006
1988#define F0900_P2_RST_HWARE 0xf3720001 1976#define F0900_P2_RST_HWARE 0xf3720001
1989 1977
1990/*P2_TSCFGM*/ 1978/*P2_TSCFGM*/
1991#define R0900_P2_TSCFGM 0xf373 1979#define R0900_P2_TSCFGM 0xf373
1992#define F0900_P2_TSFIFO_MANSPEED 0xf37300c0 1980#define F0900_P2_TSFIFO_MANSPEED 0xf37300c0
1993#define F0900_P2_TSFIFO_PERMDATA 0xf3730020 1981#define F0900_P2_TSFIFO_PERMDATA 0xf3730020
1994#define F0900_P2_TSFIFO_NONEWSGNL 0xf3730010 1982#define F0900_P2_TSFIFO_DPUNACT 0xf3730002
1995#define F0900_P2_TSFIFO_BITSPEED 0xf3730008 1983#define F0900_P2_TSFIFO_INVDATA 0xf3730001
1996#define F0900_P2_NPD_SPECDVBS2 0xf3730004
1997#define F0900_P2_TSFIFO_STOPCKDIS 0xf3730002
1998#define F0900_P2_TSFIFO_INVDATA 0xf3730001
1999 1984
2000/*P2_TSCFGL*/ 1985/*P2_TSCFGL*/
2001#define R0900_P2_TSCFGL 0xf374 1986#define R0900_P2_TSCFGL 0xf374
2002#define F0900_P2_TSFIFO_BCLKDEL1CK 0xf37400c0 1987#define F0900_P2_TSFIFO_BCLKDEL1CK 0xf37400c0
2003#define F0900_P2_BCHERROR_MODE 0xf3740030 1988#define F0900_P2_BCHERROR_MODE 0xf3740030
2004#define F0900_P2_TSFIFO_NSGNL2DATA 0xf3740008 1989#define F0900_P2_TSFIFO_NSGNL2DATA 0xf3740008
2005#define F0900_P2_TSFIFO_EMBINDVB 0xf3740004 1990#define F0900_P2_TSFIFO_EMBINDVB 0xf3740004
2006#define F0900_P2_TSFIFO_DPUNACT 0xf3740002 1991#define F0900_P2_TSFIFO_BITSPEED 0xf3740003
2007#define F0900_P2_TSFIFO_NPDOFF 0xf3740001
2008 1992
2009/*P2_TSINSDELH*/ 1993/*P2_TSINSDELH*/
2010#define R0900_P2_TSINSDELH 0xf376 1994#define R0900_P2_TSINSDELH 0xf376
2011#define F0900_P2_TSDEL_SYNCBYTE 0xf3760080 1995#define F0900_P2_TSDEL_SYNCBYTE 0xf3760080
2012#define F0900_P2_TSDEL_XXHEADER 0xf3760040 1996#define F0900_P2_TSDEL_XXHEADER 0xf3760040
2013#define F0900_P2_TSDEL_BBHEADER 0xf3760020 1997#define F0900_P2_TSDEL_BBHEADER 0xf3760020
2014#define F0900_P2_TSDEL_DATAFIELD 0xf3760010 1998#define F0900_P2_TSDEL_DATAFIELD 0xf3760010
2015#define F0900_P2_TSINSDEL_ISCR 0xf3760008 1999#define F0900_P2_TSINSDEL_ISCR 0xf3760008
2016#define F0900_P2_TSINSDEL_NPD 0xf3760004 2000#define F0900_P2_TSINSDEL_NPD 0xf3760004
2017#define F0900_P2_TSINSDEL_RSPARITY 0xf3760002 2001#define F0900_P2_TSINSDEL_RSPARITY 0xf3760002
2018#define F0900_P2_TSINSDEL_CRC8 0xf3760001 2002#define F0900_P2_TSINSDEL_CRC8 0xf3760001
2003
2004/*P2_TSDIVN*/
2005#define R0900_P2_TSDIVN 0xf379
2006#define F0900_P2_TSFIFO_SPEEDMODE 0xf37900c0
2007
2008/*P2_TSCFG4*/
2009#define R0900_P2_TSCFG4 0xf37a
2010#define F0900_P2_TSFIFO_TSSPEEDMODE 0xf37a00c0
2019 2011
2020/*P2_TSSPEED*/ 2012/*P2_TSSPEED*/
2021#define R0900_P2_TSSPEED 0xf380 2013#define R0900_P2_TSSPEED 0xf380
2022#define F0900_P2_TSFIFO_OUTSPEED 0xf38000ff 2014#define F0900_P2_TSFIFO_OUTSPEED 0xf38000ff
2023 2015
2024/*P2_TSSTATUS*/ 2016/*P2_TSSTATUS*/
2025#define R0900_P2_TSSTATUS 0xf381 2017#define R0900_P2_TSSTATUS 0xf381
2026#define F0900_P2_TSFIFO_LINEOK 0xf3810080 2018#define F0900_P2_TSFIFO_LINEOK 0xf3810080
2027#define F0900_P2_TSFIFO_ERROR 0xf3810040 2019#define F0900_P2_TSFIFO_ERROR 0xf3810040
2028#define F0900_P2_TSFIFO_DATA7 0xf3810020 2020#define F0900_P2_DIL_READY 0xf3810001
2029#define F0900_P2_TSFIFO_NOSYNC 0xf3810010
2030#define F0900_P2_ISCR_INITIALIZED 0xf3810008
2031#define F0900_P2_ISCR_UPDATED 0xf3810004
2032#define F0900_P2_SOFFIFO_UNREGUL 0xf3810002
2033#define F0900_P2_DIL_READY 0xf3810001
2034 2021
2035/*P2_TSSTATUS2*/ 2022/*P2_TSSTATUS2*/
2036#define R0900_P2_TSSTATUS2 0xf382 2023#define R0900_P2_TSSTATUS2 0xf382
2037#define F0900_P2_TSFIFO_DEMODSEL 0xf3820080 2024#define F0900_P2_TSFIFO_DEMODSEL 0xf3820080
2038#define F0900_P2_TSFIFOSPEED_STORE 0xf3820040 2025#define F0900_P2_TSFIFOSPEED_STORE 0xf3820040
2039#define F0900_P2_DILXX_RESET 0xf3820020 2026#define F0900_P2_DILXX_RESET 0xf3820020
2040#define F0900_P2_TSSERIAL_IMPOS 0xf3820010 2027#define F0900_P2_TSSERIAL_IMPOS 0xf3820010
2041#define F0900_P2_TSFIFO_LINENOK 0xf3820008 2028#define F0900_P2_SCRAMBDETECT 0xf3820002
2042#define F0900_P2_BITSPEED_EVENT 0xf3820004
2043#define F0900_P2_SCRAMBDETECT 0xf3820002
2044#define F0900_P2_ULDTV67_FALSELOCK 0xf3820001
2045 2029
2046/*P2_TSBITRATE1*/ 2030/*P2_TSBITRATE1*/
2047#define R0900_P2_TSBITRATE1 0xf383 2031#define R0900_P2_TSBITRATE1 0xf383
2048#define F0900_P2_TSFIFO_BITRATE1 0xf38300ff 2032#define F0900_P2_TSFIFO_BITRATE1 0xf38300ff
2049 2033
2050/*P2_TSBITRATE0*/ 2034/*P2_TSBITRATE0*/
2051#define R0900_P2_TSBITRATE0 0xf384 2035#define R0900_P2_TSBITRATE0 0xf384
2052#define F0900_P2_TSFIFO_BITRATE0 0xf38400ff 2036#define F0900_P2_TSFIFO_BITRATE0 0xf38400ff
2053 2037
2054/*P2_ERRCTRL1*/ 2038/*P2_ERRCTRL1*/
2055#define R0900_P2_ERRCTRL1 0xf398 2039#define R0900_P2_ERRCTRL1 0xf398
2056#define F0900_P2_ERR_SOURCE1 0xf39800f0 2040#define F0900_P2_ERR_SOURCE1 0xf39800f0
2057#define F0900_P2_NUM_EVENT1 0xf3980007 2041#define F0900_P2_NUM_EVENT1 0xf3980007
2058 2042
2059/*P2_ERRCNT12*/ 2043/*P2_ERRCNT12*/
2060#define R0900_P2_ERRCNT12 0xf399 2044#define R0900_P2_ERRCNT12 0xf399
2061#define F0900_P2_ERRCNT1_OLDVALUE 0xf3990080 2045#define F0900_P2_ERRCNT1_OLDVALUE 0xf3990080
2062#define F0900_P2_ERR_CNT12 0xf399007f 2046#define F0900_P2_ERR_CNT12 0xf399007f
2063 2047
2064/*P2_ERRCNT11*/ 2048/*P2_ERRCNT11*/
2065#define R0900_P2_ERRCNT11 0xf39a 2049#define R0900_P2_ERRCNT11 0xf39a
2066#define F0900_P2_ERR_CNT11 0xf39a00ff 2050#define F0900_P2_ERR_CNT11 0xf39a00ff
2067 2051
2068/*P2_ERRCNT10*/ 2052/*P2_ERRCNT10*/
2069#define R0900_P2_ERRCNT10 0xf39b 2053#define R0900_P2_ERRCNT10 0xf39b
2070#define F0900_P2_ERR_CNT10 0xf39b00ff 2054#define F0900_P2_ERR_CNT10 0xf39b00ff
2071 2055
2072/*P2_ERRCTRL2*/ 2056/*P2_ERRCTRL2*/
2073#define R0900_P2_ERRCTRL2 0xf39c 2057#define R0900_P2_ERRCTRL2 0xf39c
2074#define F0900_P2_ERR_SOURCE2 0xf39c00f0 2058#define F0900_P2_ERR_SOURCE2 0xf39c00f0
2075#define F0900_P2_NUM_EVENT2 0xf39c0007 2059#define F0900_P2_NUM_EVENT2 0xf39c0007
2076 2060
2077/*P2_ERRCNT22*/ 2061/*P2_ERRCNT22*/
2078#define R0900_P2_ERRCNT22 0xf39d 2062#define R0900_P2_ERRCNT22 0xf39d
2079#define F0900_P2_ERRCNT2_OLDVALUE 0xf39d0080 2063#define F0900_P2_ERRCNT2_OLDVALUE 0xf39d0080
2080#define F0900_P2_ERR_CNT22 0xf39d007f 2064#define F0900_P2_ERR_CNT22 0xf39d007f
2081 2065
2082/*P2_ERRCNT21*/ 2066/*P2_ERRCNT21*/
2083#define R0900_P2_ERRCNT21 0xf39e 2067#define R0900_P2_ERRCNT21 0xf39e
2084#define F0900_P2_ERR_CNT21 0xf39e00ff 2068#define F0900_P2_ERR_CNT21 0xf39e00ff
2085 2069
2086/*P2_ERRCNT20*/ 2070/*P2_ERRCNT20*/
2087#define R0900_P2_ERRCNT20 0xf39f 2071#define R0900_P2_ERRCNT20 0xf39f
2088#define F0900_P2_ERR_CNT20 0xf39f00ff 2072#define F0900_P2_ERR_CNT20 0xf39f00ff
2089 2073
2090/*P2_FECSPY*/ 2074/*P2_FECSPY*/
2091#define R0900_P2_FECSPY 0xf3a0 2075#define R0900_P2_FECSPY 0xf3a0
2092#define F0900_P2_SPY_ENABLE 0xf3a00080 2076#define F0900_P2_SPY_ENABLE 0xf3a00080
2093#define F0900_P2_NO_SYNCBYTE 0xf3a00040 2077#define F0900_P2_NO_SYNCBYTE 0xf3a00040
2094#define F0900_P2_SERIAL_MODE 0xf3a00020 2078#define F0900_P2_SERIAL_MODE 0xf3a00020
2095#define F0900_P2_UNUSUAL_PACKET 0xf3a00010 2079#define F0900_P2_UNUSUAL_PACKET 0xf3a00010
2096#define F0900_P2_BER_PACKMODE 0xf3a00008 2080#define F0900_P2_BERMETER_DATAMODE 0xf3a00008
2097#define F0900_P2_BERMETER_LMODE 0xf3a00002 2081#define F0900_P2_BERMETER_LMODE 0xf3a00002
2098#define F0900_P2_BERMETER_RESET 0xf3a00001 2082#define F0900_P2_BERMETER_RESET 0xf3a00001
2099 2083
2100/*P2_FSPYCFG*/ 2084/*P2_FSPYCFG*/
2101#define R0900_P2_FSPYCFG 0xf3a1 2085#define R0900_P2_FSPYCFG 0xf3a1
2102#define F0900_P2_FECSPY_INPUT 0xf3a100c0 2086#define F0900_P2_FECSPY_INPUT 0xf3a100c0
2103#define F0900_P2_RST_ON_ERROR 0xf3a10020 2087#define F0900_P2_RST_ON_ERROR 0xf3a10020
2104#define F0900_P2_ONE_SHOT 0xf3a10010 2088#define F0900_P2_ONE_SHOT 0xf3a10010
2105#define F0900_P2_I2C_MODE 0xf3a1000c 2089#define F0900_P2_I2C_MODE 0xf3a1000c
2106#define F0900_P2_SPY_HYSTERESIS 0xf3a10003 2090#define F0900_P2_SPY_HYSTERESIS 0xf3a10003
2107 2091
2108/*P2_FSPYDATA*/ 2092/*P2_FSPYDATA*/
2109#define R0900_P2_FSPYDATA 0xf3a2 2093#define R0900_P2_FSPYDATA 0xf3a2
2110#define F0900_P2_SPY_STUFFING 0xf3a20080 2094#define F0900_P2_SPY_STUFFING 0xf3a20080
2111#define F0900_P2_NOERROR_PKTJITTER 0xf3a20040 2095#define F0900_P2_SPY_CNULLPKT 0xf3a20020
2112#define F0900_P2_SPY_CNULLPKT 0xf3a20020 2096#define F0900_P2_SPY_OUTDATA_MODE 0xf3a2001f
2113#define F0900_P2_SPY_OUTDATA_MODE 0xf3a2001f
2114 2097
2115/*P2_FSPYOUT*/ 2098/*P2_FSPYOUT*/
2116#define R0900_P2_FSPYOUT 0xf3a3 2099#define R0900_P2_FSPYOUT 0xf3a3
2117#define F0900_P2_FSPY_DIRECT 0xf3a30080 2100#define F0900_P2_FSPY_DIRECT 0xf3a30080
2118#define F0900_P2_SPY_OUTDATA_BUS 0xf3a30038 2101#define F0900_P2_STUFF_MODE 0xf3a30007
2119#define F0900_P2_STUFF_MODE 0xf3a30007
2120 2102
2121/*P2_FSTATUS*/ 2103/*P2_FSTATUS*/
2122#define R0900_P2_FSTATUS 0xf3a4 2104#define R0900_P2_FSTATUS 0xf3a4
2123#define F0900_P2_SPY_ENDSIM 0xf3a40080 2105#define F0900_P2_SPY_ENDSIM 0xf3a40080
2124#define F0900_P2_VALID_SIM 0xf3a40040 2106#define F0900_P2_VALID_SIM 0xf3a40040
2125#define F0900_P2_FOUND_SIGNAL 0xf3a40020 2107#define F0900_P2_FOUND_SIGNAL 0xf3a40020
2126#define F0900_P2_DSS_SYNCBYTE 0xf3a40010 2108#define F0900_P2_DSS_SYNCBYTE 0xf3a40010
2127#define F0900_P2_RESULT_STATE 0xf3a4000f 2109#define F0900_P2_RESULT_STATE 0xf3a4000f
2128 2110
2129/*P2_FBERCPT4*/ 2111/*P2_FBERCPT4*/
2130#define R0900_P2_FBERCPT4 0xf3a8 2112#define R0900_P2_FBERCPT4 0xf3a8
2131#define F0900_P2_FBERMETER_CPT4 0xf3a800ff 2113#define F0900_P2_FBERMETER_CPT4 0xf3a800ff
2132 2114
2133/*P2_FBERCPT3*/ 2115/*P2_FBERCPT3*/
2134#define R0900_P2_FBERCPT3 0xf3a9 2116#define R0900_P2_FBERCPT3 0xf3a9
2135#define F0900_P2_FBERMETER_CPT3 0xf3a900ff 2117#define F0900_P2_FBERMETER_CPT3 0xf3a900ff
2136 2118
2137/*P2_FBERCPT2*/ 2119/*P2_FBERCPT2*/
2138#define R0900_P2_FBERCPT2 0xf3aa 2120#define R0900_P2_FBERCPT2 0xf3aa
2139#define F0900_P2_FBERMETER_CPT2 0xf3aa00ff 2121#define F0900_P2_FBERMETER_CPT2 0xf3aa00ff
2140 2122
2141/*P2_FBERCPT1*/ 2123/*P2_FBERCPT1*/
2142#define R0900_P2_FBERCPT1 0xf3ab 2124#define R0900_P2_FBERCPT1 0xf3ab
2143#define F0900_P2_FBERMETER_CPT1 0xf3ab00ff 2125#define F0900_P2_FBERMETER_CPT1 0xf3ab00ff
2144 2126
2145/*P2_FBERCPT0*/ 2127/*P2_FBERCPT0*/
2146#define R0900_P2_FBERCPT0 0xf3ac 2128#define R0900_P2_FBERCPT0 0xf3ac
2147#define F0900_P2_FBERMETER_CPT0 0xf3ac00ff 2129#define F0900_P2_FBERMETER_CPT0 0xf3ac00ff
2148 2130
2149/*P2_FBERERR2*/ 2131/*P2_FBERERR2*/
2150#define R0900_P2_FBERERR2 0xf3ad 2132#define R0900_P2_FBERERR2 0xf3ad
2151#define F0900_P2_FBERMETER_ERR2 0xf3ad00ff 2133#define F0900_P2_FBERMETER_ERR2 0xf3ad00ff
2152 2134
2153/*P2_FBERERR1*/ 2135/*P2_FBERERR1*/
2154#define R0900_P2_FBERERR1 0xf3ae 2136#define R0900_P2_FBERERR1 0xf3ae
2155#define F0900_P2_FBERMETER_ERR1 0xf3ae00ff 2137#define F0900_P2_FBERMETER_ERR1 0xf3ae00ff
2156 2138
2157/*P2_FBERERR0*/ 2139/*P2_FBERERR0*/
2158#define R0900_P2_FBERERR0 0xf3af 2140#define R0900_P2_FBERERR0 0xf3af
2159#define F0900_P2_FBERMETER_ERR0 0xf3af00ff 2141#define F0900_P2_FBERMETER_ERR0 0xf3af00ff
2160 2142
2161/*P2_FSPYBER*/ 2143/*P2_FSPYBER*/
2162#define R0900_P2_FSPYBER 0xf3b2 2144#define R0900_P2_FSPYBER 0xf3b2
2163#define F0900_P2_FSPYOBS_XORREAD 0xf3b20040 2145#define F0900_P2_FSPYBER_SYNCBYTE 0xf3b20010
2164#define F0900_P2_FSPYBER_OBSMODE 0xf3b20020 2146#define F0900_P2_FSPYBER_UNSYNC 0xf3b20008
2165#define F0900_P2_FSPYBER_SYNCBYTE 0xf3b20010 2147#define F0900_P2_FSPYBER_CTIME 0xf3b20007
2166#define F0900_P2_FSPYBER_UNSYNC 0xf3b20008
2167#define F0900_P2_FSPYBER_CTIME 0xf3b20007
2168 2148
2169/*P1_IQCONST*/ 2149/*P1_IQCONST*/
2170#define R0900_P1_IQCONST 0xf400 2150#define R0900_P1_IQCONST 0xf400
2171#define F0900_P1_CONSTEL_SELECT 0xf4000060 2151#define IQCONST REGx(R0900_P1_IQCONST)
2172#define F0900_P1_IQSYMB_SEL 0xf400001f 2152#define F0900_P1_CONSTEL_SELECT 0xf4000060
2153#define F0900_P1_IQSYMB_SEL 0xf400001f
2173 2154
2174/*P1_NOSCFG*/ 2155/*P1_NOSCFG*/
2175#define R0900_P1_NOSCFG 0xf401 2156#define R0900_P1_NOSCFG 0xf401
2176#define F0900_P1_DUMMYPL_NOSDATA 0xf4010020 2157#define NOSCFG REGx(R0900_P1_NOSCFG)
2177#define F0900_P1_NOSPLH_BETA 0xf4010018 2158#define F0900_P1_DUMMYPL_NOSDATA 0xf4010020
2178#define F0900_P1_NOSDATA_BETA 0xf4010007 2159#define F0900_P1_NOSPLH_BETA 0xf4010018
2160#define F0900_P1_NOSDATA_BETA 0xf4010007
2179 2161
2180/*P1_ISYMB*/ 2162/*P1_ISYMB*/
2181#define R0900_P1_ISYMB 0xf402 2163#define R0900_P1_ISYMB 0xf402
2182#define F0900_P1_I_SYMBOL 0xf40201ff 2164#define ISYMB REGx(R0900_P1_ISYMB)
2165#define F0900_P1_I_SYMBOL 0xf40201ff
2183 2166
2184/*P1_QSYMB*/ 2167/*P1_QSYMB*/
2185#define R0900_P1_QSYMB 0xf403 2168#define R0900_P1_QSYMB 0xf403
2186#define F0900_P1_Q_SYMBOL 0xf40301ff 2169#define QSYMB REGx(R0900_P1_QSYMB)
2170#define F0900_P1_Q_SYMBOL 0xf40301ff
2187 2171
2188/*P1_AGC1CFG*/ 2172/*P1_AGC1CFG*/
2189#define R0900_P1_AGC1CFG 0xf404 2173#define R0900_P1_AGC1CFG 0xf404
2190#define F0900_P1_DC_FROZEN 0xf4040080 2174#define AGC1CFG REGx(R0900_P1_AGC1CFG)
2191#define F0900_P1_DC_CORRECT 0xf4040040 2175#define F0900_P1_DC_FROZEN 0xf4040080
2192#define F0900_P1_AMM_FROZEN 0xf4040020 2176#define F0900_P1_DC_CORRECT 0xf4040040
2193#define F0900_P1_AMM_CORRECT 0xf4040010 2177#define F0900_P1_AMM_FROZEN 0xf4040020
2194#define F0900_P1_QUAD_FROZEN 0xf4040008 2178#define F0900_P1_AMM_CORRECT 0xf4040010
2195#define F0900_P1_QUAD_CORRECT 0xf4040004 2179#define F0900_P1_QUAD_FROZEN 0xf4040008
2196#define F0900_P1_DCCOMP_SLOW 0xf4040002 2180#define F0900_P1_QUAD_CORRECT 0xf4040004
2197#define F0900_P1_IQMISM_SLOW 0xf4040001
2198 2181
2199/*P1_AGC1CN*/ 2182/*P1_AGC1CN*/
2200#define R0900_P1_AGC1CN 0xf406 2183#define R0900_P1_AGC1CN 0xf406
2201#define F0900_P1_AGC1_LOCKED 0xf4060080 2184#define AGC1CN REGx(R0900_P1_AGC1CN)
2202#define F0900_P1_AGC1_OVERFLOW 0xf4060040 2185#define F0900_P1_AGC1_LOCKED 0xf4060080
2203#define F0900_P1_AGC1_NOSLOWLK 0xf4060020 2186#define F0900_P1_AGC1_MINPOWER 0xf4060010
2204#define F0900_P1_AGC1_MINPOWER 0xf4060010 2187#define F0900_P1_AGCOUT_FAST 0xf4060008
2205#define F0900_P1_AGCOUT_FAST 0xf4060008 2188#define F0900_P1_AGCIQ_BETA 0xf4060007
2206#define F0900_P1_AGCIQ_BETA 0xf4060007
2207 2189
2208/*P1_AGC1REF*/ 2190/*P1_AGC1REF*/
2209#define R0900_P1_AGC1REF 0xf407 2191#define R0900_P1_AGC1REF 0xf407
2210#define F0900_P1_AGCIQ_REF 0xf40700ff 2192#define AGC1REF REGx(R0900_P1_AGC1REF)
2193#define F0900_P1_AGCIQ_REF 0xf40700ff
2211 2194
2212/*P1_IDCCOMP*/ 2195/*P1_IDCCOMP*/
2213#define R0900_P1_IDCCOMP 0xf408 2196#define R0900_P1_IDCCOMP 0xf408
2214#define F0900_P1_IAVERAGE_ADJ 0xf40801ff 2197#define IDCCOMP REGx(R0900_P1_IDCCOMP)
2198#define F0900_P1_IAVERAGE_ADJ 0xf40801ff
2215 2199
2216/*P1_QDCCOMP*/ 2200/*P1_QDCCOMP*/
2217#define R0900_P1_QDCCOMP 0xf409 2201#define R0900_P1_QDCCOMP 0xf409
2218#define F0900_P1_QAVERAGE_ADJ 0xf40901ff 2202#define QDCCOMP REGx(R0900_P1_QDCCOMP)
2203#define F0900_P1_QAVERAGE_ADJ 0xf40901ff
2219 2204
2220/*P1_POWERI*/ 2205/*P1_POWERI*/
2221#define R0900_P1_POWERI 0xf40a 2206#define R0900_P1_POWERI 0xf40a
2222#define F0900_P1_POWER_I 0xf40a00ff 2207#define POWERI REGx(R0900_P1_POWERI)
2208#define F0900_P1_POWER_I 0xf40a00ff
2209#define POWER_I FLDx(F0900_P1_POWER_I)
2223 2210
2224/*P1_POWERQ*/ 2211/*P1_POWERQ*/
2225#define R0900_P1_POWERQ 0xf40b 2212#define R0900_P1_POWERQ 0xf40b
2226#define F0900_P1_POWER_Q 0xf40b00ff 2213#define POWERQ REGx(R0900_P1_POWERQ)
2214#define F0900_P1_POWER_Q 0xf40b00ff
2215#define POWER_Q FLDx(F0900_P1_POWER_Q)
2227 2216
2228/*P1_AGC1AMM*/ 2217/*P1_AGC1AMM*/
2229#define R0900_P1_AGC1AMM 0xf40c 2218#define R0900_P1_AGC1AMM 0xf40c
2230#define F0900_P1_AMM_VALUE 0xf40c00ff 2219#define AGC1AMM REGx(R0900_P1_AGC1AMM)
2220#define F0900_P1_AMM_VALUE 0xf40c00ff
2231 2221
2232/*P1_AGC1QUAD*/ 2222/*P1_AGC1QUAD*/
2233#define R0900_P1_AGC1QUAD 0xf40d 2223#define R0900_P1_AGC1QUAD 0xf40d
2234#define F0900_P1_QUAD_VALUE 0xf40d01ff 2224#define AGC1QUAD REGx(R0900_P1_AGC1QUAD)
2225#define F0900_P1_QUAD_VALUE 0xf40d01ff
2235 2226
2236/*P1_AGCIQIN1*/ 2227/*P1_AGCIQIN1*/
2237#define R0900_P1_AGCIQIN1 0xf40e 2228#define R0900_P1_AGCIQIN1 0xf40e
2238#define F0900_P1_AGCIQ_VALUE1 0xf40e00ff 2229#define AGCIQIN1 REGx(R0900_P1_AGCIQIN1)
2230#define F0900_P1_AGCIQ_VALUE1 0xf40e00ff
2231#define AGCIQ_VALUE1 FLDx(F0900_P1_AGCIQ_VALUE1)
2239 2232
2240/*P1_AGCIQIN0*/ 2233/*P1_AGCIQIN0*/
2241#define R0900_P1_AGCIQIN0 0xf40f 2234#define R0900_P1_AGCIQIN0 0xf40f
2242#define F0900_P1_AGCIQ_VALUE0 0xf40f00ff 2235#define AGCIQIN0 REGx(R0900_P1_AGCIQIN0)
2236#define F0900_P1_AGCIQ_VALUE0 0xf40f00ff
2237#define AGCIQ_VALUE0 FLDx(F0900_P1_AGCIQ_VALUE0)
2243 2238
2244/*P1_DEMOD*/ 2239/*P1_DEMOD*/
2245#define R0900_P1_DEMOD 0xf410 2240#define R0900_P1_DEMOD 0xf410
2246#define F0900_P1_DEMOD_STOP 0xf4100040 2241#define DEMOD REGx(R0900_P1_DEMOD)
2247#define F0900_P1_SPECINV_CONTROL 0xf4100030 2242#define F0900_P1_MANUALS2_ROLLOFF 0xf4100080
2248#define F0900_P1_FORCE_ENASAMP 0xf4100008 2243#define MANUALS2_ROLLOFF FLDx(F0900_P1_MANUALS2_ROLLOFF)
2249#define F0900_P1_MANUAL_ROLLOFF 0xf4100004 2244
2250#define F0900_P1_ROLLOFF_CONTROL 0xf4100003 2245#define F0900_P1_SPECINV_CONTROL 0xf4100030
2246#define SPECINV_CONTROL FLDx(F0900_P1_SPECINV_CONTROL)
2247#define F0900_P1_FORCE_ENASAMP 0xf4100008
2248#define F0900_P1_MANUALSX_ROLLOFF 0xf4100004
2249#define MANUALSX_ROLLOFF FLDx(F0900_P1_MANUALSX_ROLLOFF)
2250#define F0900_P1_ROLLOFF_CONTROL 0xf4100003
2251#define ROLLOFF_CONTROL FLDx(F0900_P1_ROLLOFF_CONTROL)
2251 2252
2252/*P1_DMDMODCOD*/ 2253/*P1_DMDMODCOD*/
2253#define R0900_P1_DMDMODCOD 0xf411 2254#define R0900_P1_DMDMODCOD 0xf411
2254#define F0900_P1_MANUAL_MODCOD 0xf4110080 2255#define DMDMODCOD REGx(R0900_P1_DMDMODCOD)
2255#define F0900_P1_DEMOD_MODCOD 0xf411007c 2256#define F0900_P1_MANUAL_MODCOD 0xf4110080
2256#define F0900_P1_DEMOD_TYPE 0xf4110003 2257#define F0900_P1_DEMOD_MODCOD 0xf411007c
2258#define DEMOD_MODCOD FLDx(F0900_P1_DEMOD_MODCOD)
2259#define F0900_P1_DEMOD_TYPE 0xf4110003
2260#define DEMOD_TYPE FLDx(F0900_P1_DEMOD_TYPE)
2257 2261
2258/*P1_DSTATUS*/ 2262/*P1_DSTATUS*/
2259#define R0900_P1_DSTATUS 0xf412 2263#define R0900_P1_DSTATUS 0xf412
2260#define F0900_P1_CAR_LOCK 0xf4120080 2264#define DSTATUS REGx(R0900_P1_DSTATUS)
2261#define F0900_P1_TMGLOCK_QUALITY 0xf4120060 2265#define F0900_P1_CAR_LOCK 0xf4120080
2262#define F0900_P1_SDVBS1_ENABLE 0xf4120010 2266#define F0900_P1_TMGLOCK_QUALITY 0xf4120060
2263#define F0900_P1_LOCK_DEFINITIF 0xf4120008 2267#define TMGLOCK_QUALITY FLDx(F0900_P1_TMGLOCK_QUALITY)
2264#define F0900_P1_TIMING_IS_LOCKED 0xf4120004 2268#define F0900_P1_LOCK_DEFINITIF 0xf4120008
2265#define F0900_P1_COARSE_TMGLOCK 0xf4120002 2269#define LOCK_DEFINITIF FLDx(F0900_P1_LOCK_DEFINITIF)
2266#define F0900_P1_COARSE_CARLOCK 0xf4120001 2270#define F0900_P1_OVADC_DETECT 0xf4120001
2267 2271
2268/*P1_DSTATUS2*/ 2272/*P1_DSTATUS2*/
2269#define R0900_P1_DSTATUS2 0xf413 2273#define R0900_P1_DSTATUS2 0xf413
2270#define F0900_P1_DEMOD_DELOCK 0xf4130080 2274#define DSTATUS2 REGx(R0900_P1_DSTATUS2)
2271#define F0900_P1_DEMOD_TIMEOUT 0xf4130040 2275#define F0900_P1_DEMOD_DELOCK 0xf4130080
2272#define F0900_P1_MODCODRQ_SYNCTAG 0xf4130020 2276#define F0900_P1_AGC1_NOSIGNALACK 0xf4130008
2273#define F0900_P1_POLYPH_SATEVENT 0xf4130010 2277#define F0900_P1_AGC2_OVERFLOW 0xf4130004
2274#define F0900_P1_AGC1_NOSIGNALACK 0xf4130008 2278#define F0900_P1_CFR_OVERFLOW 0xf4130002
2275#define F0900_P1_AGC2_OVERFLOW 0xf4130004 2279#define F0900_P1_GAMMA_OVERUNDER 0xf4130001
2276#define F0900_P1_CFR_OVERFLOW 0xf4130002
2277#define F0900_P1_GAMMA_OVERUNDER 0xf4130001
2278 2280
2279/*P1_DMDCFGMD*/ 2281/*P1_DMDCFGMD*/
2280#define R0900_P1_DMDCFGMD 0xf414 2282#define R0900_P1_DMDCFGMD 0xf414
2281#define F0900_P1_DVBS2_ENABLE 0xf4140080 2283#define DMDCFGMD REGx(R0900_P1_DMDCFGMD)
2282#define F0900_P1_DVBS1_ENABLE 0xf4140040 2284#define F0900_P1_DVBS2_ENABLE 0xf4140080
2283#define F0900_P1_CFR_AUTOSCAN 0xf4140020 2285#define DVBS2_ENABLE FLDx(F0900_P1_DVBS2_ENABLE)
2284#define F0900_P1_SCAN_ENABLE 0xf4140010 2286#define F0900_P1_DVBS1_ENABLE 0xf4140040
2285#define F0900_P1_TUN_AUTOSCAN 0xf4140008 2287#define DVBS1_ENABLE FLDx(F0900_P1_DVBS1_ENABLE)
2286#define F0900_P1_NOFORCE_RELOCK 0xf4140004 2288#define F0900_P1_SCAN_ENABLE 0xf4140010
2287#define F0900_P1_TUN_RNG 0xf4140003 2289#define SCAN_ENABLE FLDx(F0900_P1_SCAN_ENABLE)
2290#define F0900_P1_CFR_AUTOSCAN 0xf4140008
2291#define CFR_AUTOSCAN FLDx(F0900_P1_CFR_AUTOSCAN)
2292#define F0900_P1_TUN_RNG 0xf4140003
2288 2293
2289/*P1_DMDCFG2*/ 2294/*P1_DMDCFG2*/
2290#define R0900_P1_DMDCFG2 0xf415 2295#define R0900_P1_DMDCFG2 0xf415
2291#define F0900_P1_AGC1_WAITLOCK 0xf4150080 2296#define DMDCFG2 REGx(R0900_P1_DMDCFG2)
2292#define F0900_P1_S1S2_SEQUENTIAL 0xf4150040 2297#define F0900_P1_S1S2_SEQUENTIAL 0xf4150040
2293#define F0900_P1_OVERFLOW_TIMEOUT 0xf4150020 2298#define S1S2_SEQUENTIAL FLDx(F0900_P1_S1S2_SEQUENTIAL)
2294#define F0900_P1_SCANFAIL_TIMEOUT 0xf4150010 2299#define F0900_P1_INFINITE_RELOCK 0xf4150010
2295#define F0900_P1_DMDTOUT_BACK 0xf4150008
2296#define F0900_P1_CARLOCK_S1ENABLE 0xf4150004
2297#define F0900_P1_COARSE_LK3MODE 0xf4150002
2298#define F0900_P1_COARSE_LK2MODE 0xf4150001
2299 2300
2300/*P1_DMDISTATE*/ 2301/*P1_DMDISTATE*/
2301#define R0900_P1_DMDISTATE 0xf416 2302#define R0900_P1_DMDISTATE 0xf416
2302#define F0900_P1_I2C_NORESETDMODE 0xf4160080 2303#define DMDISTATE REGx(R0900_P1_DMDISTATE)
2303#define F0900_P1_FORCE_ETAPED 0xf4160040 2304#define F0900_P1_I2C_DEMOD_MODE 0xf416001f
2304#define F0900_P1_SDMDRST_DIRCLK 0xf4160020 2305#define DEMOD_MODE FLDx(F0900_P1_I2C_DEMOD_MODE)
2305#define F0900_P1_I2C_DEMOD_MODE 0xf416001f
2306 2306
2307/*P1_DMDT0M*/ 2307/*P1_DMDT0M*/
2308#define R0900_P1_DMDT0M 0xf417 2308#define R0900_P1_DMDT0M 0xf417
2309#define F0900_P1_DMDT0_MIN 0xf41700ff 2309#define DMDT0M REGx(R0900_P1_DMDT0M)
2310#define F0900_P1_DMDT0_MIN 0xf41700ff
2310 2311
2311/*P1_DMDSTATE*/ 2312/*P1_DMDSTATE*/
2312#define R0900_P1_DMDSTATE 0xf41b 2313#define R0900_P1_DMDSTATE 0xf41b
2313#define F0900_P1_DEMOD_LOCKED 0xf41b0080 2314#define DMDSTATE REGx(R0900_P1_DMDSTATE)
2314#define F0900_P1_HEADER_MODE 0xf41b0060 2315#define F0900_P1_HEADER_MODE 0xf41b0060
2315#define F0900_P1_DEMOD_MODE 0xf41b001f 2316#define HEADER_MODE FLDx(F0900_P1_HEADER_MODE)
2316 2317
2317/*P1_DMDFLYW*/ 2318/*P1_DMDFLYW*/
2318#define R0900_P1_DMDFLYW 0xf41c 2319#define R0900_P1_DMDFLYW 0xf41c
2319#define F0900_P1_I2C_IRQVAL 0xf41c00f0 2320#define DMDFLYW REGx(R0900_P1_DMDFLYW)
2320#define F0900_P1_FLYWHEEL_CPT 0xf41c000f 2321#define F0900_P1_I2C_IRQVAL 0xf41c00f0
2322#define F0900_P1_FLYWHEEL_CPT 0xf41c000f
2323#define FLYWHEEL_CPT FLDx(F0900_P1_FLYWHEEL_CPT)
2321 2324
2322/*P1_DSTATUS3*/ 2325/*P1_DSTATUS3*/
2323#define R0900_P1_DSTATUS3 0xf41d 2326#define R0900_P1_DSTATUS3 0xf41d
2324#define F0900_P1_CFR_ZIGZAG 0xf41d0080 2327#define DSTATUS3 REGx(R0900_P1_DSTATUS3)
2325#define F0900_P1_DEMOD_CFGMODE 0xf41d0060 2328#define F0900_P1_DEMOD_CFGMODE 0xf41d0060
2326#define F0900_P1_GAMMA_LOWBAUDRATE 0xf41d0010
2327#define F0900_P1_RELOCK_MODE 0xf41d0008
2328#define F0900_P1_DEMOD_FAIL 0xf41d0004
2329#define F0900_P1_ETAPE1A_DVBXMEM 0xf41d0003
2330 2329
2331/*P1_DMDCFG3*/ 2330/*P1_DMDCFG3*/
2332#define R0900_P1_DMDCFG3 0xf41e 2331#define R0900_P1_DMDCFG3 0xf41e
2333#define F0900_P1_DVBS1_TMGWAIT 0xf41e0080 2332#define DMDCFG3 REGx(R0900_P1_DMDCFG3)
2334#define F0900_P1_NO_BWCENTERING 0xf41e0040 2333#define F0900_P1_NOSTOP_FIFOFULL 0xf41e0008
2335#define F0900_P1_INV_SEQSRCH 0xf41e0020
2336#define F0900_P1_DIS_SFRUPLOW_TRK 0xf41e0010
2337#define F0900_P1_NOSTOP_FIFOFULL 0xf41e0008
2338#define F0900_P1_LOCKTIME_MODE 0xf41e0007
2339 2334
2340/*P1_DMDCFG4*/ 2335/*P1_DMDCFG4*/
2341#define R0900_P1_DMDCFG4 0xf41f 2336#define R0900_P1_DMDCFG4 0xf41f
2342#define F0900_P1_TUNER_NRELAUNCH 0xf41f0008 2337#define DMDCFG4 REGx(R0900_P1_DMDCFG4)
2343#define F0900_P1_DIS_CLKENABLE 0xf41f0004 2338#define F0900_P1_TUNER_NRELAUNCH 0xf41f0008
2344#define F0900_P1_DIS_HDRDIVLOCK 0xf41f0002
2345#define F0900_P1_NO_TNRWBINIT 0xf41f0001
2346 2339
2347/*P1_CORRELMANT*/ 2340/*P1_CORRELMANT*/
2348#define R0900_P1_CORRELMANT 0xf420 2341#define R0900_P1_CORRELMANT 0xf420
2349#define F0900_P1_CORREL_MANT 0xf42000ff 2342#define CORRELMANT REGx(R0900_P1_CORRELMANT)
2343#define F0900_P1_CORREL_MANT 0xf42000ff
2350 2344
2351/*P1_CORRELABS*/ 2345/*P1_CORRELABS*/
2352#define R0900_P1_CORRELABS 0xf421 2346#define R0900_P1_CORRELABS 0xf421
2353#define F0900_P1_CORREL_ABS 0xf42100ff 2347#define CORRELABS REGx(R0900_P1_CORRELABS)
2348#define F0900_P1_CORREL_ABS 0xf42100ff
2354 2349
2355/*P1_CORRELEXP*/ 2350/*P1_CORRELEXP*/
2356#define R0900_P1_CORRELEXP 0xf422 2351#define R0900_P1_CORRELEXP 0xf422
2357#define F0900_P1_CORREL_ABSEXP 0xf42200f0 2352#define CORRELEXP REGx(R0900_P1_CORRELEXP)
2358#define F0900_P1_CORREL_EXP 0xf422000f 2353#define F0900_P1_CORREL_ABSEXP 0xf42200f0
2354#define F0900_P1_CORREL_EXP 0xf422000f
2359 2355
2360/*P1_PLHMODCOD*/ 2356/*P1_PLHMODCOD*/
2361#define R0900_P1_PLHMODCOD 0xf424 2357#define R0900_P1_PLHMODCOD 0xf424
2362#define F0900_P1_SPECINV_DEMOD 0xf4240080 2358#define PLHMODCOD REGx(R0900_P1_PLHMODCOD)
2363#define F0900_P1_PLH_MODCOD 0xf424007c 2359#define F0900_P1_SPECINV_DEMOD 0xf4240080
2364#define F0900_P1_PLH_TYPE 0xf4240003 2360#define SPECINV_DEMOD FLDx(F0900_P1_SPECINV_DEMOD)
2365 2361#define F0900_P1_PLH_MODCOD 0xf424007c
2366/*P1_AGCK32*/ 2362#define F0900_P1_PLH_TYPE 0xf4240003
2367#define R0900_P1_AGCK32 0xf42b 2363
2368#define F0900_P1_R3ADJOFF_32APSK 0xf42b0080 2364/*P1_DMDREG*/
2369#define F0900_P1_R2ADJOFF_32APSK 0xf42b0040 2365#define R0900_P1_DMDREG 0xf425
2370#define F0900_P1_R1ADJOFF_32APSK 0xf42b0020 2366#define DMDREG REGx(R0900_P1_DMDREG)
2371#define F0900_P1_RADJ_32APSK 0xf42b001f 2367#define F0900_P1_DECIM_PLFRAMES 0xf4250001
2372 2368
2373/*P1_AGC2O*/ 2369/*P1_AGC2O*/
2374#define R0900_P1_AGC2O 0xf42c 2370#define R0900_P1_AGC2O 0xf42c
2375#define F0900_P1_AGC2REF_ADJUSTING 0xf42c0080 2371#define AGC2O REGx(R0900_P1_AGC2O)
2376#define F0900_P1_AGC2_COARSEFAST 0xf42c0040 2372#define F0900_P1_AGC2_COEF 0xf42c0007
2377#define F0900_P1_AGC2_LKSQRT 0xf42c0020
2378#define F0900_P1_AGC2_LKMODE 0xf42c0010
2379#define F0900_P1_AGC2_LKEQUA 0xf42c0008
2380#define F0900_P1_AGC2_COEF 0xf42c0007
2381 2373
2382/*P1_AGC2REF*/ 2374/*P1_AGC2REF*/
2383#define R0900_P1_AGC2REF 0xf42d 2375#define R0900_P1_AGC2REF 0xf42d
2384#define F0900_P1_AGC2_REF 0xf42d00ff 2376#define AGC2REF REGx(R0900_P1_AGC2REF)
2377#define F0900_P1_AGC2_REF 0xf42d00ff
2385 2378
2386/*P1_AGC1ADJ*/ 2379/*P1_AGC1ADJ*/
2387#define R0900_P1_AGC1ADJ 0xf42e 2380#define R0900_P1_AGC1ADJ 0xf42e
2388#define F0900_P1_AGC1ADJ_MANUAL 0xf42e0080 2381#define AGC1ADJ REGx(R0900_P1_AGC1ADJ)
2389#define F0900_P1_AGC1_ADJUSTED 0xf42e017f 2382#define F0900_P1_AGC1_ADJUSTED 0xf42e007f
2390 2383
2391/*P1_AGC2I1*/ 2384/*P1_AGC2I1*/
2392#define R0900_P1_AGC2I1 0xf436 2385#define R0900_P1_AGC2I1 0xf436
2393#define F0900_P1_AGC2_INTEGRATOR1 0xf43600ff 2386#define AGC2I1 REGx(R0900_P1_AGC2I1)
2387#define F0900_P1_AGC2_INTEGRATOR1 0xf43600ff
2394 2388
2395/*P1_AGC2I0*/ 2389/*P1_AGC2I0*/
2396#define R0900_P1_AGC2I0 0xf437 2390#define R0900_P1_AGC2I0 0xf437
2397#define F0900_P1_AGC2_INTEGRATOR0 0xf43700ff 2391#define AGC2I0 REGx(R0900_P1_AGC2I0)
2392#define F0900_P1_AGC2_INTEGRATOR0 0xf43700ff
2398 2393
2399/*P1_CARCFG*/ 2394/*P1_CARCFG*/
2400#define R0900_P1_CARCFG 0xf438 2395#define R0900_P1_CARCFG 0xf438
2401#define F0900_P1_CFRUPLOW_AUTO 0xf4380080 2396#define CARCFG REGx(R0900_P1_CARCFG)
2402#define F0900_P1_CFRUPLOW_TEST 0xf4380040 2397#define F0900_P1_CFRUPLOW_AUTO 0xf4380080
2403#define F0900_P1_EN_CAR2CENTER 0xf4380020 2398#define F0900_P1_CFRUPLOW_TEST 0xf4380040
2404#define F0900_P1_CARHDR_NODIV8 0xf4380010 2399#define F0900_P1_ROTAON 0xf4380004
2405#define F0900_P1_I2C_ROTA 0xf4380008 2400#define F0900_P1_PH_DET_ALGO 0xf4380003
2406#define F0900_P1_ROTAON 0xf4380004
2407#define F0900_P1_PH_DET_ALGO 0xf4380003
2408 2401
2409/*P1_ACLC*/ 2402/*P1_ACLC*/
2410#define R0900_P1_ACLC 0xf439 2403#define R0900_P1_ACLC 0xf439
2411#define F0900_P1_STOP_S2ALPHA 0xf43900c0 2404#define ACLC REGx(R0900_P1_ACLC)
2412#define F0900_P1_CAR_ALPHA_MANT 0xf4390030 2405#define F0900_P1_CAR_ALPHA_MANT 0xf4390030
2413#define F0900_P1_CAR_ALPHA_EXP 0xf439000f 2406#define F0900_P1_CAR_ALPHA_EXP 0xf439000f
2414 2407
2415/*P1_BCLC*/ 2408/*P1_BCLC*/
2416#define R0900_P1_BCLC 0xf43a 2409#define R0900_P1_BCLC 0xf43a
2417#define F0900_P1_STOP_S2BETA 0xf43a00c0 2410#define BCLC REGx(R0900_P1_BCLC)
2418#define F0900_P1_CAR_BETA_MANT 0xf43a0030 2411#define F0900_P1_CAR_BETA_MANT 0xf43a0030
2419#define F0900_P1_CAR_BETA_EXP 0xf43a000f 2412#define F0900_P1_CAR_BETA_EXP 0xf43a000f
2420 2413
2421/*P1_CARFREQ*/ 2414/*P1_CARFREQ*/
2422#define R0900_P1_CARFREQ 0xf43d 2415#define R0900_P1_CARFREQ 0xf43d
2423#define F0900_P1_KC_COARSE_EXP 0xf43d00f0 2416#define CARFREQ REGx(R0900_P1_CARFREQ)
2424#define F0900_P1_BETA_FREQ 0xf43d000f 2417#define F0900_P1_KC_COARSE_EXP 0xf43d00f0
2418#define F0900_P1_BETA_FREQ 0xf43d000f
2425 2419
2426/*P1_CARHDR*/ 2420/*P1_CARHDR*/
2427#define R0900_P1_CARHDR 0xf43e 2421#define R0900_P1_CARHDR 0xf43e
2428#define F0900_P1_K_FREQ_HDR 0xf43e00ff 2422#define CARHDR REGx(R0900_P1_CARHDR)
2423#define F0900_P1_K_FREQ_HDR 0xf43e00ff
2429 2424
2430/*P1_LDT*/ 2425/*P1_LDT*/
2431#define R0900_P1_LDT 0xf43f 2426#define R0900_P1_LDT 0xf43f
2432#define F0900_P1_CARLOCK_THRES 0xf43f01ff 2427#define LDT REGx(R0900_P1_LDT)
2428#define F0900_P1_CARLOCK_THRES 0xf43f01ff
2433 2429
2434/*P1_LDT2*/ 2430/*P1_LDT2*/
2435#define R0900_P1_LDT2 0xf440 2431#define R0900_P1_LDT2 0xf440
2436#define F0900_P1_CARLOCK_THRES2 0xf44001ff 2432#define LDT2 REGx(R0900_P1_LDT2)
2433#define F0900_P1_CARLOCK_THRES2 0xf44001ff
2437 2434
2438/*P1_CFRICFG*/ 2435/*P1_CFRICFG*/
2439#define R0900_P1_CFRICFG 0xf441 2436#define R0900_P1_CFRICFG 0xf441
2440#define F0900_P1_CFRINIT_UNVALRNG 0xf4410080 2437#define CFRICFG REGx(R0900_P1_CFRICFG)
2441#define F0900_P1_CFRINIT_LUNVALCPT 0xf4410040 2438#define F0900_P1_NEG_CFRSTEP 0xf4410001
2442#define F0900_P1_CFRINIT_ABORTDBL 0xf4410020
2443#define F0900_P1_CFRINIT_ABORTPRED 0xf4410010
2444#define F0900_P1_CFRINIT_UNVALSKIP 0xf4410008
2445#define F0900_P1_CFRINIT_CSTINC 0xf4410004
2446#define F0900_P1_NEG_CFRSTEP 0xf4410001
2447 2439
2448/*P1_CFRUP1*/ 2440/*P1_CFRUP1*/
2449#define R0900_P1_CFRUP1 0xf442 2441#define R0900_P1_CFRUP1 0xf442
2450#define F0900_P1_CFR_UP1 0xf44201ff 2442#define CFRUP1 REGx(R0900_P1_CFRUP1)
2443#define F0900_P1_CFR_UP1 0xf44201ff
2444#define CFR_UP1 FLDx(F0900_P1_CFR_UP1)
2451 2445
2452/*P1_CFRUP0*/ 2446/*P1_CFRUP0*/
2453#define R0900_P1_CFRUP0 0xf443 2447#define R0900_P1_CFRUP0 0xf443
2454#define F0900_P1_CFR_UP0 0xf44300ff 2448#define CFRUP0 REGx(R0900_P1_CFRUP0)
2449#define F0900_P1_CFR_UP0 0xf44300ff
2450#define CFR_UP0 FLDx(F0900_P1_CFR_UP0)
2455 2451
2456/*P1_CFRLOW1*/ 2452/*P1_CFRLOW1*/
2457#define R0900_P1_CFRLOW1 0xf446 2453#define R0900_P1_CFRLOW1 0xf446
2458#define F0900_P1_CFR_LOW1 0xf44601ff 2454#define CFRLOW1 REGx(R0900_P1_CFRLOW1)
2455#define F0900_P1_CFR_LOW1 0xf44601ff
2456#define CFR_LOW1 FLDx(F0900_P1_CFR_LOW1)
2459 2457
2460/*P1_CFRLOW0*/ 2458/*P1_CFRLOW0*/
2461#define R0900_P1_CFRLOW0 0xf447 2459#define R0900_P1_CFRLOW0 0xf447
2462#define F0900_P1_CFR_LOW0 0xf44700ff 2460#define CFRLOW0 REGx(R0900_P1_CFRLOW0)
2461#define F0900_P1_CFR_LOW0 0xf44700ff
2462#define CFR_LOW0 FLDx(F0900_P1_CFR_LOW0)
2463 2463
2464/*P1_CFRINIT1*/ 2464/*P1_CFRINIT1*/
2465#define R0900_P1_CFRINIT1 0xf448 2465#define R0900_P1_CFRINIT1 0xf448
2466#define F0900_P1_CFR_INIT1 0xf44801ff 2466#define CFRINIT1 REGx(R0900_P1_CFRINIT1)
2467#define F0900_P1_CFR_INIT1 0xf44801ff
2468#define CFR_INIT1 FLDx(F0900_P1_CFR_INIT1)
2467 2469
2468/*P1_CFRINIT0*/ 2470/*P1_CFRINIT0*/
2469#define R0900_P1_CFRINIT0 0xf449 2471#define R0900_P1_CFRINIT0 0xf449
2470#define F0900_P1_CFR_INIT0 0xf44900ff 2472#define CFRINIT0 REGx(R0900_P1_CFRINIT0)
2473#define F0900_P1_CFR_INIT0 0xf44900ff
2474#define CFR_INIT0 FLDx(F0900_P1_CFR_INIT0)
2471 2475
2472/*P1_CFRINC1*/ 2476/*P1_CFRINC1*/
2473#define R0900_P1_CFRINC1 0xf44a 2477#define R0900_P1_CFRINC1 0xf44a
2474#define F0900_P1_MANUAL_CFRINC 0xf44a0080 2478#define CFRINC1 REGx(R0900_P1_CFRINC1)
2475#define F0900_P1_CFR_INC1 0xf44a017f 2479#define F0900_P1_MANUAL_CFRINC 0xf44a0080
2480#define F0900_P1_CFR_INC1 0xf44a003f
2476 2481
2477/*P1_CFRINC0*/ 2482/*P1_CFRINC0*/
2478#define R0900_P1_CFRINC0 0xf44b 2483#define R0900_P1_CFRINC0 0xf44b
2479#define F0900_P1_CFR_INC0 0xf44b00f0 2484#define CFRINC0 REGx(R0900_P1_CFRINC0)
2485#define F0900_P1_CFR_INC0 0xf44b00f8
2480 2486
2481/*P1_CFR2*/ 2487/*P1_CFR2*/
2482#define R0900_P1_CFR2 0xf44c 2488#define R0900_P1_CFR2 0xf44c
2483#define F0900_P1_CAR_FREQ2 0xf44c01ff 2489#define CFR2 REGx(R0900_P1_CFR2)
2490#define F0900_P1_CAR_FREQ2 0xf44c01ff
2491#define CAR_FREQ2 FLDx(F0900_P1_CAR_FREQ2)
2484 2492
2485/*P1_CFR1*/ 2493/*P1_CFR1*/
2486#define R0900_P1_CFR1 0xf44d 2494#define R0900_P1_CFR1 0xf44d
2487#define F0900_P1_CAR_FREQ1 0xf44d00ff 2495#define CFR1 REGx(R0900_P1_CFR1)
2496#define F0900_P1_CAR_FREQ1 0xf44d00ff
2497#define CAR_FREQ1 FLDx(F0900_P1_CAR_FREQ1)
2488 2498
2489/*P1_CFR0*/ 2499/*P1_CFR0*/
2490#define R0900_P1_CFR0 0xf44e 2500#define R0900_P1_CFR0 0xf44e
2491#define F0900_P1_CAR_FREQ0 0xf44e00ff 2501#define CFR0 REGx(R0900_P1_CFR0)
2502#define F0900_P1_CAR_FREQ0 0xf44e00ff
2503#define CAR_FREQ0 FLDx(F0900_P1_CAR_FREQ0)
2492 2504
2493/*P1_LDI*/ 2505/*P1_LDI*/
2494#define R0900_P1_LDI 0xf44f 2506#define R0900_P1_LDI 0xf44f
2495#define F0900_P1_LOCK_DET_INTEGR 0xf44f01ff 2507#define LDI REGx(R0900_P1_LDI)
2508#define F0900_P1_LOCK_DET_INTEGR 0xf44f01ff
2496 2509
2497/*P1_TMGCFG*/ 2510/*P1_TMGCFG*/
2498#define R0900_P1_TMGCFG 0xf450 2511#define R0900_P1_TMGCFG 0xf450
2499#define F0900_P1_TMGLOCK_BETA 0xf45000c0 2512#define TMGCFG REGx(R0900_P1_TMGCFG)
2500#define F0900_P1_NOTMG_GROUPDELAY 0xf4500020 2513#define F0900_P1_TMGLOCK_BETA 0xf45000c0
2501#define F0900_P1_DO_TIMING_CORR 0xf4500010 2514#define F0900_P1_DO_TIMING_CORR 0xf4500010
2502#define F0900_P1_MANUAL_SCAN 0xf450000c 2515#define F0900_P1_TMG_MINFREQ 0xf4500003
2503#define F0900_P1_TMG_MINFREQ 0xf4500003
2504 2516
2505/*P1_RTC*/ 2517/*P1_RTC*/
2506#define R0900_P1_RTC 0xf451 2518#define R0900_P1_RTC 0xf451
2507#define F0900_P1_TMGALPHA_EXP 0xf45100f0 2519#define RTC REGx(R0900_P1_RTC)
2508#define F0900_P1_TMGBETA_EXP 0xf451000f 2520#define F0900_P1_TMGALPHA_EXP 0xf45100f0
2521#define F0900_P1_TMGBETA_EXP 0xf451000f
2509 2522
2510/*P1_RTCS2*/ 2523/*P1_RTCS2*/
2511#define R0900_P1_RTCS2 0xf452 2524#define R0900_P1_RTCS2 0xf452
2512#define F0900_P1_TMGALPHAS2_EXP 0xf45200f0 2525#define RTCS2 REGx(R0900_P1_RTCS2)
2513#define F0900_P1_TMGBETAS2_EXP 0xf452000f 2526#define F0900_P1_TMGALPHAS2_EXP 0xf45200f0
2527#define F0900_P1_TMGBETAS2_EXP 0xf452000f
2514 2528
2515/*P1_TMGTHRISE*/ 2529/*P1_TMGTHRISE*/
2516#define R0900_P1_TMGTHRISE 0xf453 2530#define R0900_P1_TMGTHRISE 0xf453
2517#define F0900_P1_TMGLOCK_THRISE 0xf45300ff 2531#define TMGTHRISE REGx(R0900_P1_TMGTHRISE)
2532#define F0900_P1_TMGLOCK_THRISE 0xf45300ff
2518 2533
2519/*P1_TMGTHFALL*/ 2534/*P1_TMGTHFALL*/
2520#define R0900_P1_TMGTHFALL 0xf454 2535#define R0900_P1_TMGTHFALL 0xf454
2521#define F0900_P1_TMGLOCK_THFALL 0xf45400ff 2536#define TMGTHFALL REGx(R0900_P1_TMGTHFALL)
2537#define F0900_P1_TMGLOCK_THFALL 0xf45400ff
2522 2538
2523/*P1_SFRUPRATIO*/ 2539/*P1_SFRUPRATIO*/
2524#define R0900_P1_SFRUPRATIO 0xf455 2540#define R0900_P1_SFRUPRATIO 0xf455
2525#define F0900_P1_SFR_UPRATIO 0xf45500ff 2541#define SFRUPRATIO REGx(R0900_P1_SFRUPRATIO)
2542#define F0900_P1_SFR_UPRATIO 0xf45500ff
2526 2543
2527/*P1_SFRLOWRATIO*/ 2544/*P1_SFRLOWRATIO*/
2528#define R0900_P1_SFRLOWRATIO 0xf456 2545#define R0900_P1_SFRLOWRATIO 0xf456
2529#define F0900_P1_SFR_LOWRATIO 0xf45600ff 2546#define F0900_P1_SFR_LOWRATIO 0xf45600ff
2530 2547
2531/*P1_KREFTMG*/ 2548/*P1_KREFTMG*/
2532#define R0900_P1_KREFTMG 0xf458 2549#define R0900_P1_KREFTMG 0xf458
2533#define F0900_P1_KREF_TMG 0xf45800ff 2550#define KREFTMG REGx(R0900_P1_KREFTMG)
2551#define F0900_P1_KREF_TMG 0xf45800ff
2534 2552
2535/*P1_SFRSTEP*/ 2553/*P1_SFRSTEP*/
2536#define R0900_P1_SFRSTEP 0xf459 2554#define R0900_P1_SFRSTEP 0xf459
2537#define F0900_P1_SFR_SCANSTEP 0xf45900f0 2555#define SFRSTEP REGx(R0900_P1_SFRSTEP)
2538#define F0900_P1_SFR_CENTERSTEP 0xf459000f 2556#define F0900_P1_SFR_SCANSTEP 0xf45900f0
2557#define F0900_P1_SFR_CENTERSTEP 0xf459000f
2539 2558
2540/*P1_TMGCFG2*/ 2559/*P1_TMGCFG2*/
2541#define R0900_P1_TMGCFG2 0xf45a 2560#define R0900_P1_TMGCFG2 0xf45a
2542#define F0900_P1_DIS_AUTOSAMP 0xf45a0008 2561#define TMGCFG2 REGx(R0900_P1_TMGCFG2)
2543#define F0900_P1_SCANINIT_QUART 0xf45a0004 2562#define F0900_P1_SFRRATIO_FINE 0xf45a0001
2544#define F0900_P1_NOTMG_DVBS1DERAT 0xf45a0002 2563
2545#define F0900_P1_SFRRATIO_FINE 0xf45a0001 2564/*P1_KREFTMG2*/
2565#define R0900_P1_KREFTMG2 0xf45b
2566#define KREFTMG2 REGx(R0900_P1_KREFTMG2)
2567#define F0900_P1_KREF_TMG2 0xf45b00ff
2546 2568
2547/*P1_SFRINIT1*/ 2569/*P1_SFRINIT1*/
2548#define R0900_P1_SFRINIT1 0xf45e 2570#define R0900_P1_SFRINIT1 0xf45e
2549#define F0900_P1_SFR_INIT1 0xf45e00ff 2571#define SFRINIT1 REGx(R0900_P1_SFRINIT1)
2572#define F0900_P1_SFR_INIT1 0xf45e007f
2550 2573
2551/*P1_SFRINIT0*/ 2574/*P1_SFRINIT0*/
2552#define R0900_P1_SFRINIT0 0xf45f 2575#define R0900_P1_SFRINIT0 0xf45f
2553#define F0900_P1_SFR_INIT0 0xf45f00ff 2576#define SFRINIT0 REGx(R0900_P1_SFRINIT0)
2577#define F0900_P1_SFR_INIT0 0xf45f00ff
2554 2578
2555/*P1_SFRUP1*/ 2579/*P1_SFRUP1*/
2556#define R0900_P1_SFRUP1 0xf460 2580#define R0900_P1_SFRUP1 0xf460
2557#define F0900_P1_AUTO_GUP 0xf4600080 2581#define SFRUP1 REGx(R0900_P1_SFRUP1)
2558#define F0900_P1_SYMB_FREQ_UP1 0xf460007f 2582#define F0900_P1_AUTO_GUP 0xf4600080
2583#define AUTO_GUP FLDx(F0900_P1_AUTO_GUP)
2584#define F0900_P1_SYMB_FREQ_UP1 0xf460007f
2559 2585
2560/*P1_SFRUP0*/ 2586/*P1_SFRUP0*/
2561#define R0900_P1_SFRUP0 0xf461 2587#define R0900_P1_SFRUP0 0xf461
2562#define F0900_P1_SYMB_FREQ_UP0 0xf46100ff 2588#define SFRUP0 REGx(R0900_P1_SFRUP0)
2589#define F0900_P1_SYMB_FREQ_UP0 0xf46100ff
2563 2590
2564/*P1_SFRLOW1*/ 2591/*P1_SFRLOW1*/
2565#define R0900_P1_SFRLOW1 0xf462 2592#define R0900_P1_SFRLOW1 0xf462
2566#define F0900_P1_AUTO_GLOW 0xf4620080 2593#define SFRLOW1 REGx(R0900_P1_SFRLOW1)
2567#define F0900_P1_SYMB_FREQ_LOW1 0xf462007f 2594#define F0900_P1_AUTO_GLOW 0xf4620080
2595#define AUTO_GLOW FLDx(F0900_P1_AUTO_GLOW)
2596#define F0900_P1_SYMB_FREQ_LOW1 0xf462007f
2568 2597
2569/*P1_SFRLOW0*/ 2598/*P1_SFRLOW0*/
2570#define R0900_P1_SFRLOW0 0xf463 2599#define R0900_P1_SFRLOW0 0xf463
2571#define F0900_P1_SYMB_FREQ_LOW0 0xf46300ff 2600#define SFRLOW0 REGx(R0900_P1_SFRLOW0)
2601#define F0900_P1_SYMB_FREQ_LOW0 0xf46300ff
2572 2602
2573/*P1_SFR3*/ 2603/*P1_SFR3*/
2574#define R0900_P1_SFR3 0xf464 2604#define R0900_P1_SFR3 0xf464
2575#define F0900_P1_SYMB_FREQ3 0xf46400ff 2605#define SFR3 REGx(R0900_P1_SFR3)
2606#define F0900_P1_SYMB_FREQ3 0xf46400ff
2607#define SYMB_FREQ3 FLDx(F0900_P1_SYMB_FREQ3)
2576 2608
2577/*P1_SFR2*/ 2609/*P1_SFR2*/
2578#define R0900_P1_SFR2 0xf465 2610#define R0900_P1_SFR2 0xf465
2579#define F0900_P1_SYMB_FREQ2 0xf46500ff 2611#define SFR2 REGx(R0900_P1_SFR2)
2612#define F0900_P1_SYMB_FREQ2 0xf46500ff
2613#define SYMB_FREQ2 FLDx(F0900_P1_SYMB_FREQ2)
2580 2614
2581/*P1_SFR1*/ 2615/*P1_SFR1*/
2582#define R0900_P1_SFR1 0xf466 2616#define R0900_P1_SFR1 0xf466
2583#define F0900_P1_SYMB_FREQ1 0xf46600ff 2617#define SFR1 REGx(R0900_P1_SFR1)
2618#define F0900_P1_SYMB_FREQ1 0xf46600ff
2619#define SYMB_FREQ1 FLDx(F0900_P1_SYMB_FREQ1)
2584 2620
2585/*P1_SFR0*/ 2621/*P1_SFR0*/
2586#define R0900_P1_SFR0 0xf467 2622#define R0900_P1_SFR0 0xf467
2587#define F0900_P1_SYMB_FREQ0 0xf46700ff 2623#define SFR0 REGx(R0900_P1_SFR0)
2624#define F0900_P1_SYMB_FREQ0 0xf46700ff
2625#define SYMB_FREQ0 FLDx(F0900_P1_SYMB_FREQ0)
2588 2626
2589/*P1_TMGREG2*/ 2627/*P1_TMGREG2*/
2590#define R0900_P1_TMGREG2 0xf468 2628#define R0900_P1_TMGREG2 0xf468
2591#define F0900_P1_TMGREG2 0xf46800ff 2629#define TMGREG2 REGx(R0900_P1_TMGREG2)
2630#define F0900_P1_TMGREG2 0xf46800ff
2592 2631
2593/*P1_TMGREG1*/ 2632/*P1_TMGREG1*/
2594#define R0900_P1_TMGREG1 0xf469 2633#define R0900_P1_TMGREG1 0xf469
2595#define F0900_P1_TMGREG1 0xf46900ff 2634#define TMGREG1 REGx(R0900_P1_TMGREG1)
2635#define F0900_P1_TMGREG1 0xf46900ff
2596 2636
2597/*P1_TMGREG0*/ 2637/*P1_TMGREG0*/
2598#define R0900_P1_TMGREG0 0xf46a 2638#define R0900_P1_TMGREG0 0xf46a
2599#define F0900_P1_TMGREG0 0xf46a00ff 2639#define TMGREG0 REGx(R0900_P1_TMGREG0)
2640#define F0900_P1_TMGREG0 0xf46a00ff
2600 2641
2601/*P1_TMGLOCK1*/ 2642/*P1_TMGLOCK1*/
2602#define R0900_P1_TMGLOCK1 0xf46b 2643#define R0900_P1_TMGLOCK1 0xf46b
2603#define F0900_P1_TMGLOCK_LEVEL1 0xf46b01ff 2644#define TMGLOCK1 REGx(R0900_P1_TMGLOCK1)
2645#define F0900_P1_TMGLOCK_LEVEL1 0xf46b01ff
2604 2646
2605/*P1_TMGLOCK0*/ 2647/*P1_TMGLOCK0*/
2606#define R0900_P1_TMGLOCK0 0xf46c 2648#define R0900_P1_TMGLOCK0 0xf46c
2607#define F0900_P1_TMGLOCK_LEVEL0 0xf46c00ff 2649#define TMGLOCK0 REGx(R0900_P1_TMGLOCK0)
2650#define F0900_P1_TMGLOCK_LEVEL0 0xf46c00ff
2608 2651
2609/*P1_TMGOBS*/ 2652/*P1_TMGOBS*/
2610#define R0900_P1_TMGOBS 0xf46d 2653#define R0900_P1_TMGOBS 0xf46d
2611#define F0900_P1_ROLLOFF_STATUS 0xf46d00c0 2654#define TMGOBS REGx(R0900_P1_TMGOBS)
2612#define F0900_P1_SCAN_SIGN 0xf46d0030 2655#define F0900_P1_ROLLOFF_STATUS 0xf46d00c0
2613#define F0900_P1_TMG_SCANNING 0xf46d0008 2656#define ROLLOFF_STATUS FLDx(F0900_P1_ROLLOFF_STATUS)
2614#define F0900_P1_CHCENTERING_MODE 0xf46d0004
2615#define F0900_P1_TMG_SCANFAIL 0xf46d0002
2616 2657
2617/*P1_EQUALCFG*/ 2658/*P1_EQUALCFG*/
2618#define R0900_P1_EQUALCFG 0xf46f 2659#define R0900_P1_EQUALCFG 0xf46f
2619#define F0900_P1_NOTMG_NEGALWAIT 0xf46f0080 2660#define EQUALCFG REGx(R0900_P1_EQUALCFG)
2620#define F0900_P1_EQUAL_ON 0xf46f0040 2661#define F0900_P1_EQUAL_ON 0xf46f0040
2621#define F0900_P1_SEL_EQUALCOR 0xf46f0038 2662#define F0900_P1_MU_EQUALDFE 0xf46f0007
2622#define F0900_P1_MU_EQUALDFE 0xf46f0007
2623 2663
2624/*P1_EQUAI1*/ 2664/*P1_EQUAI1*/
2625#define R0900_P1_EQUAI1 0xf470 2665#define R0900_P1_EQUAI1 0xf470
2626#define F0900_P1_EQUA_ACCI1 0xf47001ff 2666#define EQUAI1 REGx(R0900_P1_EQUAI1)
2667#define F0900_P1_EQUA_ACCI1 0xf47001ff
2627 2668
2628/*P1_EQUAQ1*/ 2669/*P1_EQUAQ1*/
2629#define R0900_P1_EQUAQ1 0xf471 2670#define R0900_P1_EQUAQ1 0xf471
2630#define F0900_P1_EQUA_ACCQ1 0xf47101ff 2671#define EQUAQ1 REGx(R0900_P1_EQUAQ1)
2672#define F0900_P1_EQUA_ACCQ1 0xf47101ff
2631 2673
2632/*P1_EQUAI2*/ 2674/*P1_EQUAI2*/
2633#define R0900_P1_EQUAI2 0xf472 2675#define R0900_P1_EQUAI2 0xf472
2634#define F0900_P1_EQUA_ACCI2 0xf47201ff 2676#define EQUAI2 REGx(R0900_P1_EQUAI2)
2677#define F0900_P1_EQUA_ACCI2 0xf47201ff
2635 2678
2636/*P1_EQUAQ2*/ 2679/*P1_EQUAQ2*/
2637#define R0900_P1_EQUAQ2 0xf473 2680#define R0900_P1_EQUAQ2 0xf473
2638#define F0900_P1_EQUA_ACCQ2 0xf47301ff 2681#define EQUAQ2 REGx(R0900_P1_EQUAQ2)
2682#define F0900_P1_EQUA_ACCQ2 0xf47301ff
2639 2683
2640/*P1_EQUAI3*/ 2684/*P1_EQUAI3*/
2641#define R0900_P1_EQUAI3 0xf474 2685#define R0900_P1_EQUAI3 0xf474
2642#define F0900_P1_EQUA_ACCI3 0xf47401ff 2686#define EQUAI3 REGx(R0900_P1_EQUAI3)
2687#define F0900_P1_EQUA_ACCI3 0xf47401ff
2643 2688
2644/*P1_EQUAQ3*/ 2689/*P1_EQUAQ3*/
2645#define R0900_P1_EQUAQ3 0xf475 2690#define R0900_P1_EQUAQ3 0xf475
2646#define F0900_P1_EQUA_ACCQ3 0xf47501ff 2691#define EQUAQ3 REGx(R0900_P1_EQUAQ3)
2692#define F0900_P1_EQUA_ACCQ3 0xf47501ff
2647 2693
2648/*P1_EQUAI4*/ 2694/*P1_EQUAI4*/
2649#define R0900_P1_EQUAI4 0xf476 2695#define R0900_P1_EQUAI4 0xf476
2650#define F0900_P1_EQUA_ACCI4 0xf47601ff 2696#define EQUAI4 REGx(R0900_P1_EQUAI4)
2697#define F0900_P1_EQUA_ACCI4 0xf47601ff
2651 2698
2652/*P1_EQUAQ4*/ 2699/*P1_EQUAQ4*/
2653#define R0900_P1_EQUAQ4 0xf477 2700#define R0900_P1_EQUAQ4 0xf477
2654#define F0900_P1_EQUA_ACCQ4 0xf47701ff 2701#define EQUAQ4 REGx(R0900_P1_EQUAQ4)
2702#define F0900_P1_EQUA_ACCQ4 0xf47701ff
2655 2703
2656/*P1_EQUAI5*/ 2704/*P1_EQUAI5*/
2657#define R0900_P1_EQUAI5 0xf478 2705#define R0900_P1_EQUAI5 0xf478
2658#define F0900_P1_EQUA_ACCI5 0xf47801ff 2706#define EQUAI5 REGx(R0900_P1_EQUAI5)
2707#define F0900_P1_EQUA_ACCI5 0xf47801ff
2659 2708
2660/*P1_EQUAQ5*/ 2709/*P1_EQUAQ5*/
2661#define R0900_P1_EQUAQ5 0xf479 2710#define R0900_P1_EQUAQ5 0xf479
2662#define F0900_P1_EQUA_ACCQ5 0xf47901ff 2711#define EQUAQ5 REGx(R0900_P1_EQUAQ5)
2712#define F0900_P1_EQUA_ACCQ5 0xf47901ff
2663 2713
2664/*P1_EQUAI6*/ 2714/*P1_EQUAI6*/
2665#define R0900_P1_EQUAI6 0xf47a 2715#define R0900_P1_EQUAI6 0xf47a
2666#define F0900_P1_EQUA_ACCI6 0xf47a01ff 2716#define EQUAI6 REGx(R0900_P1_EQUAI6)
2717#define F0900_P1_EQUA_ACCI6 0xf47a01ff
2667 2718
2668/*P1_EQUAQ6*/ 2719/*P1_EQUAQ6*/
2669#define R0900_P1_EQUAQ6 0xf47b 2720#define R0900_P1_EQUAQ6 0xf47b
2670#define F0900_P1_EQUA_ACCQ6 0xf47b01ff 2721#define EQUAQ6 REGx(R0900_P1_EQUAQ6)
2722#define F0900_P1_EQUA_ACCQ6 0xf47b01ff
2671 2723
2672/*P1_EQUAI7*/ 2724/*P1_EQUAI7*/
2673#define R0900_P1_EQUAI7 0xf47c 2725#define R0900_P1_EQUAI7 0xf47c
2674#define F0900_P1_EQUA_ACCI7 0xf47c01ff 2726#define EQUAI7 REGx(R0900_P1_EQUAI7)
2727#define F0900_P1_EQUA_ACCI7 0xf47c01ff
2675 2728
2676/*P1_EQUAQ7*/ 2729/*P1_EQUAQ7*/
2677#define R0900_P1_EQUAQ7 0xf47d 2730#define R0900_P1_EQUAQ7 0xf47d
2678#define F0900_P1_EQUA_ACCQ7 0xf47d01ff 2731#define EQUAQ7 REGx(R0900_P1_EQUAQ7)
2732#define F0900_P1_EQUA_ACCQ7 0xf47d01ff
2679 2733
2680/*P1_EQUAI8*/ 2734/*P1_EQUAI8*/
2681#define R0900_P1_EQUAI8 0xf47e 2735#define R0900_P1_EQUAI8 0xf47e
2682#define F0900_P1_EQUA_ACCI8 0xf47e01ff 2736#define EQUAI8 REGx(R0900_P1_EQUAI8)
2737#define F0900_P1_EQUA_ACCI8 0xf47e01ff
2683 2738
2684/*P1_EQUAQ8*/ 2739/*P1_EQUAQ8*/
2685#define R0900_P1_EQUAQ8 0xf47f 2740#define R0900_P1_EQUAQ8 0xf47f
2686#define F0900_P1_EQUA_ACCQ8 0xf47f01ff 2741#define EQUAQ8 REGx(R0900_P1_EQUAQ8)
2742#define F0900_P1_EQUA_ACCQ8 0xf47f01ff
2687 2743
2688/*P1_NNOSDATAT1*/ 2744/*P1_NNOSDATAT1*/
2689#define R0900_P1_NNOSDATAT1 0xf480 2745#define R0900_P1_NNOSDATAT1 0xf480
2690#define F0900_P1_NOSDATAT_NORMED1 0xf48000ff 2746#define NNOSDATAT1 REGx(R0900_P1_NNOSDATAT1)
2747#define F0900_P1_NOSDATAT_NORMED1 0xf48000ff
2748#define NOSDATAT_NORMED1 FLDx(F0900_P1_NOSDATAT_NORMED1)
2691 2749
2692/*P1_NNOSDATAT0*/ 2750/*P1_NNOSDATAT0*/
2693#define R0900_P1_NNOSDATAT0 0xf481 2751#define R0900_P1_NNOSDATAT0 0xf481
2694#define F0900_P1_NOSDATAT_NORMED0 0xf48100ff 2752#define NNOSDATAT0 REGx(R0900_P1_NNOSDATAT0)
2753#define F0900_P1_NOSDATAT_NORMED0 0xf48100ff
2754#define NOSDATAT_NORMED0 FLDx(F0900_P1_NOSDATAT_NORMED0)
2695 2755
2696/*P1_NNOSDATA1*/ 2756/*P1_NNOSDATA1*/
2697#define R0900_P1_NNOSDATA1 0xf482 2757#define R0900_P1_NNOSDATA1 0xf482
2698#define F0900_P1_NOSDATA_NORMED1 0xf48200ff 2758#define NNOSDATA1 REGx(R0900_P1_NNOSDATA1)
2759#define F0900_P1_NOSDATA_NORMED1 0xf48200ff
2699 2760
2700/*P1_NNOSDATA0*/ 2761/*P1_NNOSDATA0*/
2701#define R0900_P1_NNOSDATA0 0xf483 2762#define R0900_P1_NNOSDATA0 0xf483
2702#define F0900_P1_NOSDATA_NORMED0 0xf48300ff 2763#define NNOSDATA0 REGx(R0900_P1_NNOSDATA0)
2764#define F0900_P1_NOSDATA_NORMED0 0xf48300ff
2703 2765
2704/*P1_NNOSPLHT1*/ 2766/*P1_NNOSPLHT1*/
2705#define R0900_P1_NNOSPLHT1 0xf484 2767#define R0900_P1_NNOSPLHT1 0xf484
2706#define F0900_P1_NOSPLHT_NORMED1 0xf48400ff 2768#define NNOSPLHT1 REGx(R0900_P1_NNOSPLHT1)
2769#define F0900_P1_NOSPLHT_NORMED1 0xf48400ff
2770#define NOSPLHT_NORMED1 FLDx(F0900_P1_NOSPLHT_NORMED1)
2707 2771
2708/*P1_NNOSPLHT0*/ 2772/*P1_NNOSPLHT0*/
2709#define R0900_P1_NNOSPLHT0 0xf485 2773#define R0900_P1_NNOSPLHT0 0xf485
2710#define F0900_P1_NOSPLHT_NORMED0 0xf48500ff 2774#define NNOSPLHT0 REGx(R0900_P1_NNOSPLHT0)
2775#define F0900_P1_NOSPLHT_NORMED0 0xf48500ff
2776#define NOSPLHT_NORMED0 FLDx(F0900_P1_NOSPLHT_NORMED0)
2711 2777
2712/*P1_NNOSPLH1*/ 2778/*P1_NNOSPLH1*/
2713#define R0900_P1_NNOSPLH1 0xf486 2779#define R0900_P1_NNOSPLH1 0xf486
2714#define F0900_P1_NOSPLH_NORMED1 0xf48600ff 2780#define NNOSPLH1 REGx(R0900_P1_NNOSPLH1)
2781#define F0900_P1_NOSPLH_NORMED1 0xf48600ff
2715 2782
2716/*P1_NNOSPLH0*/ 2783/*P1_NNOSPLH0*/
2717#define R0900_P1_NNOSPLH0 0xf487 2784#define R0900_P1_NNOSPLH0 0xf487
2718#define F0900_P1_NOSPLH_NORMED0 0xf48700ff 2785#define NNOSPLH0 REGx(R0900_P1_NNOSPLH0)
2786#define F0900_P1_NOSPLH_NORMED0 0xf48700ff
2719 2787
2720/*P1_NOSDATAT1*/ 2788/*P1_NOSDATAT1*/
2721#define R0900_P1_NOSDATAT1 0xf488 2789#define R0900_P1_NOSDATAT1 0xf488
2722#define F0900_P1_NOSDATAT_UNNORMED1 0xf48800ff 2790#define NOSDATAT1 REGx(R0900_P1_NOSDATAT1)
2791#define F0900_P1_NOSDATAT_UNNORMED1 0xf48800ff
2723 2792
2724/*P1_NOSDATAT0*/ 2793/*P1_NOSDATAT0*/
2725#define R0900_P1_NOSDATAT0 0xf489 2794#define R0900_P1_NOSDATAT0 0xf489
2726#define F0900_P1_NOSDATAT_UNNORMED0 0xf48900ff 2795#define NOSDATAT0 REGx(R0900_P1_NOSDATAT0)
2796#define F0900_P1_NOSDATAT_UNNORMED0 0xf48900ff
2727 2797
2728/*P1_NOSDATA1*/ 2798/*P1_NOSDATA1*/
2729#define R0900_P1_NOSDATA1 0xf48a 2799#define R0900_P1_NOSDATA1 0xf48a
2730#define F0900_P1_NOSDATA_UNNORMED1 0xf48a00ff 2800#define NOSDATA1 REGx(R0900_P1_NOSDATA1)
2801#define F0900_P1_NOSDATA_UNNORMED1 0xf48a00ff
2731 2802
2732/*P1_NOSDATA0*/ 2803/*P1_NOSDATA0*/
2733#define R0900_P1_NOSDATA0 0xf48b 2804#define R0900_P1_NOSDATA0 0xf48b
2734#define F0900_P1_NOSDATA_UNNORMED0 0xf48b00ff 2805#define NOSDATA0 REGx(R0900_P1_NOSDATA0)
2806#define F0900_P1_NOSDATA_UNNORMED0 0xf48b00ff
2735 2807
2736/*P1_NOSPLHT1*/ 2808/*P1_NOSPLHT1*/
2737#define R0900_P1_NOSPLHT1 0xf48c 2809#define R0900_P1_NOSPLHT1 0xf48c
2738#define F0900_P1_NOSPLHT_UNNORMED1 0xf48c00ff 2810#define NOSPLHT1 REGx(R0900_P1_NOSPLHT1)
2811#define F0900_P1_NOSPLHT_UNNORMED1 0xf48c00ff
2739 2812
2740/*P1_NOSPLHT0*/ 2813/*P1_NOSPLHT0*/
2741#define R0900_P1_NOSPLHT0 0xf48d 2814#define R0900_P1_NOSPLHT0 0xf48d
2742#define F0900_P1_NOSPLHT_UNNORMED0 0xf48d00ff 2815#define NOSPLHT0 REGx(R0900_P1_NOSPLHT0)
2816#define F0900_P1_NOSPLHT_UNNORMED0 0xf48d00ff
2743 2817
2744/*P1_NOSPLH1*/ 2818/*P1_NOSPLH1*/
2745#define R0900_P1_NOSPLH1 0xf48e 2819#define R0900_P1_NOSPLH1 0xf48e
2746#define F0900_P1_NOSPLH_UNNORMED1 0xf48e00ff 2820#define NOSPLH1 REGx(R0900_P1_NOSPLH1)
2821#define F0900_P1_NOSPLH_UNNORMED1 0xf48e00ff
2747 2822
2748/*P1_NOSPLH0*/ 2823/*P1_NOSPLH0*/
2749#define R0900_P1_NOSPLH0 0xf48f 2824#define R0900_P1_NOSPLH0 0xf48f
2750#define F0900_P1_NOSPLH_UNNORMED0 0xf48f00ff 2825#define NOSPLH0 REGx(R0900_P1_NOSPLH0)
2826#define F0900_P1_NOSPLH_UNNORMED0 0xf48f00ff
2751 2827
2752/*P1_CAR2CFG*/ 2828/*P1_CAR2CFG*/
2753#define R0900_P1_CAR2CFG 0xf490 2829#define R0900_P1_CAR2CFG 0xf490
2754#define F0900_P1_DESCRAMB_OFF 0xf4900080 2830#define CAR2CFG REGx(R0900_P1_CAR2CFG)
2755#define F0900_P1_PN4_SELECT 0xf4900040 2831#define F0900_P1_CARRIER3_DISABLE 0xf4900040
2756#define F0900_P1_CFR2_STOPDVBS1 0xf4900020 2832#define F0900_P1_ROTA2ON 0xf4900004
2757#define F0900_P1_STOP_CFR2UPDATE 0xf4900010 2833#define F0900_P1_PH_DET_ALGO2 0xf4900003
2758#define F0900_P1_STOP_NCO2UPDATE 0xf4900008 2834
2759#define F0900_P1_ROTA2ON 0xf4900004 2835/*P1_CFR2CFR1*/
2760#define F0900_P1_PH_DET_ALGO2 0xf4900003 2836#define R0900_P1_CFR2CFR1 0xf491
2761 2837#define CFR2CFR1 REGx(R0900_P1_CFR2CFR1)
2762/*P1_ACLC2*/ 2838#define F0900_P1_CFR2TOCFR1_DVBS1 0xf49100c0
2763#define R0900_P1_ACLC2 0xf491 2839#define F0900_P1_EN_S2CAR2CENTER 0xf4910020
2764#define F0900_P1_CAR2_PUNCT_ADERAT 0xf4910040 2840#define F0900_P1_DIS_BCHERRCFR2 0xf4910010
2765#define F0900_P1_CAR2_ALPHA_MANT 0xf4910030 2841#define F0900_P1_CFR2TOCFR1_BETA 0xf4910007
2766#define F0900_P1_CAR2_ALPHA_EXP 0xf491000f
2767
2768/*P1_BCLC2*/
2769#define R0900_P1_BCLC2 0xf492
2770#define F0900_P1_DVBS2_NIP 0xf4920080
2771#define F0900_P1_CAR2_PUNCT_BDERAT 0xf4920040
2772#define F0900_P1_CAR2_BETA_MANT 0xf4920030
2773#define F0900_P1_CAR2_BETA_EXP 0xf492000f
2774 2842
2775/*P1_CFR22*/ 2843/*P1_CFR22*/
2776#define R0900_P1_CFR22 0xf493 2844#define R0900_P1_CFR22 0xf493
2777#define F0900_P1_CAR2_FREQ2 0xf49301ff 2845#define CFR22 REGx(R0900_P1_CFR22)
2846#define F0900_P1_CAR2_FREQ2 0xf49301ff
2778 2847
2779/*P1_CFR21*/ 2848/*P1_CFR21*/
2780#define R0900_P1_CFR21 0xf494 2849#define R0900_P1_CFR21 0xf494
2781#define F0900_P1_CAR2_FREQ1 0xf49400ff 2850#define CFR21 REGx(R0900_P1_CFR21)
2851#define F0900_P1_CAR2_FREQ1 0xf49400ff
2782 2852
2783/*P1_CFR20*/ 2853/*P1_CFR20*/
2784#define R0900_P1_CFR20 0xf495 2854#define R0900_P1_CFR20 0xf495
2785#define F0900_P1_CAR2_FREQ0 0xf49500ff 2855#define CFR20 REGx(R0900_P1_CFR20)
2856#define F0900_P1_CAR2_FREQ0 0xf49500ff
2786 2857
2787/*P1_ACLC2S2Q*/ 2858/*P1_ACLC2S2Q*/
2788#define R0900_P1_ACLC2S2Q 0xf497 2859#define R0900_P1_ACLC2S2Q 0xf497
2789#define F0900_P1_ENAB_SPSKSYMB 0xf4970080 2860#define ACLC2S2Q REGx(R0900_P1_ACLC2S2Q)
2790#define F0900_P1_CAR2S2_QADERAT 0xf4970040 2861#define F0900_P1_ENAB_SPSKSYMB 0xf4970080
2791#define F0900_P1_CAR2S2_Q_ALPH_M 0xf4970030 2862#define F0900_P1_CAR2S2_Q_ALPH_M 0xf4970030
2792#define F0900_P1_CAR2S2_Q_ALPH_E 0xf497000f 2863#define F0900_P1_CAR2S2_Q_ALPH_E 0xf497000f
2793 2864
2794/*P1_ACLC2S28*/ 2865/*P1_ACLC2S28*/
2795#define R0900_P1_ACLC2S28 0xf498 2866#define R0900_P1_ACLC2S28 0xf498
2796#define F0900_P1_OLDI3Q_MODE 0xf4980080 2867#define ACLC2S28 REGx(R0900_P1_ACLC2S28)
2797#define F0900_P1_CAR2S2_8ADERAT 0xf4980040 2868#define F0900_P1_OLDI3Q_MODE 0xf4980080
2798#define F0900_P1_CAR2S2_8_ALPH_M 0xf4980030 2869#define F0900_P1_CAR2S2_8_ALPH_M 0xf4980030
2799#define F0900_P1_CAR2S2_8_ALPH_E 0xf498000f 2870#define F0900_P1_CAR2S2_8_ALPH_E 0xf498000f
2800 2871
2801/*P1_ACLC2S216A*/ 2872/*P1_ACLC2S216A*/
2802#define R0900_P1_ACLC2S216A 0xf499 2873#define R0900_P1_ACLC2S216A 0xf499
2803#define F0900_P1_CAR2S2_16ADERAT 0xf4990040 2874#define ACLC2S216A REGx(R0900_P1_ACLC2S216A)
2804#define F0900_P1_CAR2S2_16A_ALPH_M 0xf4990030 2875#define F0900_P1_DIS_C3STOPA2 0xf4990080
2805#define F0900_P1_CAR2S2_16A_ALPH_E 0xf499000f 2876#define F0900_P1_CAR2S2_16ADERAT 0xf4990040
2877#define F0900_P1_CAR2S2_16A_ALPH_M 0xf4990030
2878#define F0900_P1_CAR2S2_16A_ALPH_E 0xf499000f
2806 2879
2807/*P1_ACLC2S232A*/ 2880/*P1_ACLC2S232A*/
2808#define R0900_P1_ACLC2S232A 0xf49a 2881#define R0900_P1_ACLC2S232A 0xf49a
2809#define F0900_P1_CAR2S2_32ADERAT 0xf49a0040 2882#define ACLC2S232A REGx(R0900_P1_ACLC2S232A)
2810#define F0900_P1_CAR2S2_32A_ALPH_M 0xf49a0030 2883#define F0900_P1_CAR2S2_32ADERAT 0xf49a0040
2811#define F0900_P1_CAR2S2_32A_ALPH_E 0xf49a000f 2884#define F0900_P1_CAR2S2_32A_ALPH_M 0xf49a0030
2885#define F0900_P1_CAR2S2_32A_ALPH_E 0xf49a000f
2812 2886
2813/*P1_BCLC2S2Q*/ 2887/*P1_BCLC2S2Q*/
2814#define R0900_P1_BCLC2S2Q 0xf49c 2888#define R0900_P1_BCLC2S2Q 0xf49c
2815#define F0900_P1_DVBS2S2Q_NIP 0xf49c0080 2889#define BCLC2S2Q REGx(R0900_P1_BCLC2S2Q)
2816#define F0900_P1_CAR2S2_QBDERAT 0xf49c0040 2890#define F0900_P1_CAR2S2_Q_BETA_M 0xf49c0030
2817#define F0900_P1_CAR2S2_Q_BETA_M 0xf49c0030 2891#define F0900_P1_CAR2S2_Q_BETA_E 0xf49c000f
2818#define F0900_P1_CAR2S2_Q_BETA_E 0xf49c000f
2819 2892
2820/*P1_BCLC2S28*/ 2893/*P1_BCLC2S28*/
2821#define R0900_P1_BCLC2S28 0xf49d 2894#define R0900_P1_BCLC2S28 0xf49d
2822#define F0900_P1_DVBS2S28_NIP 0xf49d0080 2895#define BCLC2S28 REGx(R0900_P1_BCLC2S28)
2823#define F0900_P1_CAR2S2_8BDERAT 0xf49d0040 2896#define F0900_P1_CAR2S2_8_BETA_M 0xf49d0030
2824#define F0900_P1_CAR2S2_8_BETA_M 0xf49d0030 2897#define F0900_P1_CAR2S2_8_BETA_E 0xf49d000f
2825#define F0900_P1_CAR2S2_8_BETA_E 0xf49d000f
2826 2898
2827/*P1_BCLC2S216A*/ 2899/*P1_BCLC2S216A*/
2828#define R0900_P1_BCLC2S216A 0xf49e 2900#define R0900_P1_BCLC2S216A 0xf49e
2829#define F0900_P1_DVBS2S216A_NIP 0xf49e0080 2901#define BCLC2S216A REGx(R0900_P1_BCLC2S216A)
2830#define F0900_P1_CAR2S2_16BDERAT 0xf49e0040
2831#define F0900_P1_CAR2S2_16A_BETA_M 0xf49e0030
2832#define F0900_P1_CAR2S2_16A_BETA_E 0xf49e000f
2833 2902
2834/*P1_BCLC2S232A*/ 2903/*P1_BCLC2S232A*/
2835#define R0900_P1_BCLC2S232A 0xf49f 2904#define R0900_P1_BCLC2S232A 0xf49f
2836#define F0900_P1_DVBS2S232A_NIP 0xf49f0080 2905#define BCLC2S232A REGx(R0900_P1_BCLC2S232A)
2837#define F0900_P1_CAR2S2_32BDERAT 0xf49f0040
2838#define F0900_P1_CAR2S2_32A_BETA_M 0xf49f0030
2839#define F0900_P1_CAR2S2_32A_BETA_E 0xf49f000f
2840 2906
2841/*P1_PLROOT2*/ 2907/*P1_PLROOT2*/
2842#define R0900_P1_PLROOT2 0xf4ac 2908#define R0900_P1_PLROOT2 0xf4ac
2843#define F0900_P1_SHORTFR_DISABLE 0xf4ac0080 2909#define PLROOT2 REGx(R0900_P1_PLROOT2)
2844#define F0900_P1_LONGFR_DISABLE 0xf4ac0040 2910#define F0900_P1_PLSCRAMB_MODE 0xf4ac000c
2845#define F0900_P1_DUMMYPL_DISABLE 0xf4ac0020 2911#define F0900_P1_PLSCRAMB_ROOT2 0xf4ac0003
2846#define F0900_P1_SHORTFR_AVOID 0xf4ac0010
2847#define F0900_P1_PLSCRAMB_MODE 0xf4ac000c
2848#define F0900_P1_PLSCRAMB_ROOT2 0xf4ac0003
2849 2912
2850/*P1_PLROOT1*/ 2913/*P1_PLROOT1*/
2851#define R0900_P1_PLROOT1 0xf4ad 2914#define R0900_P1_PLROOT1 0xf4ad
2852#define F0900_P1_PLSCRAMB_ROOT1 0xf4ad00ff 2915#define PLROOT1 REGx(R0900_P1_PLROOT1)
2916#define F0900_P1_PLSCRAMB_ROOT1 0xf4ad00ff
2853 2917
2854/*P1_PLROOT0*/ 2918/*P1_PLROOT0*/
2855#define R0900_P1_PLROOT0 0xf4ae 2919#define R0900_P1_PLROOT0 0xf4ae
2856#define F0900_P1_PLSCRAMB_ROOT0 0xf4ae00ff 2920#define PLROOT0 REGx(R0900_P1_PLROOT0)
2921#define F0900_P1_PLSCRAMB_ROOT0 0xf4ae00ff
2857 2922
2858/*P1_MODCODLST0*/ 2923/*P1_MODCODLST0*/
2859#define R0900_P1_MODCODLST0 0xf4b0 2924#define R0900_P1_MODCODLST0 0xf4b0
2860#define F0900_P1_EN_TOKEN31 0xf4b00080 2925#define MODCODLST0 REGx(R0900_P1_MODCODLST0)
2861#define F0900_P1_SYNCTAG_SELECT 0xf4b00040
2862#define F0900_P1_MODCODRQ_MODE 0xf4b00030
2863 2926
2864/*P1_MODCODLST1*/ 2927/*P1_MODCODLST1*/
2865#define R0900_P1_MODCODLST1 0xf4b1 2928#define R0900_P1_MODCODLST1 0xf4b1
2866#define F0900_P1_DIS_MODCOD29 0xf4b100f0 2929#define MODCODLST1 REGx(R0900_P1_MODCODLST1)
2867#define F0900_P1_DIS_32PSK_9_10 0xf4b1000f 2930#define F0900_P1_DIS_MODCOD29 0xf4b100f0
2931#define F0900_P1_DIS_32PSK_9_10 0xf4b1000f
2868 2932
2869/*P1_MODCODLST2*/ 2933/*P1_MODCODLST2*/
2870#define R0900_P1_MODCODLST2 0xf4b2 2934#define R0900_P1_MODCODLST2 0xf4b2
2871#define F0900_P1_DIS_32PSK_8_9 0xf4b200f0 2935#define MODCODLST2 REGx(R0900_P1_MODCODLST2)
2872#define F0900_P1_DIS_32PSK_5_6 0xf4b2000f 2936#define F0900_P1_DIS_32PSK_8_9 0xf4b200f0
2937#define F0900_P1_DIS_32PSK_5_6 0xf4b2000f
2873 2938
2874/*P1_MODCODLST3*/ 2939/*P1_MODCODLST3*/
2875#define R0900_P1_MODCODLST3 0xf4b3 2940#define R0900_P1_MODCODLST3 0xf4b3
2876#define F0900_P1_DIS_32PSK_4_5 0xf4b300f0 2941#define MODCODLST3 REGx(R0900_P1_MODCODLST3)
2877#define F0900_P1_DIS_32PSK_3_4 0xf4b3000f 2942#define F0900_P1_DIS_32PSK_4_5 0xf4b300f0
2943#define F0900_P1_DIS_32PSK_3_4 0xf4b3000f
2878 2944
2879/*P1_MODCODLST4*/ 2945/*P1_MODCODLST4*/
2880#define R0900_P1_MODCODLST4 0xf4b4 2946#define R0900_P1_MODCODLST4 0xf4b4
2881#define F0900_P1_DIS_16PSK_9_10 0xf4b400f0 2947#define MODCODLST4 REGx(R0900_P1_MODCODLST4)
2882#define F0900_P1_DIS_16PSK_8_9 0xf4b4000f 2948#define F0900_P1_DIS_16PSK_9_10 0xf4b400f0
2949#define F0900_P1_DIS_16PSK_8_9 0xf4b4000f
2883 2950
2884/*P1_MODCODLST5*/ 2951/*P1_MODCODLST5*/
2885#define R0900_P1_MODCODLST5 0xf4b5 2952#define R0900_P1_MODCODLST5 0xf4b5
2886#define F0900_P1_DIS_16PSK_5_6 0xf4b500f0 2953#define MODCODLST5 REGx(R0900_P1_MODCODLST5)
2887#define F0900_P1_DIS_16PSK_4_5 0xf4b5000f 2954#define F0900_P1_DIS_16PSK_5_6 0xf4b500f0
2955#define F0900_P1_DIS_16PSK_4_5 0xf4b5000f
2888 2956
2889/*P1_MODCODLST6*/ 2957/*P1_MODCODLST6*/
2890#define R0900_P1_MODCODLST6 0xf4b6 2958#define R0900_P1_MODCODLST6 0xf4b6
2891#define F0900_P1_DIS_16PSK_3_4 0xf4b600f0 2959#define MODCODLST6 REGx(R0900_P1_MODCODLST6)
2892#define F0900_P1_DIS_16PSK_2_3 0xf4b6000f 2960#define F0900_P1_DIS_16PSK_3_4 0xf4b600f0
2961#define F0900_P1_DIS_16PSK_2_3 0xf4b6000f
2893 2962
2894/*P1_MODCODLST7*/ 2963/*P1_MODCODLST7*/
2895#define R0900_P1_MODCODLST7 0xf4b7 2964#define R0900_P1_MODCODLST7 0xf4b7
2896#define F0900_P1_DIS_8P_9_10 0xf4b700f0 2965#define MODCODLST7 REGx(R0900_P1_MODCODLST7)
2897#define F0900_P1_DIS_8P_8_9 0xf4b7000f 2966#define F0900_P1_DIS_8P_9_10 0xf4b700f0
2967#define F0900_P1_DIS_8P_8_9 0xf4b7000f
2898 2968
2899/*P1_MODCODLST8*/ 2969/*P1_MODCODLST8*/
2900#define R0900_P1_MODCODLST8 0xf4b8 2970#define R0900_P1_MODCODLST8 0xf4b8
2901#define F0900_P1_DIS_8P_5_6 0xf4b800f0 2971#define MODCODLST8 REGx(R0900_P1_MODCODLST8)
2902#define F0900_P1_DIS_8P_3_4 0xf4b8000f 2972#define F0900_P1_DIS_8P_5_6 0xf4b800f0
2973#define F0900_P1_DIS_8P_3_4 0xf4b8000f
2903 2974
2904/*P1_MODCODLST9*/ 2975/*P1_MODCODLST9*/
2905#define R0900_P1_MODCODLST9 0xf4b9 2976#define R0900_P1_MODCODLST9 0xf4b9
2906#define F0900_P1_DIS_8P_2_3 0xf4b900f0 2977#define MODCODLST9 REGx(R0900_P1_MODCODLST9)
2907#define F0900_P1_DIS_8P_3_5 0xf4b9000f 2978#define F0900_P1_DIS_8P_2_3 0xf4b900f0
2979#define F0900_P1_DIS_8P_3_5 0xf4b9000f
2908 2980
2909/*P1_MODCODLSTA*/ 2981/*P1_MODCODLSTA*/
2910#define R0900_P1_MODCODLSTA 0xf4ba 2982#define R0900_P1_MODCODLSTA 0xf4ba
2911#define F0900_P1_DIS_QP_9_10 0xf4ba00f0 2983#define MODCODLSTA REGx(R0900_P1_MODCODLSTA)
2912#define F0900_P1_DIS_QP_8_9 0xf4ba000f 2984#define F0900_P1_DIS_QP_9_10 0xf4ba00f0
2985#define F0900_P1_DIS_QP_8_9 0xf4ba000f
2913 2986
2914/*P1_MODCODLSTB*/ 2987/*P1_MODCODLSTB*/
2915#define R0900_P1_MODCODLSTB 0xf4bb 2988#define R0900_P1_MODCODLSTB 0xf4bb
2916#define F0900_P1_DIS_QP_5_6 0xf4bb00f0 2989#define MODCODLSTB REGx(R0900_P1_MODCODLSTB)
2917#define F0900_P1_DIS_QP_4_5 0xf4bb000f 2990#define F0900_P1_DIS_QP_5_6 0xf4bb00f0
2991#define F0900_P1_DIS_QP_4_5 0xf4bb000f
2918 2992
2919/*P1_MODCODLSTC*/ 2993/*P1_MODCODLSTC*/
2920#define R0900_P1_MODCODLSTC 0xf4bc 2994#define R0900_P1_MODCODLSTC 0xf4bc
2921#define F0900_P1_DIS_QP_3_4 0xf4bc00f0 2995#define MODCODLSTC REGx(R0900_P1_MODCODLSTC)
2922#define F0900_P1_DIS_QP_2_3 0xf4bc000f 2996#define F0900_P1_DIS_QP_3_4 0xf4bc00f0
2997#define F0900_P1_DIS_QP_2_3 0xf4bc000f
2923 2998
2924/*P1_MODCODLSTD*/ 2999/*P1_MODCODLSTD*/
2925#define R0900_P1_MODCODLSTD 0xf4bd 3000#define R0900_P1_MODCODLSTD 0xf4bd
2926#define F0900_P1_DIS_QP_3_5 0xf4bd00f0 3001#define MODCODLSTD REGx(R0900_P1_MODCODLSTD)
2927#define F0900_P1_DIS_QP_1_2 0xf4bd000f 3002#define F0900_P1_DIS_QP_3_5 0xf4bd00f0
3003#define F0900_P1_DIS_QP_1_2 0xf4bd000f
2928 3004
2929/*P1_MODCODLSTE*/ 3005/*P1_MODCODLSTE*/
2930#define R0900_P1_MODCODLSTE 0xf4be 3006#define R0900_P1_MODCODLSTE 0xf4be
2931#define F0900_P1_DIS_QP_2_5 0xf4be00f0 3007#define MODCODLSTE REGx(R0900_P1_MODCODLSTE)
2932#define F0900_P1_DIS_QP_1_3 0xf4be000f 3008#define F0900_P1_DIS_QP_2_5 0xf4be00f0
3009#define F0900_P1_DIS_QP_1_3 0xf4be000f
2933 3010
2934/*P1_MODCODLSTF*/ 3011/*P1_MODCODLSTF*/
2935#define R0900_P1_MODCODLSTF 0xf4bf 3012#define R0900_P1_MODCODLSTF 0xf4bf
2936#define F0900_P1_DIS_QP_1_4 0xf4bf00f0 3013#define MODCODLSTF REGx(R0900_P1_MODCODLSTF)
2937#define F0900_P1_DDEMOD_SET 0xf4bf0002 3014#define F0900_P1_DIS_QP_1_4 0xf4bf00f0
2938#define F0900_P1_DDEMOD_MASK 0xf4bf0001 3015
3016/*P1_GAUSSR0*/
3017#define R0900_P1_GAUSSR0 0xf4c0
3018#define GAUSSR0 REGx(R0900_P1_GAUSSR0)
3019#define F0900_P1_EN_CCIMODE 0xf4c00080
3020#define F0900_P1_R0_GAUSSIEN 0xf4c0007f
3021
3022/*P1_CCIR0*/
3023#define R0900_P1_CCIR0 0xf4c1
3024#define CCIR0 REGx(R0900_P1_CCIR0)
3025#define F0900_P1_CCIDETECT_PLHONLY 0xf4c10080
3026#define F0900_P1_R0_CCI 0xf4c1007f
3027
3028/*P1_CCIQUANT*/
3029#define R0900_P1_CCIQUANT 0xf4c2
3030#define CCIQUANT REGx(R0900_P1_CCIQUANT)
3031#define F0900_P1_CCI_BETA 0xf4c200e0
3032#define F0900_P1_CCI_QUANT 0xf4c2001f
3033
3034/*P1_CCITHRES*/
3035#define R0900_P1_CCITHRES 0xf4c3
3036#define CCITHRES REGx(R0900_P1_CCITHRES)
3037#define F0900_P1_CCI_THRESHOLD 0xf4c300ff
3038
3039/*P1_CCIACC*/
3040#define R0900_P1_CCIACC 0xf4c4
3041#define CCIACC REGx(R0900_P1_CCIACC)
3042#define F0900_P1_CCI_VALUE 0xf4c400ff
2939 3043
2940/*P1_DMDRESCFG*/ 3044/*P1_DMDRESCFG*/
2941#define R0900_P1_DMDRESCFG 0xf4c6 3045#define R0900_P1_DMDRESCFG 0xf4c6
2942#define F0900_P1_DMDRES_RESET 0xf4c60080 3046#define DMDRESCFG REGx(R0900_P1_DMDRESCFG)
2943#define F0900_P1_DMDRES_NOISESQR 0xf4c60010 3047#define F0900_P1_DMDRES_RESET 0xf4c60080
2944#define F0900_P1_DMDRES_STRALL 0xf4c60008 3048#define F0900_P1_DMDRES_STRALL 0xf4c60008
2945#define F0900_P1_DMDRES_NEWONLY 0xf4c60004 3049#define F0900_P1_DMDRES_NEWONLY 0xf4c60004
2946#define F0900_P1_DMDRES_NOSTORE 0xf4c60002 3050#define F0900_P1_DMDRES_NOSTORE 0xf4c60002
2947#define F0900_P1_DMDRES_AGC2MEM 0xf4c60001
2948 3051
2949/*P1_DMDRESADR*/ 3052/*P1_DMDRESADR*/
2950#define R0900_P1_DMDRESADR 0xf4c7 3053#define R0900_P1_DMDRESADR 0xf4c7
2951#define F0900_P1_SUSP_PREDCANAL 0xf4c70080 3054#define DMDRESADR REGx(R0900_P1_DMDRESADR)
2952#define F0900_P1_DMDRES_VALIDCFR 0xf4c70040 3055#define F0900_P1_DMDRES_VALIDCFR 0xf4c70040
2953#define F0900_P1_DMDRES_MEMFULL 0xf4c70030 3056#define F0900_P1_DMDRES_MEMFULL 0xf4c70030
2954#define F0900_P1_DMDRES_RESNBR 0xf4c7000f 3057#define F0900_P1_DMDRES_RESNBR 0xf4c7000f
2955 3058
2956/*P1_DMDRESDATA7*/ 3059/*P1_DMDRESDATA7*/
2957#define R0900_P1_DMDRESDATA7 0xf4c8 3060#define R0900_P1_DMDRESDATA7 0xf4c8
2958#define F0900_P1_DMDRES_DATA7 0xf4c800ff 3061#define F0900_P1_DMDRES_DATA7 0xf4c800ff
2959 3062
2960/*P1_DMDRESDATA6*/ 3063/*P1_DMDRESDATA6*/
2961#define R0900_P1_DMDRESDATA6 0xf4c9 3064#define R0900_P1_DMDRESDATA6 0xf4c9
2962#define F0900_P1_DMDRES_DATA6 0xf4c900ff 3065#define F0900_P1_DMDRES_DATA6 0xf4c900ff
2963 3066
2964/*P1_DMDRESDATA5*/ 3067/*P1_DMDRESDATA5*/
2965#define R0900_P1_DMDRESDATA5 0xf4ca 3068#define R0900_P1_DMDRESDATA5 0xf4ca
2966#define F0900_P1_DMDRES_DATA5 0xf4ca00ff 3069#define F0900_P1_DMDRES_DATA5 0xf4ca00ff
2967 3070
2968/*P1_DMDRESDATA4*/ 3071/*P1_DMDRESDATA4*/
2969#define R0900_P1_DMDRESDATA4 0xf4cb 3072#define R0900_P1_DMDRESDATA4 0xf4cb
2970#define F0900_P1_DMDRES_DATA4 0xf4cb00ff 3073#define F0900_P1_DMDRES_DATA4 0xf4cb00ff
2971 3074
2972/*P1_DMDRESDATA3*/ 3075/*P1_DMDRESDATA3*/
2973#define R0900_P1_DMDRESDATA3 0xf4cc 3076#define R0900_P1_DMDRESDATA3 0xf4cc
2974#define F0900_P1_DMDRES_DATA3 0xf4cc00ff 3077#define F0900_P1_DMDRES_DATA3 0xf4cc00ff
2975 3078
2976/*P1_DMDRESDATA2*/ 3079/*P1_DMDRESDATA2*/
2977#define R0900_P1_DMDRESDATA2 0xf4cd 3080#define R0900_P1_DMDRESDATA2 0xf4cd
2978#define F0900_P1_DMDRES_DATA2 0xf4cd00ff 3081#define F0900_P1_DMDRES_DATA2 0xf4cd00ff
2979 3082
2980/*P1_DMDRESDATA1*/ 3083/*P1_DMDRESDATA1*/
2981#define R0900_P1_DMDRESDATA1 0xf4ce 3084#define R0900_P1_DMDRESDATA1 0xf4ce
2982#define F0900_P1_DMDRES_DATA1 0xf4ce00ff 3085#define F0900_P1_DMDRES_DATA1 0xf4ce00ff
2983 3086
2984/*P1_DMDRESDATA0*/ 3087/*P1_DMDRESDATA0*/
2985#define R0900_P1_DMDRESDATA0 0xf4cf 3088#define R0900_P1_DMDRESDATA0 0xf4cf
2986#define F0900_P1_DMDRES_DATA0 0xf4cf00ff 3089#define F0900_P1_DMDRES_DATA0 0xf4cf00ff
2987 3090
2988/*P1_FFEI1*/ 3091/*P1_FFEI1*/
2989#define R0900_P1_FFEI1 0xf4d0 3092#define R0900_P1_FFEI1 0xf4d0
2990#define F0900_P1_FFE_ACCI1 0xf4d001ff 3093#define FFEI1 REGx(R0900_P1_FFEI1)
3094#define F0900_P1_FFE_ACCI1 0xf4d001ff
2991 3095
2992/*P1_FFEQ1*/ 3096/*P1_FFEQ1*/
2993#define R0900_P1_FFEQ1 0xf4d1 3097#define R0900_P1_FFEQ1 0xf4d1
2994#define F0900_P1_FFE_ACCQ1 0xf4d101ff 3098#define FFEQ1 REGx(R0900_P1_FFEQ1)
3099#define F0900_P1_FFE_ACCQ1 0xf4d101ff
2995 3100
2996/*P1_FFEI2*/ 3101/*P1_FFEI2*/
2997#define R0900_P1_FFEI2 0xf4d2 3102#define R0900_P1_FFEI2 0xf4d2
2998#define F0900_P1_FFE_ACCI2 0xf4d201ff 3103#define FFEI2 REGx(R0900_P1_FFEI2)
3104#define F0900_P1_FFE_ACCI2 0xf4d201ff
2999 3105
3000/*P1_FFEQ2*/ 3106/*P1_FFEQ2*/
3001#define R0900_P1_FFEQ2 0xf4d3 3107#define R0900_P1_FFEQ2 0xf4d3
3002#define F0900_P1_FFE_ACCQ2 0xf4d301ff 3108#define FFEQ2 REGx(R0900_P1_FFEQ2)
3109#define F0900_P1_FFE_ACCQ2 0xf4d301ff
3003 3110
3004/*P1_FFEI3*/ 3111/*P1_FFEI3*/
3005#define R0900_P1_FFEI3 0xf4d4 3112#define R0900_P1_FFEI3 0xf4d4
3006#define F0900_P1_FFE_ACCI3 0xf4d401ff 3113#define FFEI3 REGx(R0900_P1_FFEI3)
3114#define F0900_P1_FFE_ACCI3 0xf4d401ff
3007 3115
3008/*P1_FFEQ3*/ 3116/*P1_FFEQ3*/
3009#define R0900_P1_FFEQ3 0xf4d5 3117#define R0900_P1_FFEQ3 0xf4d5
3010#define F0900_P1_FFE_ACCQ3 0xf4d501ff 3118#define FFEQ3 REGx(R0900_P1_FFEQ3)
3119#define F0900_P1_FFE_ACCQ3 0xf4d501ff
3011 3120
3012/*P1_FFEI4*/ 3121/*P1_FFEI4*/
3013#define R0900_P1_FFEI4 0xf4d6 3122#define R0900_P1_FFEI4 0xf4d6
3014#define F0900_P1_FFE_ACCI4 0xf4d601ff 3123#define FFEI4 REGx(R0900_P1_FFEI4)
3124#define F0900_P1_FFE_ACCI4 0xf4d601ff
3015 3125
3016/*P1_FFEQ4*/ 3126/*P1_FFEQ4*/
3017#define R0900_P1_FFEQ4 0xf4d7 3127#define R0900_P1_FFEQ4 0xf4d7
3018#define F0900_P1_FFE_ACCQ4 0xf4d701ff 3128#define FFEQ4 REGx(R0900_P1_FFEQ4)
3129#define F0900_P1_FFE_ACCQ4 0xf4d701ff
3019 3130
3020/*P1_FFECFG*/ 3131/*P1_FFECFG*/
3021#define R0900_P1_FFECFG 0xf4d8 3132#define R0900_P1_FFECFG 0xf4d8
3022#define F0900_P1_EQUALFFE_ON 0xf4d80040 3133#define FFECFG REGx(R0900_P1_FFECFG)
3023#define F0900_P1_EQUAL_USEDSYMB 0xf4d80030 3134#define F0900_P1_EQUALFFE_ON 0xf4d80040
3024#define F0900_P1_MU_EQUALFFE 0xf4d80007 3135#define F0900_P1_MU_EQUALFFE 0xf4d80007
3025 3136
3026/*P1_TNRCFG*/ 3137/*P1_TNRCFG*/
3027#define R0900_P1_TNRCFG 0xf4e0 3138#define R0900_P1_TNRCFG 0xf4e0
3028#define F0900_P1_TUN_ACKFAIL 0xf4e00080 3139#define TNRCFG REGx(R0900_P1_TNRCFG)
3029#define F0900_P1_TUN_TYPE 0xf4e00070 3140#define F0900_P1_TUN_ACKFAIL 0xf4e00080
3030#define F0900_P1_TUN_SECSTOP 0xf4e00008 3141#define F0900_P1_TUN_TYPE 0xf4e00070
3031#define F0900_P1_TUN_VCOSRCH 0xf4e00004 3142#define F0900_P1_TUN_SECSTOP 0xf4e00008
3032#define F0900_P1_TUN_MADDRESS 0xf4e00003 3143#define F0900_P1_TUN_VCOSRCH 0xf4e00004
3144#define F0900_P1_TUN_MADDRESS 0xf4e00003
3033 3145
3034/*P1_TNRCFG2*/ 3146/*P1_TNRCFG2*/
3035#define R0900_P1_TNRCFG2 0xf4e1 3147#define R0900_P1_TNRCFG2 0xf4e1
3036#define F0900_P1_TUN_IQSWAP 0xf4e10080 3148#define TNRCFG2 REGx(R0900_P1_TNRCFG2)
3037#define F0900_P1_STB6110_STEP2MHZ 0xf4e10040 3149#define F0900_P1_TUN_IQSWAP 0xf4e10080
3038#define F0900_P1_STB6120_DBLI2C 0xf4e10020 3150#define F0900_P1_DIS_BWCALC 0xf4e10004
3039#define F0900_P1_DIS_FCCK 0xf4e10010 3151#define F0900_P1_SHORT_WAITSTATES 0xf4e10002
3040#define F0900_P1_DIS_LPEN 0xf4e10008
3041#define F0900_P1_DIS_BWCALC 0xf4e10004
3042#define F0900_P1_SHORT_WAITSTATES 0xf4e10002
3043#define F0900_P1_DIS_2BWAGC1 0xf4e10001
3044 3152
3045/*P1_TNRXTAL*/ 3153/*P1_TNRXTAL*/
3046#define R0900_P1_TNRXTAL 0xf4e4 3154#define R0900_P1_TNRXTAL 0xf4e4
3047#define F0900_P1_TUN_MCLKDECIMAL 0xf4e400e0 3155#define TNRXTAL REGx(R0900_P1_TNRXTAL)
3048#define F0900_P1_TUN_XTALFREQ 0xf4e4001f 3156#define F0900_P1_TUN_XTALFREQ 0xf4e4001f
3049 3157
3050/*P1_TNRSTEPS*/ 3158/*P1_TNRSTEPS*/
3051#define R0900_P1_TNRSTEPS 0xf4e7 3159#define R0900_P1_TNRSTEPS 0xf4e7
3052#define F0900_P1_TUNER_BW1P6 0xf4e70080 3160#define TNRSTEPS REGx(R0900_P1_TNRSTEPS)
3053#define F0900_P1_BWINC_OFFSET 0xf4e70070 3161#define F0900_P1_TUNER_BW0P125 0xf4e70080
3054#define F0900_P1_SOFTSTEP_RNG 0xf4e70008 3162#define F0900_P1_BWINC_OFFSET 0xf4e70170
3055#define F0900_P1_TUN_BWOFFSET 0xf4e70107 3163#define F0900_P1_SOFTSTEP_RNG 0xf4e70008
3164#define F0900_P1_TUN_BWOFFSET 0xf4e70007
3056 3165
3057/*P1_TNRGAIN*/ 3166/*P1_TNRGAIN*/
3058#define R0900_P1_TNRGAIN 0xf4e8 3167#define R0900_P1_TNRGAIN 0xf4e8
3059#define F0900_P1_TUN_KDIVEN 0xf4e800c0 3168#define TNRGAIN REGx(R0900_P1_TNRGAIN)
3060#define F0900_P1_STB6X00_OCK 0xf4e80030 3169#define F0900_P1_TUN_KDIVEN 0xf4e800c0
3061#define F0900_P1_TUN_GAIN 0xf4e8000f 3170#define F0900_P1_STB6X00_OCK 0xf4e80030
3171#define F0900_P1_TUN_GAIN 0xf4e8000f
3062 3172
3063/*P1_TNRRF1*/ 3173/*P1_TNRRF1*/
3064#define R0900_P1_TNRRF1 0xf4e9 3174#define R0900_P1_TNRRF1 0xf4e9
3065#define F0900_P1_TUN_RFFREQ2 0xf4e900ff 3175#define TNRRF1 REGx(R0900_P1_TNRRF1)
3176#define F0900_P1_TUN_RFFREQ2 0xf4e900ff
3177#define TUN_RFFREQ2 FLDx(F0900_P1_TUN_RFFREQ2)
3066 3178
3067/*P1_TNRRF0*/ 3179/*P1_TNRRF0*/
3068#define R0900_P1_TNRRF0 0xf4ea 3180#define R0900_P1_TNRRF0 0xf4ea
3069#define F0900_P1_TUN_RFFREQ1 0xf4ea00ff 3181#define TNRRF0 REGx(R0900_P1_TNRRF0)
3182#define F0900_P1_TUN_RFFREQ1 0xf4ea00ff
3183#define TUN_RFFREQ1 FLDx(F0900_P1_TUN_RFFREQ1)
3070 3184
3071/*P1_TNRBW*/ 3185/*P1_TNRBW*/
3072#define R0900_P1_TNRBW 0xf4eb 3186#define R0900_P1_TNRBW 0xf4eb
3073#define F0900_P1_TUN_RFFREQ0 0xf4eb00c0 3187#define TNRBW REGx(R0900_P1_TNRBW)
3074#define F0900_P1_TUN_BW 0xf4eb003f 3188#define F0900_P1_TUN_RFFREQ0 0xf4eb00c0
3189#define TUN_RFFREQ0 FLDx(F0900_P1_TUN_RFFREQ0)
3190#define F0900_P1_TUN_BW 0xf4eb003f
3191#define TUN_BW FLDx(F0900_P1_TUN_BW)
3075 3192
3076/*P1_TNRADJ*/ 3193/*P1_TNRADJ*/
3077#define R0900_P1_TNRADJ 0xf4ec 3194#define R0900_P1_TNRADJ 0xf4ec
3078#define F0900_P1_STB61X0_RCLK 0xf4ec0080 3195#define TNRADJ REGx(R0900_P1_TNRADJ)
3079#define F0900_P1_STB61X0_CALTIME 0xf4ec0040 3196#define F0900_P1_STB61X0_CALTIME 0xf4ec0040
3080#define F0900_P1_STB6X00_DLB 0xf4ec0038
3081#define F0900_P1_STB6000_FCL 0xf4ec0007
3082 3197
3083/*P1_TNRCTL2*/ 3198/*P1_TNRCTL2*/
3084#define R0900_P1_TNRCTL2 0xf4ed 3199#define R0900_P1_TNRCTL2 0xf4ed
3085#define F0900_P1_STB61X0_LCP1_RCCKOFF 0xf4ed0080 3200#define TNRCTL2 REGx(R0900_P1_TNRCTL2)
3086#define F0900_P1_STB61X0_LCP0 0xf4ed0040 3201#define F0900_P1_STB61X0_RCCKOFF 0xf4ed0080
3087#define F0900_P1_STB61X0_XTOUT_RFOUTS 0xf4ed0020 3202#define F0900_P1_STB61X0_ICP_SDOFF 0xf4ed0040
3088#define F0900_P1_STB61X0_XTON_MCKDV 0xf4ed0010 3203#define F0900_P1_STB61X0_DCLOOPOFF 0xf4ed0020
3089#define F0900_P1_STB61X0_CALOFF_DCOFF 0xf4ed0008 3204#define F0900_P1_STB61X0_REFOUTSEL 0xf4ed0010
3090#define F0900_P1_STB6110_LPT 0xf4ed0004 3205#define F0900_P1_STB61X0_CALOFF 0xf4ed0008
3091#define F0900_P1_STB6110_RX 0xf4ed0002 3206#define F0900_P1_STB6XX0_LPT_BEN 0xf4ed0004
3092#define F0900_P1_STB6110_SYN 0xf4ed0001 3207#define F0900_P1_STB6XX0_RX_OSCP 0xf4ed0002
3208#define F0900_P1_STB6XX0_SYN 0xf4ed0001
3093 3209
3094/*P1_TNRCFG3*/ 3210/*P1_TNRCFG3*/
3095#define R0900_P1_TNRCFG3 0xf4ee 3211#define R0900_P1_TNRCFG3 0xf4ee
3096#define F0900_P1_STB6120_DISCTRL1 0xf4ee0080 3212#define TNRCFG3 REGx(R0900_P1_TNRCFG3)
3097#define F0900_P1_STB6120_INVORDER 0xf4ee0040 3213#define F0900_P1_TUN_PLLFREQ 0xf4ee001c
3098#define F0900_P1_STB6120_ENCTRL6 0xf4ee0020 3214#define F0900_P1_TUN_I2CFREQ_MODE 0xf4ee0003
3099#define F0900_P1_TUN_PLLFREQ 0xf4ee001c
3100#define F0900_P1_TUN_I2CFREQ_MODE 0xf4ee0003
3101 3215
3102/*P1_TNRLAUNCH*/ 3216/*P1_TNRLAUNCH*/
3103#define R0900_P1_TNRLAUNCH 0xf4f0 3217#define R0900_P1_TNRLAUNCH 0xf4f0
3218#define TNRLAUNCH REGx(R0900_P1_TNRLAUNCH)
3104 3219
3105/*P1_TNRLD*/ 3220/*P1_TNRLD*/
3106#define R0900_P1_TNRLD 0xf4f0 3221#define R0900_P1_TNRLD 0xf4f0
3107#define F0900_P1_TUNLD_VCOING 0xf4f00080 3222#define TNRLD REGx(R0900_P1_TNRLD)
3108#define F0900_P1_TUN_REG1FAIL 0xf4f00040 3223#define F0900_P1_TUNLD_VCOING 0xf4f00080
3109#define F0900_P1_TUN_REG2FAIL 0xf4f00020 3224#define F0900_P1_TUN_REG1FAIL 0xf4f00040
3110#define F0900_P1_TUN_REG3FAIL 0xf4f00010 3225#define F0900_P1_TUN_REG2FAIL 0xf4f00020
3111#define F0900_P1_TUN_REG4FAIL 0xf4f00008 3226#define F0900_P1_TUN_REG3FAIL 0xf4f00010
3112#define F0900_P1_TUN_REG5FAIL 0xf4f00004 3227#define F0900_P1_TUN_REG4FAIL 0xf4f00008
3113#define F0900_P1_TUN_BWING 0xf4f00002 3228#define F0900_P1_TUN_REG5FAIL 0xf4f00004
3114#define F0900_P1_TUN_LOCKED 0xf4f00001 3229#define F0900_P1_TUN_BWING 0xf4f00002
3230#define F0900_P1_TUN_LOCKED 0xf4f00001
3115 3231
3116/*P1_TNROBSL*/ 3232/*P1_TNROBSL*/
3117#define R0900_P1_TNROBSL 0xf4f6 3233#define R0900_P1_TNROBSL 0xf4f6
3118#define F0900_P1_TUN_I2CABORTED 0xf4f60080 3234#define TNROBSL REGx(R0900_P1_TNROBSL)
3119#define F0900_P1_TUN_LPEN 0xf4f60040 3235#define F0900_P1_TUN_I2CABORTED 0xf4f60080
3120#define F0900_P1_TUN_FCCK 0xf4f60020 3236#define F0900_P1_TUN_LPEN 0xf4f60040
3121#define F0900_P1_TUN_I2CLOCKED 0xf4f60010 3237#define F0900_P1_TUN_FCCK 0xf4f60020
3122#define F0900_P1_TUN_PROGDONE 0xf4f6000c 3238#define F0900_P1_TUN_I2CLOCKED 0xf4f60010
3123#define F0900_P1_TUN_RFRESTE1 0xf4f60003 3239#define F0900_P1_TUN_PROGDONE 0xf4f6000c
3240#define F0900_P1_TUN_RFRESTE1 0xf4f60003
3241#define TUN_RFRESTE1 FLDx(F0900_P1_TUN_RFRESTE1)
3124 3242
3125/*P1_TNRRESTE*/ 3243/*P1_TNRRESTE*/
3126#define R0900_P1_TNRRESTE 0xf4f7 3244#define R0900_P1_TNRRESTE 0xf4f7
3127#define F0900_P1_TUN_RFRESTE0 0xf4f700ff 3245#define TNRRESTE REGx(R0900_P1_TNRRESTE)
3246#define F0900_P1_TUN_RFRESTE0 0xf4f700ff
3247#define TUN_RFRESTE0 FLDx(F0900_P1_TUN_RFRESTE0)
3128 3248
3129/*P1_SMAPCOEF7*/ 3249/*P1_SMAPCOEF7*/
3130#define R0900_P1_SMAPCOEF7 0xf500 3250#define R0900_P1_SMAPCOEF7 0xf500
3131#define F0900_P1_DIS_QSCALE 0xf5000080 3251#define SMAPCOEF7 REGx(R0900_P1_SMAPCOEF7)
3132#define F0900_P1_SMAPCOEF_Q_LLR12 0xf500017f 3252#define F0900_P1_DIS_QSCALE 0xf5000080
3253#define F0900_P1_SMAPCOEF_Q_LLR12 0xf500017f
3133 3254
3134/*P1_SMAPCOEF6*/ 3255/*P1_SMAPCOEF6*/
3135#define R0900_P1_SMAPCOEF6 0xf501 3256#define R0900_P1_SMAPCOEF6 0xf501
3136#define F0900_P1_DIS_NEWSCALE 0xf5010008 3257#define SMAPCOEF6 REGx(R0900_P1_SMAPCOEF6)
3137#define F0900_P1_ADJ_8PSKLLR1 0xf5010004 3258#define F0900_P1_ADJ_8PSKLLR1 0xf5010004
3138#define F0900_P1_OLD_8PSKLLR1 0xf5010002 3259#define F0900_P1_OLD_8PSKLLR1 0xf5010002
3139#define F0900_P1_DIS_AB8PSK 0xf5010001 3260#define F0900_P1_DIS_AB8PSK 0xf5010001
3140 3261
3141/*P1_SMAPCOEF5*/ 3262/*P1_SMAPCOEF5*/
3142#define R0900_P1_SMAPCOEF5 0xf502 3263#define R0900_P1_SMAPCOEF5 0xf502
3143#define F0900_P1_DIS_8SCALE 0xf5020080 3264#define SMAPCOEF5 REGx(R0900_P1_SMAPCOEF5)
3144#define F0900_P1_SMAPCOEF_8P_LLR23 0xf502017f 3265#define F0900_P1_DIS_8SCALE 0xf5020080
3266#define F0900_P1_SMAPCOEF_8P_LLR23 0xf502017f
3267
3268/*P1_NCO2MAX1*/
3269#define R0900_P1_NCO2MAX1 0xf514
3270#define NCO2MAX1 REGx(R0900_P1_NCO2MAX1)
3271#define F0900_P1_TETA2_MAXVABS1 0xf51400ff
3272
3273/*P1_NCO2MAX0*/
3274#define R0900_P1_NCO2MAX0 0xf515
3275#define NCO2MAX0 REGx(R0900_P1_NCO2MAX0)
3276#define F0900_P1_TETA2_MAXVABS0 0xf51500ff
3277
3278/*P1_NCO2FR1*/
3279#define R0900_P1_NCO2FR1 0xf516
3280#define NCO2FR1 REGx(R0900_P1_NCO2FR1)
3281#define F0900_P1_NCO2FINAL_ANGLE1 0xf51600ff
3282
3283/*P1_NCO2FR0*/
3284#define R0900_P1_NCO2FR0 0xf517
3285#define NCO2FR0 REGx(R0900_P1_NCO2FR0)
3286#define F0900_P1_NCO2FINAL_ANGLE0 0xf51700ff
3287
3288/*P1_CFR2AVRGE1*/
3289#define R0900_P1_CFR2AVRGE1 0xf518
3290#define CFR2AVRGE1 REGx(R0900_P1_CFR2AVRGE1)
3291#define F0900_P1_I2C_CFR2AVERAGE1 0xf51800ff
3292
3293/*P1_CFR2AVRGE0*/
3294#define R0900_P1_CFR2AVRGE0 0xf519
3295#define CFR2AVRGE0 REGx(R0900_P1_CFR2AVRGE0)
3296#define F0900_P1_I2C_CFR2AVERAGE0 0xf51900ff
3145 3297
3146/*P1_DMDPLHSTAT*/ 3298/*P1_DMDPLHSTAT*/
3147#define R0900_P1_DMDPLHSTAT 0xf520 3299#define R0900_P1_DMDPLHSTAT 0xf520
3148#define F0900_P1_PLH_STATISTIC 0xf52000ff 3300#define DMDPLHSTAT REGx(R0900_P1_DMDPLHSTAT)
3301#define F0900_P1_PLH_STATISTIC 0xf52000ff
3149 3302
3150/*P1_LOCKTIME3*/ 3303/*P1_LOCKTIME3*/
3151#define R0900_P1_LOCKTIME3 0xf522 3304#define R0900_P1_LOCKTIME3 0xf522
3152#define F0900_P1_DEMOD_LOCKTIME3 0xf52200ff 3305#define LOCKTIME3 REGx(R0900_P1_LOCKTIME3)
3306#define F0900_P1_DEMOD_LOCKTIME3 0xf52200ff
3153 3307
3154/*P1_LOCKTIME2*/ 3308/*P1_LOCKTIME2*/
3155#define R0900_P1_LOCKTIME2 0xf523 3309#define R0900_P1_LOCKTIME2 0xf523
3156#define F0900_P1_DEMOD_LOCKTIME2 0xf52300ff 3310#define LOCKTIME2 REGx(R0900_P1_LOCKTIME2)
3311#define F0900_P1_DEMOD_LOCKTIME2 0xf52300ff
3157 3312
3158/*P1_LOCKTIME1*/ 3313/*P1_LOCKTIME1*/
3159#define R0900_P1_LOCKTIME1 0xf524 3314#define R0900_P1_LOCKTIME1 0xf524
3160#define F0900_P1_DEMOD_LOCKTIME1 0xf52400ff 3315#define LOCKTIME1 REGx(R0900_P1_LOCKTIME1)
3316#define F0900_P1_DEMOD_LOCKTIME1 0xf52400ff
3161 3317
3162/*P1_LOCKTIME0*/ 3318/*P1_LOCKTIME0*/
3163#define R0900_P1_LOCKTIME0 0xf525 3319#define R0900_P1_LOCKTIME0 0xf525
3164#define F0900_P1_DEMOD_LOCKTIME0 0xf52500ff 3320#define LOCKTIME0 REGx(R0900_P1_LOCKTIME0)
3321#define F0900_P1_DEMOD_LOCKTIME0 0xf52500ff
3165 3322
3166/*P1_VITSCALE*/ 3323/*P1_VITSCALE*/
3167#define R0900_P1_VITSCALE 0xf532 3324#define R0900_P1_VITSCALE 0xf532
3168#define F0900_P1_NVTH_NOSRANGE 0xf5320080 3325#define VITSCALE REGx(R0900_P1_VITSCALE)
3169#define F0900_P1_VERROR_MAXMODE 0xf5320040 3326#define F0900_P1_NVTH_NOSRANGE 0xf5320080
3170#define F0900_P1_KDIV_MODE 0xf5320030 3327#define F0900_P1_VERROR_MAXMODE 0xf5320040
3171#define F0900_P1_NSLOWSN_LOCKED 0xf5320008 3328#define F0900_P1_NSLOWSN_LOCKED 0xf5320008
3172#define F0900_P1_DELOCK_PRFLOSS 0xf5320004 3329#define F0900_P1_DIS_RSFLOCK 0xf5320002
3173#define F0900_P1_DIS_RSFLOCK 0xf5320002
3174 3330
3175/*P1_FECM*/ 3331/*P1_FECM*/
3176#define R0900_P1_FECM 0xf533 3332#define R0900_P1_FECM 0xf533
3177#define F0900_P1_DSS_DVB 0xf5330080 3333#define FECM REGx(R0900_P1_FECM)
3178#define F0900_P1_DEMOD_BYPASS 0xf5330040 3334#define F0900_P1_DSS_DVB 0xf5330080
3179#define F0900_P1_CMP_SLOWMODE 0xf5330020 3335#define DSS_DVB FLDx(F0900_P1_DSS_DVB)
3180#define F0900_P1_DSS_SRCH 0xf5330010 3336#define F0900_P1_DSS_SRCH 0xf5330010
3181#define F0900_P1_DIFF_MODEVIT 0xf5330004 3337#define F0900_P1_SYNCVIT 0xf5330002
3182#define F0900_P1_SYNCVIT 0xf5330002 3338#define F0900_P1_IQINV 0xf5330001
3183#define F0900_P1_IQINV 0xf5330001 3339#define IQINV FLDx(F0900_P1_IQINV)
3184 3340
3185/*P1_VTH12*/ 3341/*P1_VTH12*/
3186#define R0900_P1_VTH12 0xf534 3342#define R0900_P1_VTH12 0xf534
3187#define F0900_P1_VTH12 0xf53400ff 3343#define VTH12 REGx(R0900_P1_VTH12)
3344#define F0900_P1_VTH12 0xf53400ff
3188 3345
3189/*P1_VTH23*/ 3346/*P1_VTH23*/
3190#define R0900_P1_VTH23 0xf535 3347#define R0900_P1_VTH23 0xf535
3191#define F0900_P1_VTH23 0xf53500ff 3348#define VTH23 REGx(R0900_P1_VTH23)
3349#define F0900_P1_VTH23 0xf53500ff
3192 3350
3193/*P1_VTH34*/ 3351/*P1_VTH34*/
3194#define R0900_P1_VTH34 0xf536 3352#define R0900_P1_VTH34 0xf536
3195#define F0900_P1_VTH34 0xf53600ff 3353#define VTH34 REGx(R0900_P1_VTH34)
3354#define F0900_P1_VTH34 0xf53600ff
3196 3355
3197/*P1_VTH56*/ 3356/*P1_VTH56*/
3198#define R0900_P1_VTH56 0xf537 3357#define R0900_P1_VTH56 0xf537
3199#define F0900_P1_VTH56 0xf53700ff 3358#define VTH56 REGx(R0900_P1_VTH56)
3359#define F0900_P1_VTH56 0xf53700ff
3200 3360
3201/*P1_VTH67*/ 3361/*P1_VTH67*/
3202#define R0900_P1_VTH67 0xf538 3362#define R0900_P1_VTH67 0xf538
3203#define F0900_P1_VTH67 0xf53800ff 3363#define VTH67 REGx(R0900_P1_VTH67)
3364#define F0900_P1_VTH67 0xf53800ff
3204 3365
3205/*P1_VTH78*/ 3366/*P1_VTH78*/
3206#define R0900_P1_VTH78 0xf539 3367#define R0900_P1_VTH78 0xf539
3207#define F0900_P1_VTH78 0xf53900ff 3368#define VTH78 REGx(R0900_P1_VTH78)
3369#define F0900_P1_VTH78 0xf53900ff
3208 3370
3209/*P1_VITCURPUN*/ 3371/*P1_VITCURPUN*/
3210#define R0900_P1_VITCURPUN 0xf53a 3372#define R0900_P1_VITCURPUN 0xf53a
3211#define F0900_P1_VIT_MAPPING 0xf53a00e0 3373#define VITCURPUN REGx(R0900_P1_VITCURPUN)
3212#define F0900_P1_VIT_CURPUN 0xf53a001f 3374#define F0900_P1_VIT_CURPUN 0xf53a001f
3375#define VIT_CURPUN FLDx(F0900_P1_VIT_CURPUN)
3213 3376
3214/*P1_VERROR*/ 3377/*P1_VERROR*/
3215#define R0900_P1_VERROR 0xf53b 3378#define R0900_P1_VERROR 0xf53b
3216#define F0900_P1_REGERR_VIT 0xf53b00ff 3379#define VERROR REGx(R0900_P1_VERROR)
3380#define F0900_P1_REGERR_VIT 0xf53b00ff
3217 3381
3218/*P1_PRVIT*/ 3382/*P1_PRVIT*/
3219#define R0900_P1_PRVIT 0xf53c 3383#define R0900_P1_PRVIT 0xf53c
3220#define F0900_P1_DIS_VTHLOCK 0xf53c0040 3384#define PRVIT REGx(R0900_P1_PRVIT)
3221#define F0900_P1_E7_8VIT 0xf53c0020 3385#define F0900_P1_DIS_VTHLOCK 0xf53c0040
3222#define F0900_P1_E6_7VIT 0xf53c0010 3386#define F0900_P1_E7_8VIT 0xf53c0020
3223#define F0900_P1_E5_6VIT 0xf53c0008 3387#define F0900_P1_E6_7VIT 0xf53c0010
3224#define F0900_P1_E3_4VIT 0xf53c0004 3388#define F0900_P1_E5_6VIT 0xf53c0008
3225#define F0900_P1_E2_3VIT 0xf53c0002 3389#define F0900_P1_E3_4VIT 0xf53c0004
3226#define F0900_P1_E1_2VIT 0xf53c0001 3390#define F0900_P1_E2_3VIT 0xf53c0002
3391#define F0900_P1_E1_2VIT 0xf53c0001
3227 3392
3228/*P1_VAVSRVIT*/ 3393/*P1_VAVSRVIT*/
3229#define R0900_P1_VAVSRVIT 0xf53d 3394#define R0900_P1_VAVSRVIT 0xf53d
3230#define F0900_P1_AMVIT 0xf53d0080 3395#define VAVSRVIT REGx(R0900_P1_VAVSRVIT)
3231#define F0900_P1_FROZENVIT 0xf53d0040 3396#define F0900_P1_AMVIT 0xf53d0080
3232#define F0900_P1_SNVIT 0xf53d0030 3397#define F0900_P1_FROZENVIT 0xf53d0040
3233#define F0900_P1_TOVVIT 0xf53d000c 3398#define F0900_P1_SNVIT 0xf53d0030
3234#define F0900_P1_HYPVIT 0xf53d0003 3399#define F0900_P1_TOVVIT 0xf53d000c
3400#define F0900_P1_HYPVIT 0xf53d0003
3235 3401
3236/*P1_VSTATUSVIT*/ 3402/*P1_VSTATUSVIT*/
3237#define R0900_P1_VSTATUSVIT 0xf53e 3403#define R0900_P1_VSTATUSVIT 0xf53e
3238#define F0900_P1_VITERBI_ON 0xf53e0080 3404#define VSTATUSVIT REGx(R0900_P1_VSTATUSVIT)
3239#define F0900_P1_END_LOOPVIT 0xf53e0040 3405#define F0900_P1_PRFVIT 0xf53e0010
3240#define F0900_P1_VITERBI_DEPRF 0xf53e0020 3406#define PRFVIT FLDx(F0900_P1_PRFVIT)
3241#define F0900_P1_PRFVIT 0xf53e0010 3407#define F0900_P1_LOCKEDVIT 0xf53e0008
3242#define F0900_P1_LOCKEDVIT 0xf53e0008 3408#define LOCKEDVIT FLDx(F0900_P1_LOCKEDVIT)
3243#define F0900_P1_VITERBI_DELOCK 0xf53e0004
3244#define F0900_P1_VIT_DEMODSEL 0xf53e0002
3245#define F0900_P1_VITERBI_COMPOUT 0xf53e0001
3246 3409
3247/*P1_VTHINUSE*/ 3410/*P1_VTHINUSE*/
3248#define R0900_P1_VTHINUSE 0xf53f 3411#define R0900_P1_VTHINUSE 0xf53f
3249#define F0900_P1_VIT_INUSE 0xf53f00ff 3412#define VTHINUSE REGx(R0900_P1_VTHINUSE)
3413#define F0900_P1_VIT_INUSE 0xf53f00ff
3250 3414
3251/*P1_KDIV12*/ 3415/*P1_KDIV12*/
3252#define R0900_P1_KDIV12 0xf540 3416#define R0900_P1_KDIV12 0xf540
3253#define F0900_P1_KDIV12_MANUAL 0xf5400080 3417#define KDIV12 REGx(R0900_P1_KDIV12)
3254#define F0900_P1_K_DIVIDER_12 0xf540007f 3418#define F0900_P1_K_DIVIDER_12 0xf540007f
3255 3419
3256/*P1_KDIV23*/ 3420/*P1_KDIV23*/
3257#define R0900_P1_KDIV23 0xf541 3421#define R0900_P1_KDIV23 0xf541
3258#define F0900_P1_KDIV23_MANUAL 0xf5410080 3422#define KDIV23 REGx(R0900_P1_KDIV23)
3259#define F0900_P1_K_DIVIDER_23 0xf541007f 3423#define F0900_P1_K_DIVIDER_23 0xf541007f
3260 3424
3261/*P1_KDIV34*/ 3425/*P1_KDIV34*/
3262#define R0900_P1_KDIV34 0xf542 3426#define R0900_P1_KDIV34 0xf542
3263#define F0900_P1_KDIV34_MANUAL 0xf5420080 3427#define KDIV34 REGx(R0900_P1_KDIV34)
3264#define F0900_P1_K_DIVIDER_34 0xf542007f 3428#define F0900_P1_K_DIVIDER_34 0xf542007f
3265 3429
3266/*P1_KDIV56*/ 3430/*P1_KDIV56*/
3267#define R0900_P1_KDIV56 0xf543 3431#define R0900_P1_KDIV56 0xf543
3268#define F0900_P1_KDIV56_MANUAL 0xf5430080 3432#define KDIV56 REGx(R0900_P1_KDIV56)
3269#define F0900_P1_K_DIVIDER_56 0xf543007f 3433#define F0900_P1_K_DIVIDER_56 0xf543007f
3270 3434
3271/*P1_KDIV67*/ 3435/*P1_KDIV67*/
3272#define R0900_P1_KDIV67 0xf544 3436#define R0900_P1_KDIV67 0xf544
3273#define F0900_P1_KDIV67_MANUAL 0xf5440080 3437#define KDIV67 REGx(R0900_P1_KDIV67)
3274#define F0900_P1_K_DIVIDER_67 0xf544007f 3438#define F0900_P1_K_DIVIDER_67 0xf544007f
3275 3439
3276/*P1_KDIV78*/ 3440/*P1_KDIV78*/
3277#define R0900_P1_KDIV78 0xf545 3441#define R0900_P1_KDIV78 0xf545
3278#define F0900_P1_KDIV78_MANUAL 0xf5450080 3442#define KDIV78 REGx(R0900_P1_KDIV78)
3279#define F0900_P1_K_DIVIDER_78 0xf545007f 3443#define F0900_P1_K_DIVIDER_78 0xf545007f
3280 3444
3281/*P1_PDELCTRL1*/ 3445/*P1_PDELCTRL1*/
3282#define R0900_P1_PDELCTRL1 0xf550 3446#define R0900_P1_PDELCTRL1 0xf550
3283#define F0900_P1_INV_MISMASK 0xf5500080 3447#define PDELCTRL1 REGx(R0900_P1_PDELCTRL1)
3284#define F0900_P1_FORCE_ACCEPTED 0xf5500040 3448#define F0900_P1_INV_MISMASK 0xf5500080
3285#define F0900_P1_FILTER_EN 0xf5500020 3449#define F0900_P1_FILTER_EN 0xf5500020
3286#define F0900_P1_FORCE_PKTDELINUSE 0xf5500010 3450#define F0900_P1_EN_MIS00 0xf5500002
3287#define F0900_P1_HYSTEN 0xf5500008 3451#define F0900_P1_ALGOSWRST 0xf5500001
3288#define F0900_P1_HYSTSWRST 0xf5500004 3452#define ALGOSWRST FLDx(F0900_P1_ALGOSWRST)
3289#define F0900_P1_EN_MIS00 0xf5500002
3290#define F0900_P1_ALGOSWRST 0xf5500001
3291 3453
3292/*P1_PDELCTRL2*/ 3454/*P1_PDELCTRL2*/
3293#define R0900_P1_PDELCTRL2 0xf551 3455#define R0900_P1_PDELCTRL2 0xf551
3294#define F0900_P1_FORCE_CONTINUOUS 0xf5510080 3456#define PDELCTRL2 REGx(R0900_P1_PDELCTRL2)
3295#define F0900_P1_RESET_UPKO_COUNT 0xf5510040 3457#define F0900_P1_RESET_UPKO_COUNT 0xf5510040
3296#define F0900_P1_USER_PKTDELIN_NB 0xf5510020 3458#define RESET_UPKO_COUNT FLDx(F0900_P1_RESET_UPKO_COUNT)
3297#define F0900_P1_FORCE_LOCKED 0xf5510010 3459#define F0900_P1_FRAME_MODE 0xf5510002
3298#define F0900_P1_DATA_UNBBSCRAM 0xf5510008 3460#define F0900_P1_NOBCHERRFLG_USE 0xf5510001
3299#define F0900_P1_FORCE_LONGPKT 0xf5510004
3300#define F0900_P1_FRAME_MODE 0xf5510002
3301 3461
3302/*P1_HYSTTHRESH*/ 3462/*P1_HYSTTHRESH*/
3303#define R0900_P1_HYSTTHRESH 0xf554 3463#define R0900_P1_HYSTTHRESH 0xf554
3304#define F0900_P1_UNLCK_THRESH 0xf55400f0 3464#define HYSTTHRESH REGx(R0900_P1_HYSTTHRESH)
3305#define F0900_P1_DELIN_LCK_THRESH 0xf554000f 3465#define F0900_P1_UNLCK_THRESH 0xf55400f0
3466#define F0900_P1_DELIN_LCK_THRESH 0xf554000f
3306 3467
3307/*P1_ISIENTRY*/ 3468/*P1_ISIENTRY*/
3308#define R0900_P1_ISIENTRY 0xf55e 3469#define R0900_P1_ISIENTRY 0xf55e
3309#define F0900_P1_ISI_ENTRY 0xf55e00ff 3470#define ISIENTRY REGx(R0900_P1_ISIENTRY)
3471#define F0900_P1_ISI_ENTRY 0xf55e00ff
3310 3472
3311/*P1_ISIBITENA*/ 3473/*P1_ISIBITENA*/
3312#define R0900_P1_ISIBITENA 0xf55f 3474#define R0900_P1_ISIBITENA 0xf55f
3313#define F0900_P1_ISI_BIT_EN 0xf55f00ff 3475#define ISIBITENA REGx(R0900_P1_ISIBITENA)
3476#define F0900_P1_ISI_BIT_EN 0xf55f00ff
3314 3477
3315/*P1_MATSTR1*/ 3478/*P1_MATSTR1*/
3316#define R0900_P1_MATSTR1 0xf560 3479#define R0900_P1_MATSTR1 0xf560
3317#define F0900_P1_MATYPE_CURRENT1 0xf56000ff 3480#define MATSTR1 REGx(R0900_P1_MATSTR1)
3481#define F0900_P1_MATYPE_CURRENT1 0xf56000ff
3318 3482
3319/*P1_MATSTR0*/ 3483/*P1_MATSTR0*/
3320#define R0900_P1_MATSTR0 0xf561 3484#define R0900_P1_MATSTR0 0xf561
3321#define F0900_P1_MATYPE_CURRENT0 0xf56100ff 3485#define MATSTR0 REGx(R0900_P1_MATSTR0)
3486#define F0900_P1_MATYPE_CURRENT0 0xf56100ff
3322 3487
3323/*P1_UPLSTR1*/ 3488/*P1_UPLSTR1*/
3324#define R0900_P1_UPLSTR1 0xf562 3489#define R0900_P1_UPLSTR1 0xf562
3325#define F0900_P1_UPL_CURRENT1 0xf56200ff 3490#define UPLSTR1 REGx(R0900_P1_UPLSTR1)
3491#define F0900_P1_UPL_CURRENT1 0xf56200ff
3326 3492
3327/*P1_UPLSTR0*/ 3493/*P1_UPLSTR0*/
3328#define R0900_P1_UPLSTR0 0xf563 3494#define R0900_P1_UPLSTR0 0xf563
3329#define F0900_P1_UPL_CURRENT0 0xf56300ff 3495#define UPLSTR0 REGx(R0900_P1_UPLSTR0)
3496#define F0900_P1_UPL_CURRENT0 0xf56300ff
3330 3497
3331/*P1_DFLSTR1*/ 3498/*P1_DFLSTR1*/
3332#define R0900_P1_DFLSTR1 0xf564 3499#define R0900_P1_DFLSTR1 0xf564
3333#define F0900_P1_DFL_CURRENT1 0xf56400ff 3500#define DFLSTR1 REGx(R0900_P1_DFLSTR1)
3501#define F0900_P1_DFL_CURRENT1 0xf56400ff
3334 3502
3335/*P1_DFLSTR0*/ 3503/*P1_DFLSTR0*/
3336#define R0900_P1_DFLSTR0 0xf565 3504#define R0900_P1_DFLSTR0 0xf565
3337#define F0900_P1_DFL_CURRENT0 0xf56500ff 3505#define DFLSTR0 REGx(R0900_P1_DFLSTR0)
3506#define F0900_P1_DFL_CURRENT0 0xf56500ff
3338 3507
3339/*P1_SYNCSTR*/ 3508/*P1_SYNCSTR*/
3340#define R0900_P1_SYNCSTR 0xf566 3509#define R0900_P1_SYNCSTR 0xf566
3341#define F0900_P1_SYNC_CURRENT 0xf56600ff 3510#define SYNCSTR REGx(R0900_P1_SYNCSTR)
3511#define F0900_P1_SYNC_CURRENT 0xf56600ff
3342 3512
3343/*P1_SYNCDSTR1*/ 3513/*P1_SYNCDSTR1*/
3344#define R0900_P1_SYNCDSTR1 0xf567 3514#define R0900_P1_SYNCDSTR1 0xf567
3345#define F0900_P1_SYNCD_CURRENT1 0xf56700ff 3515#define SYNCDSTR1 REGx(R0900_P1_SYNCDSTR1)
3516#define F0900_P1_SYNCD_CURRENT1 0xf56700ff
3346 3517
3347/*P1_SYNCDSTR0*/ 3518/*P1_SYNCDSTR0*/
3348#define R0900_P1_SYNCDSTR0 0xf568 3519#define R0900_P1_SYNCDSTR0 0xf568
3349#define F0900_P1_SYNCD_CURRENT0 0xf56800ff 3520#define SYNCDSTR0 REGx(R0900_P1_SYNCDSTR0)
3521#define F0900_P1_SYNCD_CURRENT0 0xf56800ff
3350 3522
3351/*P1_PDELSTATUS1*/ 3523/*P1_PDELSTATUS1*/
3352#define R0900_P1_PDELSTATUS1 0xf569 3524#define R0900_P1_PDELSTATUS1 0xf569
3353#define F0900_P1_PKTDELIN_DELOCK 0xf5690080 3525#define F0900_P1_PKTDELIN_DELOCK 0xf5690080
3354#define F0900_P1_SYNCDUPDFL_BADDFL 0xf5690040 3526#define F0900_P1_SYNCDUPDFL_BADDFL 0xf5690040
3355#define F0900_P1_CONTINUOUS_STREAM 0xf5690020 3527#define F0900_P1_CONTINUOUS_STREAM 0xf5690020
3356#define F0900_P1_UNACCEPTED_STREAM 0xf5690010 3528#define F0900_P1_UNACCEPTED_STREAM 0xf5690010
3357#define F0900_P1_BCH_ERROR_FLAG 0xf5690008 3529#define F0900_P1_BCH_ERROR_FLAG 0xf5690008
3358#define F0900_P1_BBHCRCKO 0xf5690004 3530#define F0900_P1_PKTDELIN_LOCK 0xf5690002
3359#define F0900_P1_PKTDELIN_LOCK 0xf5690002 3531#define PKTDELIN_LOCK FLDx(F0900_P1_PKTDELIN_LOCK)
3360#define F0900_P1_FIRST_LOCK 0xf5690001 3532#define F0900_P1_FIRST_LOCK 0xf5690001
3361 3533
3362/*P1_PDELSTATUS2*/ 3534/*P1_PDELSTATUS2*/
3363#define R0900_P1_PDELSTATUS2 0xf56a 3535#define R0900_P1_PDELSTATUS2 0xf56a
3364#define F0900_P1_PKTDEL_DEMODSEL 0xf56a0080 3536#define F0900_P1_FRAME_MODCOD 0xf56a007c
3365#define F0900_P1_FRAME_MODCOD 0xf56a007c 3537#define F0900_P1_FRAME_TYPE 0xf56a0003
3366#define F0900_P1_FRAME_TYPE 0xf56a0003
3367 3538
3368/*P1_BBFCRCKO1*/ 3539/*P1_BBFCRCKO1*/
3369#define R0900_P1_BBFCRCKO1 0xf56b 3540#define R0900_P1_BBFCRCKO1 0xf56b
3370#define F0900_P1_BBHCRC_KOCNT1 0xf56b00ff 3541#define BBFCRCKO1 REGx(R0900_P1_BBFCRCKO1)
3542#define F0900_P1_BBHCRC_KOCNT1 0xf56b00ff
3371 3543
3372/*P1_BBFCRCKO0*/ 3544/*P1_BBFCRCKO0*/
3373#define R0900_P1_BBFCRCKO0 0xf56c 3545#define R0900_P1_BBFCRCKO0 0xf56c
3374#define F0900_P1_BBHCRC_KOCNT0 0xf56c00ff 3546#define BBFCRCKO0 REGx(R0900_P1_BBFCRCKO0)
3547#define F0900_P1_BBHCRC_KOCNT0 0xf56c00ff
3375 3548
3376/*P1_UPCRCKO1*/ 3549/*P1_UPCRCKO1*/
3377#define R0900_P1_UPCRCKO1 0xf56d 3550#define R0900_P1_UPCRCKO1 0xf56d
3378#define F0900_P1_PKTCRC_KOCNT1 0xf56d00ff 3551#define UPCRCKO1 REGx(R0900_P1_UPCRCKO1)
3552#define F0900_P1_PKTCRC_KOCNT1 0xf56d00ff
3379 3553
3380/*P1_UPCRCKO0*/ 3554/*P1_UPCRCKO0*/
3381#define R0900_P1_UPCRCKO0 0xf56e 3555#define R0900_P1_UPCRCKO0 0xf56e
3382#define F0900_P1_PKTCRC_KOCNT0 0xf56e00ff 3556#define UPCRCKO0 REGx(R0900_P1_UPCRCKO0)
3557#define F0900_P1_PKTCRC_KOCNT0 0xf56e00ff
3558
3559/*P1_PDELCTRL3*/
3560#define R0900_P1_PDELCTRL3 0xf56f
3561#define PDELCTRL3 REGx(R0900_P1_PDELCTRL3)
3562#define F0900_P1_PKTDEL_CONTFAIL 0xf56f0080
3563#define F0900_P1_NOFIFO_BCHERR 0xf56f0020
3383 3564
3384/*P1_TSSTATEM*/ 3565/*P1_TSSTATEM*/
3385#define R0900_P1_TSSTATEM 0xf570 3566#define R0900_P1_TSSTATEM 0xf570
3386#define F0900_P1_TSDIL_ON 0xf5700080 3567#define TSSTATEM REGx(R0900_P1_TSSTATEM)
3387#define F0900_P1_TSSKIPRS_ON 0xf5700040 3568#define F0900_P1_TSDIL_ON 0xf5700080
3388#define F0900_P1_TSRS_ON 0xf5700020 3569#define F0900_P1_TSRS_ON 0xf5700020
3389#define F0900_P1_TSDESCRAMB_ON 0xf5700010 3570#define F0900_P1_TSDESCRAMB_ON 0xf5700010
3390#define F0900_P1_TSFRAME_MODE 0xf5700008 3571#define F0900_P1_TSFRAME_MODE 0xf5700008
3391#define F0900_P1_TS_DISABLE 0xf5700004 3572#define F0900_P1_TS_DISABLE 0xf5700004
3392#define F0900_P1_TSACM_MODE 0xf5700002 3573#define F0900_P1_TSOUT_NOSYNC 0xf5700001
3393#define F0900_P1_TSOUT_NOSYNC 0xf5700001
3394 3574
3395/*P1_TSCFGH*/ 3575/*P1_TSCFGH*/
3396#define R0900_P1_TSCFGH 0xf572 3576#define R0900_P1_TSCFGH 0xf572
3397#define F0900_P1_TSFIFO_DVBCI 0xf5720080 3577#define TSCFGH REGx(R0900_P1_TSCFGH)
3398#define F0900_P1_TSFIFO_SERIAL 0xf5720040 3578#define F0900_P1_TSFIFO_DVBCI 0xf5720080
3399#define F0900_P1_TSFIFO_TEIUPDATE 0xf5720020 3579#define F0900_P1_TSFIFO_SERIAL 0xf5720040
3400#define F0900_P1_TSFIFO_DUTY50 0xf5720010 3580#define F0900_P1_TSFIFO_TEIUPDATE 0xf5720020
3401#define F0900_P1_TSFIFO_HSGNLOUT 0xf5720008 3581#define F0900_P1_TSFIFO_DUTY50 0xf5720010
3402#define F0900_P1_TSFIFO_ERRMODE 0xf5720006 3582#define F0900_P1_TSFIFO_HSGNLOUT 0xf5720008
3403#define F0900_P1_RST_HWARE 0xf5720001 3583#define F0900_P1_TSFIFO_ERRMODE 0xf5720006
3584#define F0900_P1_RST_HWARE 0xf5720001
3585#define RST_HWARE FLDx(F0900_P1_RST_HWARE)
3404 3586
3405/*P1_TSCFGM*/ 3587/*P1_TSCFGM*/
3406#define R0900_P1_TSCFGM 0xf573 3588#define R0900_P1_TSCFGM 0xf573
3407#define F0900_P1_TSFIFO_MANSPEED 0xf57300c0 3589#define TSCFGM REGx(R0900_P1_TSCFGM)
3408#define F0900_P1_TSFIFO_PERMDATA 0xf5730020 3590#define F0900_P1_TSFIFO_MANSPEED 0xf57300c0
3409#define F0900_P1_TSFIFO_NONEWSGNL 0xf5730010 3591#define F0900_P1_TSFIFO_PERMDATA 0xf5730020
3410#define F0900_P1_TSFIFO_BITSPEED 0xf5730008 3592#define F0900_P1_TSFIFO_DPUNACT 0xf5730002
3411#define F0900_P1_NPD_SPECDVBS2 0xf5730004 3593#define F0900_P1_TSFIFO_INVDATA 0xf5730001
3412#define F0900_P1_TSFIFO_STOPCKDIS 0xf5730002
3413#define F0900_P1_TSFIFO_INVDATA 0xf5730001
3414 3594
3415/*P1_TSCFGL*/ 3595/*P1_TSCFGL*/
3416#define R0900_P1_TSCFGL 0xf574 3596#define R0900_P1_TSCFGL 0xf574
3417#define F0900_P1_TSFIFO_BCLKDEL1CK 0xf57400c0 3597#define TSCFGL REGx(R0900_P1_TSCFGL)
3418#define F0900_P1_BCHERROR_MODE 0xf5740030 3598#define F0900_P1_TSFIFO_BCLKDEL1CK 0xf57400c0
3419#define F0900_P1_TSFIFO_NSGNL2DATA 0xf5740008 3599#define F0900_P1_BCHERROR_MODE 0xf5740030
3420#define F0900_P1_TSFIFO_EMBINDVB 0xf5740004 3600#define F0900_P1_TSFIFO_NSGNL2DATA 0xf5740008
3421#define F0900_P1_TSFIFO_DPUNACT 0xf5740002 3601#define F0900_P1_TSFIFO_EMBINDVB 0xf5740004
3422#define F0900_P1_TSFIFO_NPDOFF 0xf5740001 3602#define F0900_P1_TSFIFO_BITSPEED 0xf5740003
3423 3603
3424/*P1_TSINSDELH*/ 3604/*P1_TSINSDELH*/
3425#define R0900_P1_TSINSDELH 0xf576 3605#define R0900_P1_TSINSDELH 0xf576
3426#define F0900_P1_TSDEL_SYNCBYTE 0xf5760080 3606#define TSINSDELH REGx(R0900_P1_TSINSDELH)
3427#define F0900_P1_TSDEL_XXHEADER 0xf5760040 3607#define F0900_P1_TSDEL_SYNCBYTE 0xf5760080
3428#define F0900_P1_TSDEL_BBHEADER 0xf5760020 3608#define F0900_P1_TSDEL_XXHEADER 0xf5760040
3429#define F0900_P1_TSDEL_DATAFIELD 0xf5760010 3609#define F0900_P1_TSDEL_BBHEADER 0xf5760020
3430#define F0900_P1_TSINSDEL_ISCR 0xf5760008 3610#define F0900_P1_TSDEL_DATAFIELD 0xf5760010
3431#define F0900_P1_TSINSDEL_NPD 0xf5760004 3611#define F0900_P1_TSINSDEL_ISCR 0xf5760008
3432#define F0900_P1_TSINSDEL_RSPARITY 0xf5760002 3612#define F0900_P1_TSINSDEL_NPD 0xf5760004
3433#define F0900_P1_TSINSDEL_CRC8 0xf5760001 3613#define F0900_P1_TSINSDEL_RSPARITY 0xf5760002
3614#define F0900_P1_TSINSDEL_CRC8 0xf5760001
3615
3616/*P1_TSDIVN*/
3617#define R0900_P1_TSDIVN 0xf579
3618#define TSDIVN REGx(R0900_P1_TSDIVN)
3619#define F0900_P1_TSFIFO_SPEEDMODE 0xf57900c0
3620
3621/*P1_TSCFG4*/
3622#define R0900_P1_TSCFG4 0xf57a
3623#define TSCFG4 REGx(R0900_P1_TSCFG4)
3624#define F0900_P1_TSFIFO_TSSPEEDMODE 0xf57a00c0
3434 3625
3435/*P1_TSSPEED*/ 3626/*P1_TSSPEED*/
3436#define R0900_P1_TSSPEED 0xf580 3627#define R0900_P1_TSSPEED 0xf580
3437#define F0900_P1_TSFIFO_OUTSPEED 0xf58000ff 3628#define TSSPEED REGx(R0900_P1_TSSPEED)
3629#define F0900_P1_TSFIFO_OUTSPEED 0xf58000ff
3438 3630
3439/*P1_TSSTATUS*/ 3631/*P1_TSSTATUS*/
3440#define R0900_P1_TSSTATUS 0xf581 3632#define R0900_P1_TSSTATUS 0xf581
3441#define F0900_P1_TSFIFO_LINEOK 0xf5810080 3633#define TSSTATUS REGx(R0900_P1_TSSTATUS)
3442#define F0900_P1_TSFIFO_ERROR 0xf5810040 3634#define F0900_P1_TSFIFO_LINEOK 0xf5810080
3443#define F0900_P1_TSFIFO_DATA7 0xf5810020 3635#define TSFIFO_LINEOK FLDx(F0900_P1_TSFIFO_LINEOK)
3444#define F0900_P1_TSFIFO_NOSYNC 0xf5810010 3636#define F0900_P1_TSFIFO_ERROR 0xf5810040
3445#define F0900_P1_ISCR_INITIALIZED 0xf5810008 3637#define F0900_P1_DIL_READY 0xf5810001
3446#define F0900_P1_ISCR_UPDATED 0xf5810004
3447#define F0900_P1_SOFFIFO_UNREGUL 0xf5810002
3448#define F0900_P1_DIL_READY 0xf5810001
3449 3638
3450/*P1_TSSTATUS2*/ 3639/*P1_TSSTATUS2*/
3451#define R0900_P1_TSSTATUS2 0xf582 3640#define R0900_P1_TSSTATUS2 0xf582
3452#define F0900_P1_TSFIFO_DEMODSEL 0xf5820080 3641#define TSSTATUS2 REGx(R0900_P1_TSSTATUS2)
3453#define F0900_P1_TSFIFOSPEED_STORE 0xf5820040 3642#define F0900_P1_TSFIFO_DEMODSEL 0xf5820080
3454#define F0900_P1_DILXX_RESET 0xf5820020 3643#define F0900_P1_TSFIFOSPEED_STORE 0xf5820040
3455#define F0900_P1_TSSERIAL_IMPOS 0xf5820010 3644#define F0900_P1_DILXX_RESET 0xf5820020
3456#define F0900_P1_TSFIFO_LINENOK 0xf5820008 3645#define F0900_P1_TSSERIAL_IMPOS 0xf5820010
3457#define F0900_P1_BITSPEED_EVENT 0xf5820004 3646#define F0900_P1_SCRAMBDETECT 0xf5820002
3458#define F0900_P1_SCRAMBDETECT 0xf5820002
3459#define F0900_P1_ULDTV67_FALSELOCK 0xf5820001
3460 3647
3461/*P1_TSBITRATE1*/ 3648/*P1_TSBITRATE1*/
3462#define R0900_P1_TSBITRATE1 0xf583 3649#define R0900_P1_TSBITRATE1 0xf583
3463#define F0900_P1_TSFIFO_BITRATE1 0xf58300ff 3650#define TSBITRATE1 REGx(R0900_P1_TSBITRATE1)
3651#define F0900_P1_TSFIFO_BITRATE1 0xf58300ff
3464 3652
3465/*P1_TSBITRATE0*/ 3653/*P1_TSBITRATE0*/
3466#define R0900_P1_TSBITRATE0 0xf584 3654#define R0900_P1_TSBITRATE0 0xf584
3467#define F0900_P1_TSFIFO_BITRATE0 0xf58400ff 3655#define TSBITRATE0 REGx(R0900_P1_TSBITRATE0)
3656#define F0900_P1_TSFIFO_BITRATE0 0xf58400ff
3468 3657
3469/*P1_ERRCTRL1*/ 3658/*P1_ERRCTRL1*/
3470#define R0900_P1_ERRCTRL1 0xf598 3659#define R0900_P1_ERRCTRL1 0xf598
3471#define F0900_P1_ERR_SOURCE1 0xf59800f0 3660#define ERRCTRL1 REGx(R0900_P1_ERRCTRL1)
3472#define F0900_P1_NUM_EVENT1 0xf5980007 3661#define F0900_P1_ERR_SOURCE1 0xf59800f0
3662#define F0900_P1_NUM_EVENT1 0xf5980007
3473 3663
3474/*P1_ERRCNT12*/ 3664/*P1_ERRCNT12*/
3475#define R0900_P1_ERRCNT12 0xf599 3665#define R0900_P1_ERRCNT12 0xf599
3476#define F0900_P1_ERRCNT1_OLDVALUE 0xf5990080 3666#define ERRCNT12 REGx(R0900_P1_ERRCNT12)
3477#define F0900_P1_ERR_CNT12 0xf599007f 3667#define F0900_P1_ERRCNT1_OLDVALUE 0xf5990080
3668#define F0900_P1_ERR_CNT12 0xf599007f
3669#define ERR_CNT12 FLDx(F0900_P1_ERR_CNT12)
3478 3670
3479/*P1_ERRCNT11*/ 3671/*P1_ERRCNT11*/
3480#define R0900_P1_ERRCNT11 0xf59a 3672#define R0900_P1_ERRCNT11 0xf59a
3481#define F0900_P1_ERR_CNT11 0xf59a00ff 3673#define ERRCNT11 REGx(R0900_P1_ERRCNT11)
3674#define F0900_P1_ERR_CNT11 0xf59a00ff
3675#define ERR_CNT11 FLDx(F0900_P1_ERR_CNT11)
3482 3676
3483/*P1_ERRCNT10*/ 3677/*P1_ERRCNT10*/
3484#define R0900_P1_ERRCNT10 0xf59b 3678#define R0900_P1_ERRCNT10 0xf59b
3485#define F0900_P1_ERR_CNT10 0xf59b00ff 3679#define ERRCNT10 REGx(R0900_P1_ERRCNT10)
3680#define F0900_P1_ERR_CNT10 0xf59b00ff
3681#define ERR_CNT10 FLDx(F0900_P1_ERR_CNT10)
3486 3682
3487/*P1_ERRCTRL2*/ 3683/*P1_ERRCTRL2*/
3488#define R0900_P1_ERRCTRL2 0xf59c 3684#define R0900_P1_ERRCTRL2 0xf59c
3489#define F0900_P1_ERR_SOURCE2 0xf59c00f0 3685#define ERRCTRL2 REGx(R0900_P1_ERRCTRL2)
3490#define F0900_P1_NUM_EVENT2 0xf59c0007 3686#define F0900_P1_ERR_SOURCE2 0xf59c00f0
3687#define F0900_P1_NUM_EVENT2 0xf59c0007
3491 3688
3492/*P1_ERRCNT22*/ 3689/*P1_ERRCNT22*/
3493#define R0900_P1_ERRCNT22 0xf59d 3690#define R0900_P1_ERRCNT22 0xf59d
3494#define F0900_P1_ERRCNT2_OLDVALUE 0xf59d0080 3691#define ERRCNT22 REGx(R0900_P1_ERRCNT22)
3495#define F0900_P1_ERR_CNT22 0xf59d007f 3692#define F0900_P1_ERRCNT2_OLDVALUE 0xf59d0080
3693#define F0900_P1_ERR_CNT22 0xf59d007f
3694#define ERR_CNT22 FLDx(F0900_P1_ERR_CNT22)
3496 3695
3497/*P1_ERRCNT21*/ 3696/*P1_ERRCNT21*/
3498#define R0900_P1_ERRCNT21 0xf59e 3697#define R0900_P1_ERRCNT21 0xf59e
3499#define F0900_P1_ERR_CNT21 0xf59e00ff 3698#define ERRCNT21 REGx(R0900_P1_ERRCNT21)
3699#define F0900_P1_ERR_CNT21 0xf59e00ff
3700#define ERR_CNT21 FLDx(F0900_P1_ERR_CNT21)
3500 3701
3501/*P1_ERRCNT20*/ 3702/*P1_ERRCNT20*/
3502#define R0900_P1_ERRCNT20 0xf59f 3703#define R0900_P1_ERRCNT20 0xf59f
3503#define F0900_P1_ERR_CNT20 0xf59f00ff 3704#define ERRCNT20 REGx(R0900_P1_ERRCNT20)
3705#define F0900_P1_ERR_CNT20 0xf59f00ff
3706#define ERR_CNT20 FLDx(F0900_P1_ERR_CNT20)
3504 3707
3505/*P1_FECSPY*/ 3708/*P1_FECSPY*/
3506#define R0900_P1_FECSPY 0xf5a0 3709#define R0900_P1_FECSPY 0xf5a0
3507#define F0900_P1_SPY_ENABLE 0xf5a00080 3710#define FECSPY REGx(R0900_P1_FECSPY)
3508#define F0900_P1_NO_SYNCBYTE 0xf5a00040 3711#define F0900_P1_SPY_ENABLE 0xf5a00080
3509#define F0900_P1_SERIAL_MODE 0xf5a00020 3712#define F0900_P1_NO_SYNCBYTE 0xf5a00040
3510#define F0900_P1_UNUSUAL_PACKET 0xf5a00010 3713#define F0900_P1_SERIAL_MODE 0xf5a00020
3511#define F0900_P1_BER_PACKMODE 0xf5a00008 3714#define F0900_P1_UNUSUAL_PACKET 0xf5a00010
3512#define F0900_P1_BERMETER_LMODE 0xf5a00002 3715#define F0900_P1_BERMETER_DATAMODE 0xf5a00008
3513#define F0900_P1_BERMETER_RESET 0xf5a00001 3716#define F0900_P1_BERMETER_LMODE 0xf5a00002
3717#define F0900_P1_BERMETER_RESET 0xf5a00001
3514 3718
3515/*P1_FSPYCFG*/ 3719/*P1_FSPYCFG*/
3516#define R0900_P1_FSPYCFG 0xf5a1 3720#define R0900_P1_FSPYCFG 0xf5a1
3517#define F0900_P1_FECSPY_INPUT 0xf5a100c0 3721#define FSPYCFG REGx(R0900_P1_FSPYCFG)
3518#define F0900_P1_RST_ON_ERROR 0xf5a10020 3722#define F0900_P1_FECSPY_INPUT 0xf5a100c0
3519#define F0900_P1_ONE_SHOT 0xf5a10010 3723#define F0900_P1_RST_ON_ERROR 0xf5a10020
3520#define F0900_P1_I2C_MODE 0xf5a1000c 3724#define F0900_P1_ONE_SHOT 0xf5a10010
3521#define F0900_P1_SPY_HYSTERESIS 0xf5a10003 3725#define F0900_P1_I2C_MODE 0xf5a1000c
3726#define F0900_P1_SPY_HYSTERESIS 0xf5a10003
3522 3727
3523/*P1_FSPYDATA*/ 3728/*P1_FSPYDATA*/
3524#define R0900_P1_FSPYDATA 0xf5a2 3729#define R0900_P1_FSPYDATA 0xf5a2
3525#define F0900_P1_SPY_STUFFING 0xf5a20080 3730#define FSPYDATA REGx(R0900_P1_FSPYDATA)
3526#define F0900_P1_NOERROR_PKTJITTER 0xf5a20040 3731#define F0900_P1_SPY_STUFFING 0xf5a20080
3527#define F0900_P1_SPY_CNULLPKT 0xf5a20020 3732#define F0900_P1_SPY_CNULLPKT 0xf5a20020
3528#define F0900_P1_SPY_OUTDATA_MODE 0xf5a2001f 3733#define F0900_P1_SPY_OUTDATA_MODE 0xf5a2001f
3529 3734
3530/*P1_FSPYOUT*/ 3735/*P1_FSPYOUT*/
3531#define R0900_P1_FSPYOUT 0xf5a3 3736#define R0900_P1_FSPYOUT 0xf5a3
3532#define F0900_P1_FSPY_DIRECT 0xf5a30080 3737#define FSPYOUT REGx(R0900_P1_FSPYOUT)
3533#define F0900_P1_SPY_OUTDATA_BUS 0xf5a30038 3738#define F0900_P1_FSPY_DIRECT 0xf5a30080
3534#define F0900_P1_STUFF_MODE 0xf5a30007 3739#define F0900_P1_STUFF_MODE 0xf5a30007
3535 3740
3536/*P1_FSTATUS*/ 3741/*P1_FSTATUS*/
3537#define R0900_P1_FSTATUS 0xf5a4 3742#define R0900_P1_FSTATUS 0xf5a4
3538#define F0900_P1_SPY_ENDSIM 0xf5a40080 3743#define FSTATUS REGx(R0900_P1_FSTATUS)
3539#define F0900_P1_VALID_SIM 0xf5a40040 3744#define F0900_P1_SPY_ENDSIM 0xf5a40080
3540#define F0900_P1_FOUND_SIGNAL 0xf5a40020 3745#define F0900_P1_VALID_SIM 0xf5a40040
3541#define F0900_P1_DSS_SYNCBYTE 0xf5a40010 3746#define F0900_P1_FOUND_SIGNAL 0xf5a40020
3542#define F0900_P1_RESULT_STATE 0xf5a4000f 3747#define F0900_P1_DSS_SYNCBYTE 0xf5a40010
3748#define F0900_P1_RESULT_STATE 0xf5a4000f
3543 3749
3544/*P1_FBERCPT4*/ 3750/*P1_FBERCPT4*/
3545#define R0900_P1_FBERCPT4 0xf5a8 3751#define R0900_P1_FBERCPT4 0xf5a8
3546#define F0900_P1_FBERMETER_CPT4 0xf5a800ff 3752#define FBERCPT4 REGx(R0900_P1_FBERCPT4)
3753#define F0900_P1_FBERMETER_CPT4 0xf5a800ff
3547 3754
3548/*P1_FBERCPT3*/ 3755/*P1_FBERCPT3*/
3549#define R0900_P1_FBERCPT3 0xf5a9 3756#define R0900_P1_FBERCPT3 0xf5a9
3550#define F0900_P1_FBERMETER_CPT3 0xf5a900ff 3757#define FBERCPT3 REGx(R0900_P1_FBERCPT3)
3758#define F0900_P1_FBERMETER_CPT3 0xf5a900ff
3551 3759
3552/*P1_FBERCPT2*/ 3760/*P1_FBERCPT2*/
3553#define R0900_P1_FBERCPT2 0xf5aa 3761#define R0900_P1_FBERCPT2 0xf5aa
3554#define F0900_P1_FBERMETER_CPT2 0xf5aa00ff 3762#define FBERCPT2 REGx(R0900_P1_FBERCPT2)
3763#define F0900_P1_FBERMETER_CPT2 0xf5aa00ff
3555 3764
3556/*P1_FBERCPT1*/ 3765/*P1_FBERCPT1*/
3557#define R0900_P1_FBERCPT1 0xf5ab 3766#define R0900_P1_FBERCPT1 0xf5ab
3558#define F0900_P1_FBERMETER_CPT1 0xf5ab00ff 3767#define FBERCPT1 REGx(R0900_P1_FBERCPT1)
3768#define F0900_P1_FBERMETER_CPT1 0xf5ab00ff
3559 3769
3560/*P1_FBERCPT0*/ 3770/*P1_FBERCPT0*/
3561#define R0900_P1_FBERCPT0 0xf5ac 3771#define R0900_P1_FBERCPT0 0xf5ac
3562#define F0900_P1_FBERMETER_CPT0 0xf5ac00ff 3772#define FBERCPT0 REGx(R0900_P1_FBERCPT0)
3773#define F0900_P1_FBERMETER_CPT0 0xf5ac00ff
3563 3774
3564/*P1_FBERERR2*/ 3775/*P1_FBERERR2*/
3565#define R0900_P1_FBERERR2 0xf5ad 3776#define R0900_P1_FBERERR2 0xf5ad
3566#define F0900_P1_FBERMETER_ERR2 0xf5ad00ff 3777#define FBERERR2 REGx(R0900_P1_FBERERR2)
3778#define F0900_P1_FBERMETER_ERR2 0xf5ad00ff
3567 3779
3568/*P1_FBERERR1*/ 3780/*P1_FBERERR1*/
3569#define R0900_P1_FBERERR1 0xf5ae 3781#define R0900_P1_FBERERR1 0xf5ae
3570#define F0900_P1_FBERMETER_ERR1 0xf5ae00ff 3782#define FBERERR1 REGx(R0900_P1_FBERERR1)
3783#define F0900_P1_FBERMETER_ERR1 0xf5ae00ff
3571 3784
3572/*P1_FBERERR0*/ 3785/*P1_FBERERR0*/
3573#define R0900_P1_FBERERR0 0xf5af 3786#define R0900_P1_FBERERR0 0xf5af
3574#define F0900_P1_FBERMETER_ERR0 0xf5af00ff 3787#define FBERERR0 REGx(R0900_P1_FBERERR0)
3788#define F0900_P1_FBERMETER_ERR0 0xf5af00ff
3575 3789
3576/*P1_FSPYBER*/ 3790/*P1_FSPYBER*/
3577#define R0900_P1_FSPYBER 0xf5b2 3791#define R0900_P1_FSPYBER 0xf5b2
3578#define F0900_P1_FSPYOBS_XORREAD 0xf5b20040 3792#define FSPYBER REGx(R0900_P1_FSPYBER)
3579#define F0900_P1_FSPYBER_OBSMODE 0xf5b20020 3793#define F0900_P1_FSPYBER_SYNCBYTE 0xf5b20010
3580#define F0900_P1_FSPYBER_SYNCBYTE 0xf5b20010 3794#define F0900_P1_FSPYBER_UNSYNC 0xf5b20008
3581#define F0900_P1_FSPYBER_UNSYNC 0xf5b20008 3795#define F0900_P1_FSPYBER_CTIME 0xf5b20007
3582#define F0900_P1_FSPYBER_CTIME 0xf5b20007 3796
3583 3797/*RCCFG2*/
3584/*RCCFGH*/ 3798#define R0900_RCCFG2 0xf600
3585#define R0900_RCCFGH 0xf600
3586#define F0900_TSRCFIFO_DVBCI 0xf6000080
3587#define F0900_TSRCFIFO_SERIAL 0xf6000040
3588#define F0900_TSRCFIFO_DISABLE 0xf6000020
3589#define F0900_TSFIFO_2TORC 0xf6000010
3590#define F0900_TSRCFIFO_HSGNLOUT 0xf6000008
3591#define F0900_TSRCFIFO_ERRMODE 0xf6000006
3592 3799
3593/*TSGENERAL*/ 3800/*TSGENERAL*/
3594#define R0900_TSGENERAL 0xf630 3801#define R0900_TSGENERAL 0xf630
3595#define F0900_TSFIFO_BCLK1ALL 0xf6300020 3802#define F0900_TSFIFO_DISTS2PAR 0xf6300040
3596#define F0900_MUXSTREAM_OUTMODE 0xf6300008 3803#define F0900_MUXSTREAM_OUTMODE 0xf6300008
3597#define F0900_TSFIFO_PERMPARAL 0xf6300006 3804#define F0900_TSFIFO_PERMPARAL 0xf6300006
3598#define F0900_RST_REEDSOLO 0xf6300001
3599 3805
3600/*TSGENERAL1X*/ 3806/*TSGENERAL1X*/
3601#define R0900_TSGENERAL1X 0xf670 3807#define R0900_TSGENERAL1X 0xf670
3602#define F0900_TSFIFO1X_BCLK1ALL 0xf6700020
3603#define F0900_MUXSTREAM1X_OUTMODE 0xf6700008
3604#define F0900_TSFIFO1X_PERMPARAL 0xf6700006
3605#define F0900_RST1X_REEDSOLO 0xf6700001
3606 3808
3607/*NBITER_NF4*/ 3809/*NBITER_NF4*/
3608#define R0900_NBITER_NF4 0xfa03 3810#define R0900_NBITER_NF4 0xfa03
3609#define F0900_NBITER_NF_QP_1_2 0xfa0300ff 3811#define F0900_NBITER_NF_QP_1_2 0xfa0300ff
3610 3812
3611/*NBITER_NF5*/ 3813/*NBITER_NF5*/
3612#define R0900_NBITER_NF5 0xfa04 3814#define R0900_NBITER_NF5 0xfa04
3613#define F0900_NBITER_NF_QP_3_5 0xfa0400ff 3815#define F0900_NBITER_NF_QP_3_5 0xfa0400ff
3614 3816
3615/*NBITER_NF6*/ 3817/*NBITER_NF6*/
3616#define R0900_NBITER_NF6 0xfa05 3818#define R0900_NBITER_NF6 0xfa05
3617#define F0900_NBITER_NF_QP_2_3 0xfa0500ff 3819#define F0900_NBITER_NF_QP_2_3 0xfa0500ff
3618 3820
3619/*NBITER_NF7*/ 3821/*NBITER_NF7*/
3620#define R0900_NBITER_NF7 0xfa06 3822#define R0900_NBITER_NF7 0xfa06
3621#define F0900_NBITER_NF_QP_3_4 0xfa0600ff 3823#define F0900_NBITER_NF_QP_3_4 0xfa0600ff
3622 3824
3623/*NBITER_NF8*/ 3825/*NBITER_NF8*/
3624#define R0900_NBITER_NF8 0xfa07 3826#define R0900_NBITER_NF8 0xfa07
3625#define F0900_NBITER_NF_QP_4_5 0xfa0700ff 3827#define F0900_NBITER_NF_QP_4_5 0xfa0700ff
3626 3828
3627/*NBITER_NF9*/ 3829/*NBITER_NF9*/
3628#define R0900_NBITER_NF9 0xfa08 3830#define R0900_NBITER_NF9 0xfa08
3629#define F0900_NBITER_NF_QP_5_6 0xfa0800ff 3831#define F0900_NBITER_NF_QP_5_6 0xfa0800ff
3630 3832
3631/*NBITER_NF10*/ 3833/*NBITER_NF10*/
3632#define R0900_NBITER_NF10 0xfa09 3834#define R0900_NBITER_NF10 0xfa09
3633#define F0900_NBITER_NF_QP_8_9 0xfa0900ff 3835#define F0900_NBITER_NF_QP_8_9 0xfa0900ff
3634 3836
3635/*NBITER_NF11*/ 3837/*NBITER_NF11*/
3636#define R0900_NBITER_NF11 0xfa0a 3838#define R0900_NBITER_NF11 0xfa0a
3637#define F0900_NBITER_NF_QP_9_10 0xfa0a00ff 3839#define F0900_NBITER_NF_QP_9_10 0xfa0a00ff
3638 3840
3639/*NBITER_NF12*/ 3841/*NBITER_NF12*/
3640#define R0900_NBITER_NF12 0xfa0b 3842#define R0900_NBITER_NF12 0xfa0b
3641#define F0900_NBITER_NF_8P_3_5 0xfa0b00ff 3843#define F0900_NBITER_NF_8P_3_5 0xfa0b00ff
3642 3844
3643/*NBITER_NF13*/ 3845/*NBITER_NF13*/
3644#define R0900_NBITER_NF13 0xfa0c 3846#define R0900_NBITER_NF13 0xfa0c
3645#define F0900_NBITER_NF_8P_2_3 0xfa0c00ff 3847#define F0900_NBITER_NF_8P_2_3 0xfa0c00ff
3646 3848
3647/*NBITER_NF14*/ 3849/*NBITER_NF14*/
3648#define R0900_NBITER_NF14 0xfa0d 3850#define R0900_NBITER_NF14 0xfa0d
3649#define F0900_NBITER_NF_8P_3_4 0xfa0d00ff 3851#define F0900_NBITER_NF_8P_3_4 0xfa0d00ff
3650 3852
3651/*NBITER_NF15*/ 3853/*NBITER_NF15*/
3652#define R0900_NBITER_NF15 0xfa0e 3854#define R0900_NBITER_NF15 0xfa0e
3653#define F0900_NBITER_NF_8P_5_6 0xfa0e00ff 3855#define F0900_NBITER_NF_8P_5_6 0xfa0e00ff
3654 3856
3655/*NBITER_NF16*/ 3857/*NBITER_NF16*/
3656#define R0900_NBITER_NF16 0xfa0f 3858#define R0900_NBITER_NF16 0xfa0f
3657#define F0900_NBITER_NF_8P_8_9 0xfa0f00ff 3859#define F0900_NBITER_NF_8P_8_9 0xfa0f00ff
3658 3860
3659/*NBITER_NF17*/ 3861/*NBITER_NF17*/
3660#define R0900_NBITER_NF17 0xfa10 3862#define R0900_NBITER_NF17 0xfa10
3661#define F0900_NBITER_NF_8P_9_10 0xfa1000ff 3863#define F0900_NBITER_NF_8P_9_10 0xfa1000ff
3662 3864
3663/*NBITERNOERR*/ 3865/*NBITERNOERR*/
3664#define R0900_NBITERNOERR 0xfa3f 3866#define R0900_NBITERNOERR 0xfa3f
3665#define F0900_NBITER_STOP_CRIT 0xfa3f000f 3867#define F0900_NBITER_STOP_CRIT 0xfa3f000f
3666 3868
3667/*GAINLLR_NF4*/ 3869/*GAINLLR_NF4*/
3668#define R0900_GAINLLR_NF4 0xfa43 3870#define R0900_GAINLLR_NF4 0xfa43
3669#define F0900_GAINLLR_NF_QP_1_2 0xfa43007f 3871#define F0900_GAINLLR_NF_QP_1_2 0xfa43007f
3670 3872
3671/*GAINLLR_NF5*/ 3873/*GAINLLR_NF5*/
3672#define R0900_GAINLLR_NF5 0xfa44 3874#define R0900_GAINLLR_NF5 0xfa44
3673#define F0900_GAINLLR_NF_QP_3_5 0xfa44007f 3875#define F0900_GAINLLR_NF_QP_3_5 0xfa44007f
3674 3876
3675/*GAINLLR_NF6*/ 3877/*GAINLLR_NF6*/
3676#define R0900_GAINLLR_NF6 0xfa45 3878#define R0900_GAINLLR_NF6 0xfa45
3677#define F0900_GAINLLR_NF_QP_2_3 0xfa45007f 3879#define F0900_GAINLLR_NF_QP_2_3 0xfa45007f
3678 3880
3679/*GAINLLR_NF7*/ 3881/*GAINLLR_NF7*/
3680#define R0900_GAINLLR_NF7 0xfa46 3882#define R0900_GAINLLR_NF7 0xfa46
3681#define F0900_GAINLLR_NF_QP_3_4 0xfa46007f 3883#define F0900_GAINLLR_NF_QP_3_4 0xfa46007f
3682 3884
3683/*GAINLLR_NF8*/ 3885/*GAINLLR_NF8*/
3684#define R0900_GAINLLR_NF8 0xfa47 3886#define R0900_GAINLLR_NF8 0xfa47
3685#define F0900_GAINLLR_NF_QP_4_5 0xfa47007f 3887#define F0900_GAINLLR_NF_QP_4_5 0xfa47007f
3686 3888
3687/*GAINLLR_NF9*/ 3889/*GAINLLR_NF9*/
3688#define R0900_GAINLLR_NF9 0xfa48 3890#define R0900_GAINLLR_NF9 0xfa48
3689#define F0900_GAINLLR_NF_QP_5_6 0xfa48007f 3891#define F0900_GAINLLR_NF_QP_5_6 0xfa48007f
3690 3892
3691/*GAINLLR_NF10*/ 3893/*GAINLLR_NF10*/
3692#define R0900_GAINLLR_NF10 0xfa49 3894#define R0900_GAINLLR_NF10 0xfa49
3693#define F0900_GAINLLR_NF_QP_8_9 0xfa49007f 3895#define F0900_GAINLLR_NF_QP_8_9 0xfa49007f
3694 3896
3695/*GAINLLR_NF11*/ 3897/*GAINLLR_NF11*/
3696#define R0900_GAINLLR_NF11 0xfa4a 3898#define R0900_GAINLLR_NF11 0xfa4a
3697#define F0900_GAINLLR_NF_QP_9_10 0xfa4a007f 3899#define F0900_GAINLLR_NF_QP_9_10 0xfa4a007f
3698 3900
3699/*GAINLLR_NF12*/ 3901/*GAINLLR_NF12*/
3700#define R0900_GAINLLR_NF12 0xfa4b 3902#define R0900_GAINLLR_NF12 0xfa4b
3701#define F0900_GAINLLR_NF_8P_3_5 0xfa4b007f 3903#define F0900_GAINLLR_NF_8P_3_5 0xfa4b007f
3702 3904
3703/*GAINLLR_NF13*/ 3905/*GAINLLR_NF13*/
3704#define R0900_GAINLLR_NF13 0xfa4c 3906#define R0900_GAINLLR_NF13 0xfa4c
3705#define F0900_GAINLLR_NF_8P_2_3 0xfa4c007f 3907#define F0900_GAINLLR_NF_8P_2_3 0xfa4c007f
3706 3908
3707/*GAINLLR_NF14*/ 3909/*GAINLLR_NF14*/
3708#define R0900_GAINLLR_NF14 0xfa4d 3910#define R0900_GAINLLR_NF14 0xfa4d
3709#define F0900_GAINLLR_NF_8P_3_4 0xfa4d007f 3911#define F0900_GAINLLR_NF_8P_3_4 0xfa4d007f
3710 3912
3711/*GAINLLR_NF15*/ 3913/*GAINLLR_NF15*/
3712#define R0900_GAINLLR_NF15 0xfa4e 3914#define R0900_GAINLLR_NF15 0xfa4e
3713#define F0900_GAINLLR_NF_8P_5_6 0xfa4e007f 3915#define F0900_GAINLLR_NF_8P_5_6 0xfa4e007f
3714 3916
3715/*GAINLLR_NF16*/ 3917/*GAINLLR_NF16*/
3716#define R0900_GAINLLR_NF16 0xfa4f 3918#define R0900_GAINLLR_NF16 0xfa4f
3717#define F0900_GAINLLR_NF_8P_8_9 0xfa4f007f 3919#define F0900_GAINLLR_NF_8P_8_9 0xfa4f007f
3718 3920
3719/*GAINLLR_NF17*/ 3921/*GAINLLR_NF17*/
3720#define R0900_GAINLLR_NF17 0xfa50 3922#define R0900_GAINLLR_NF17 0xfa50
3721#define F0900_GAINLLR_NF_8P_9_10 0xfa50007f 3923#define F0900_GAINLLR_NF_8P_9_10 0xfa50007f
3722 3924
3723/*CFGEXT*/ 3925/*CFGEXT*/
3724#define R0900_CFGEXT 0xfa80 3926#define R0900_CFGEXT 0xfa80
3725#define F0900_STAGMODE 0xfa800080 3927#define F0900_STAGMODE 0xfa800080
3726#define F0900_BYPBCH 0xfa800040 3928#define F0900_BYPBCH 0xfa800040
3727#define F0900_BYPLDPC 0xfa800020 3929#define F0900_BYPLDPC 0xfa800020
3728#define F0900_LDPCMODE 0xfa800010 3930#define F0900_LDPCMODE 0xfa800010
3729#define F0900_INVLLRSIGN 0xfa800008 3931#define F0900_INVLLRSIGN 0xfa800008
3730#define F0900_SHORTMULT 0xfa800004 3932#define F0900_SHORTMULT 0xfa800004
3731#define F0900_EXTERNTX 0xfa800001 3933#define F0900_EXTERNTX 0xfa800001
3732 3934
3733/*GENCFG*/ 3935/*GENCFG*/
3734#define R0900_GENCFG 0xfa86 3936#define R0900_GENCFG 0xfa86
3735#define F0900_BROADCAST 0xfa860010 3937#define F0900_BROADCAST 0xfa860010
3736#define F0900_NOSHFRD2 0xfa860008 3938#define F0900_PRIORITY 0xfa860002
3737#define F0900_BCHERRFLAG 0xfa860004 3939#define F0900_DDEMOD 0xfa860001
3738#define F0900_PRIORITY 0xfa860002
3739#define F0900_DDEMOD 0xfa860001
3740 3940
3741/*LDPCERR1*/ 3941/*LDPCERR1*/
3742#define R0900_LDPCERR1 0xfa96 3942#define R0900_LDPCERR1 0xfa96
3743#define F0900_LDPC_ERRORS_COUNTER1 0xfa9600ff 3943#define F0900_LDPC_ERRORS_COUNTER1 0xfa9600ff
3744 3944
3745/*LDPCERR0*/ 3945/*LDPCERR0*/
3746#define R0900_LDPCERR0 0xfa97 3946#define R0900_LDPCERR0 0xfa97
3747#define F0900_LDPC_ERRORS_COUNTER0 0xfa9700ff 3947#define F0900_LDPC_ERRORS_COUNTER0 0xfa9700ff
3748 3948
3749/*BCHERR*/ 3949/*BCHERR*/
3750#define R0900_BCHERR 0xfa98 3950#define R0900_BCHERR 0xfa98
3751#define F0900_ERRORFLAG 0xfa980010 3951#define F0900_ERRORFLAG 0xfa980010
3752#define F0900_BCH_ERRORS_COUNTER 0xfa98000f 3952#define F0900_BCH_ERRORS_COUNTER 0xfa98000f
3753 3953
3754/*TSTRES0*/ 3954/*TSTRES0*/
3755#define R0900_TSTRES0 0xff11 3955#define R0900_TSTRES0 0xff11
3756#define F0900_FRESFEC 0xff110080 3956#define F0900_FRESFEC 0xff110080
3757#define F0900_FRESTS 0xff110040 3957
3758#define F0900_FRESVIT1 0xff110020 3958/*P2_TCTL4*/
3759#define F0900_FRESVIT2 0xff110010 3959#define R0900_P2_TCTL4 0xff28
3760#define F0900_FRESSYM1 0xff110008 3960#define F0900_P2_PN4_SELECT 0xff280020
3761#define F0900_FRESSYM2 0xff110004 3961
3762#define F0900_FRESMAS 0xff110002 3962/*P1_TCTL4*/
3763#define F0900_FRESINT 0xff110001 3963#define R0900_P1_TCTL4 0xff48
3964#define TCTL4 shiftx(R0900_P1_TCTL4, demod, 0x20)
3965#define F0900_P1_PN4_SELECT 0xff480020
3764 3966
3765/*P2_TSTDISRX*/ 3967/*P2_TSTDISRX*/
3766#define R0900_P2_TSTDISRX 0xff65 3968#define R0900_P2_TSTDISRX 0xff65
3767#define F0900_P2_EN_DISRX 0xff650080 3969#define F0900_P2_PIN_SELECT1 0xff650008
3768#define F0900_P2_TST_CURRSRC 0xff650040
3769#define F0900_P2_IN_DIGSIGNAL 0xff650020
3770#define F0900_P2_HIZ_CURRENTSRC 0xff650010
3771#define F0900_TST_P2_PIN_SELECT 0xff650008
3772#define F0900_P2_TST_DISRX 0xff650007
3773 3970
3774/*P1_TSTDISRX*/ 3971/*P1_TSTDISRX*/
3775#define R0900_P1_TSTDISRX 0xff67 3972#define R0900_P1_TSTDISRX 0xff67
3776#define F0900_P1_EN_DISRX 0xff670080 3973#define TSTDISRX shiftx(R0900_P1_TSTDISRX, demod, 2)
3777#define F0900_P1_TST_CURRSRC 0xff670040 3974#define F0900_P1_PIN_SELECT1 0xff670008
3778#define F0900_P1_IN_DIGSIGNAL 0xff670020 3975#define PIN_SELECT1 shiftx(F0900_P1_PIN_SELECT1, demod, 0x20000)
3779#define F0900_P1_HIZ_CURRENTSRC 0xff670010 3976
3780#define F0900_TST_P1_PIN_SELECT 0xff670008 3977#define STV0900_NBREGS 723
3781#define F0900_P1_TST_DISRX 0xff670007 3978#define STV0900_NBFIELDS 1420
3782
3783#define STV0900_NBREGS 684
3784#define STV0900_NBFIELDS 1702
3785 3979
3786#endif 3980#endif
3787 3981
diff --git a/drivers/media/dvb/frontends/stv0900_sw.c b/drivers/media/dvb/frontends/stv0900_sw.c
index 962fde1437ce..ba0709b2d433 100644
--- a/drivers/media/dvb/frontends/stv0900_sw.c
+++ b/drivers/media/dvb/frontends/stv0900_sw.c
@@ -27,56 +27,45 @@
27#include "stv0900_reg.h" 27#include "stv0900_reg.h"
28#include "stv0900_priv.h" 28#include "stv0900_priv.h"
29 29
30int stv0900_check_signal_presence(struct stv0900_internal *i_params, 30s32 shiftx(s32 x, int demod, s32 shift)
31{
32 if (demod == 1)
33 return x - shift;
34
35 return x;
36}
37
38int stv0900_check_signal_presence(struct stv0900_internal *intp,
31 enum fe_stv0900_demod_num demod) 39 enum fe_stv0900_demod_num demod)
32{ 40{
33 s32 carr_offset, 41 s32 carr_offset,
34 agc2_integr, 42 agc2_integr,
35 max_carrier; 43 max_carrier;
36 44
37 int no_signal; 45 int no_signal = FALSE;
38 46
39 switch (demod) { 47 carr_offset = (stv0900_read_reg(intp, CFR2) << 8)
40 case STV0900_DEMOD_1: 48 | stv0900_read_reg(intp, CFR1);
41 default: 49 carr_offset = ge2comp(carr_offset, 16);
42 carr_offset = (stv0900_read_reg(i_params, R0900_P1_CFR2) << 8) 50 agc2_integr = (stv0900_read_reg(intp, AGC2I1) << 8)
43 | stv0900_read_reg(i_params, 51 | stv0900_read_reg(intp, AGC2I0);
44 R0900_P1_CFR1); 52 max_carrier = intp->srch_range[demod] / 1000;
45 carr_offset = ge2comp(carr_offset, 16);
46 agc2_integr = (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8)
47 | stv0900_read_reg(i_params,
48 R0900_P1_AGC2I0);
49 max_carrier = i_params->dmd1_srch_range / 1000;
50 break;
51 case STV0900_DEMOD_2:
52 carr_offset = (stv0900_read_reg(i_params, R0900_P2_CFR2) << 8)
53 | stv0900_read_reg(i_params,
54 R0900_P2_CFR1);
55 carr_offset = ge2comp(carr_offset, 16);
56 agc2_integr = (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
57 | stv0900_read_reg(i_params,
58 R0900_P2_AGC2I0);
59 max_carrier = i_params->dmd2_srch_range / 1000;
60 break;
61 }
62 53
63 max_carrier += (max_carrier / 10); 54 max_carrier += (max_carrier / 10);
64 max_carrier = 65536 * (max_carrier / 2); 55 max_carrier = 65536 * (max_carrier / 2);
65 max_carrier /= i_params->mclk / 1000; 56 max_carrier /= intp->mclk / 1000;
66 if (max_carrier > 0x4000) 57 if (max_carrier > 0x4000)
67 max_carrier = 0x4000; 58 max_carrier = 0x4000;
68 59
69 if ((agc2_integr > 0x2000) 60 if ((agc2_integr > 0x2000)
70 || (carr_offset > + 2*max_carrier) 61 || (carr_offset > (2 * max_carrier))
71 || (carr_offset < -2*max_carrier)) 62 || (carr_offset < (-2 * max_carrier)))
72 no_signal = TRUE; 63 no_signal = TRUE;
73 else
74 no_signal = FALSE;
75 64
76 return no_signal; 65 return no_signal;
77} 66}
78 67
79static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params, 68static void stv0900_get_sw_loop_params(struct stv0900_internal *intp,
80 s32 *frequency_inc, s32 *sw_timeout, 69 s32 *frequency_inc, s32 *sw_timeout,
81 s32 *steps, 70 s32 *steps,
82 enum fe_stv0900_demod_num demod) 71 enum fe_stv0900_demod_num demod)
@@ -85,30 +74,19 @@ static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params,
85 74
86 enum fe_stv0900_search_standard standard; 75 enum fe_stv0900_search_standard standard;
87 76
88 switch (demod) { 77 srate = intp->symbol_rate[demod];
89 case STV0900_DEMOD_1: 78 max_carrier = intp->srch_range[demod] / 1000;
90 default: 79 max_carrier += max_carrier / 10;
91 srate = i_params->dmd1_symbol_rate; 80 standard = intp->srch_standard[demod];
92 max_carrier = i_params->dmd1_srch_range / 1000;
93 max_carrier += max_carrier / 10;
94 standard = i_params->dmd1_srch_standard;
95 break;
96 case STV0900_DEMOD_2:
97 srate = i_params->dmd2_symbol_rate;
98 max_carrier = i_params->dmd2_srch_range / 1000;
99 max_carrier += max_carrier / 10;
100 standard = i_params->dmd2_srch_stndrd;
101 break;
102 }
103 81
104 max_carrier = 65536 * (max_carrier / 2); 82 max_carrier = 65536 * (max_carrier / 2);
105 max_carrier /= i_params->mclk / 1000; 83 max_carrier /= intp->mclk / 1000;
106 84
107 if (max_carrier > 0x4000) 85 if (max_carrier > 0x4000)
108 max_carrier = 0x4000; 86 max_carrier = 0x4000;
109 87
110 freq_inc = srate; 88 freq_inc = srate;
111 freq_inc /= i_params->mclk >> 10; 89 freq_inc /= intp->mclk >> 10;
112 freq_inc = freq_inc << 6; 90 freq_inc = freq_inc << 6;
113 91
114 switch (standard) { 92 switch (standard) {
@@ -154,7 +132,7 @@ static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params,
154 132
155} 133}
156 134
157static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params, 135static int stv0900_search_carr_sw_loop(struct stv0900_internal *intp,
158 s32 FreqIncr, s32 Timeout, int zigzag, 136 s32 FreqIncr, s32 Timeout, int zigzag,
159 s32 MaxStep, enum fe_stv0900_demod_num demod) 137 s32 MaxStep, enum fe_stv0900_demod_num demod)
160{ 138{
@@ -164,20 +142,11 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params,
164 freqOffset, 142 freqOffset,
165 max_carrier; 143 max_carrier;
166 144
167 switch (demod) { 145 max_carrier = intp->srch_range[demod] / 1000;
168 case STV0900_DEMOD_1: 146 max_carrier += (max_carrier / 10);
169 default:
170 max_carrier = i_params->dmd1_srch_range / 1000;
171 max_carrier += (max_carrier / 10);
172 break;
173 case STV0900_DEMOD_2:
174 max_carrier = i_params->dmd2_srch_range / 1000;
175 max_carrier += (max_carrier / 10);
176 break;
177 }
178 147
179 max_carrier = 65536 * (max_carrier / 2); 148 max_carrier = 65536 * (max_carrier / 2);
180 max_carrier /= i_params->mclk / 1000; 149 max_carrier /= intp->mclk / 1000;
181 150
182 if (max_carrier > 0x4000) 151 if (max_carrier > 0x4000)
183 max_carrier = 0x4000; 152 max_carrier = 0x4000;
@@ -190,40 +159,15 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params,
190 stepCpt = 0; 159 stepCpt = 0;
191 160
192 do { 161 do {
193 switch (demod) { 162 stv0900_write_reg(intp, DMDISTATE, 0x1c);
194 case STV0900_DEMOD_1: 163 stv0900_write_reg(intp, CFRINIT1, (freqOffset / 256) & 0xff);
195 default: 164 stv0900_write_reg(intp, CFRINIT0, freqOffset & 0xff);
196 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C); 165 stv0900_write_reg(intp, DMDISTATE, 0x18);
197 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 166 stv0900_write_bits(intp, ALGOSWRST, 1);
198 (freqOffset / 256) & 0xFF); 167
199 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 168 if (intp->chip_id == 0x12) {
200 freqOffset & 0xFF); 169 stv0900_write_bits(intp, RST_HWARE, 1);
201 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); 170 stv0900_write_bits(intp, RST_HWARE, 0);
202 stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 1);
203
204 if (i_params->chip_id == 0x12) {
205 stv0900_write_bits(i_params,
206 F0900_P1_RST_HWARE, 1);
207 stv0900_write_bits(i_params,
208 F0900_P1_RST_HWARE, 0);
209 }
210 break;
211 case STV0900_DEMOD_2:
212 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C);
213 stv0900_write_reg(i_params, R0900_P2_CFRINIT1,
214 (freqOffset / 256) & 0xFF);
215 stv0900_write_reg(i_params, R0900_P2_CFRINIT0,
216 freqOffset & 0xFF);
217 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
218 stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 1);
219
220 if (i_params->chip_id == 0x12) {
221 stv0900_write_bits(i_params,
222 F0900_P2_RST_HWARE, 1);
223 stv0900_write_bits(i_params,
224 F0900_P2_RST_HWARE, 0);
225 }
226 break;
227 } 171 }
228 172
229 if (zigzag == TRUE) { 173 if (zigzag == TRUE) {
@@ -235,8 +179,8 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params,
235 freqOffset += + 2 * FreqIncr; 179 freqOffset += + 2 * FreqIncr;
236 180
237 stepCpt++; 181 stepCpt++;
238 lock = stv0900_get_demod_lock(i_params, demod, Timeout); 182 lock = stv0900_get_demod_lock(intp, demod, Timeout);
239 no_signal = stv0900_check_signal_presence(i_params, demod); 183 no_signal = stv0900_check_signal_presence(intp, demod);
240 184
241 } while ((lock == FALSE) 185 } while ((lock == FALSE)
242 && (no_signal == FALSE) 186 && (no_signal == FALSE)
@@ -244,269 +188,138 @@ static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params,
244 && ((freqOffset + FreqIncr) > -max_carrier) 188 && ((freqOffset + FreqIncr) > -max_carrier)
245 && (stepCpt < MaxStep)); 189 && (stepCpt < MaxStep));
246 190
247 switch (demod) { 191 stv0900_write_bits(intp, ALGOSWRST, 0);
248 case STV0900_DEMOD_1:
249 default:
250 stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 0);
251 break;
252 case STV0900_DEMOD_2:
253 stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 0);
254 break;
255 }
256 192
257 return lock; 193 return lock;
258} 194}
259 195
260int stv0900_sw_algo(struct stv0900_internal *i_params, 196static int stv0900_sw_algo(struct stv0900_internal *intp,
261 enum fe_stv0900_demod_num demod) 197 enum fe_stv0900_demod_num demod)
262{ 198{
263 int lock = FALSE; 199 int lock = FALSE,
264 200 no_signal,
265 int no_signal, 201 zigzag;
266 zigzag; 202 s32 s2fw,
267 s32 dvbs2_fly_wheel; 203 fqc_inc,
268 204 sft_stp_tout,
269 s32 freqIncrement, softStepTimeout, trialCounter, max_steps; 205 trial_cntr,
270 206 max_steps;
271 stv0900_get_sw_loop_params(i_params, &freqIncrement, &softStepTimeout, 207
208 stv0900_get_sw_loop_params(intp, &fqc_inc, &sft_stp_tout,
272 &max_steps, demod); 209 &max_steps, demod);
273 switch (demod) { 210 switch (intp->srch_standard[demod]) {
274 case STV0900_DEMOD_1: 211 case STV0900_SEARCH_DVBS1:
275 default: 212 case STV0900_SEARCH_DSS:
276 switch (i_params->dmd1_srch_standard) { 213 if (intp->chip_id >= 0x20)
277 case STV0900_SEARCH_DVBS1: 214 stv0900_write_reg(intp, CARFREQ, 0x3b);
278 case STV0900_SEARCH_DSS: 215 else
279 if (i_params->chip_id >= 0x20) 216 stv0900_write_reg(intp, CARFREQ, 0xef);
280 stv0900_write_reg(i_params, R0900_P1_CARFREQ,
281 0x3B);
282 else
283 stv0900_write_reg(i_params, R0900_P1_CARFREQ,
284 0xef);
285
286 stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 0x49);
287 zigzag = FALSE;
288 break;
289 case STV0900_SEARCH_DVBS2:
290 if (i_params->chip_id >= 0x20)
291 stv0900_write_reg(i_params, R0900_P1_CORRELABS,
292 0x79);
293 else
294 stv0900_write_reg(i_params, R0900_P1_CORRELABS,
295 0x68);
296 217
297 stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 218 stv0900_write_reg(intp, DMDCFGMD, 0x49);
298 0x89); 219 zigzag = FALSE;
220 break;
221 case STV0900_SEARCH_DVBS2:
222 if (intp->chip_id >= 0x20)
223 stv0900_write_reg(intp, CORRELABS, 0x79);
224 else
225 stv0900_write_reg(intp, CORRELABS, 0x68);
299 226
300 zigzag = TRUE; 227 stv0900_write_reg(intp, DMDCFGMD, 0x89);
301 break;
302 case STV0900_AUTO_SEARCH:
303 default:
304 if (i_params->chip_id >= 0x20) {
305 stv0900_write_reg(i_params, R0900_P1_CARFREQ,
306 0x3B);
307 stv0900_write_reg(i_params, R0900_P1_CORRELABS,
308 0x79);
309 } else {
310 stv0900_write_reg(i_params, R0900_P1_CARFREQ,
311 0xef);
312 stv0900_write_reg(i_params, R0900_P1_CORRELABS,
313 0x68);
314 }
315 228
316 stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 229 zigzag = TRUE;
317 0xc9); 230 break;
318 zigzag = FALSE; 231 case STV0900_AUTO_SEARCH:
319 break; 232 default:
233 if (intp->chip_id >= 0x20) {
234 stv0900_write_reg(intp, CARFREQ, 0x3b);
235 stv0900_write_reg(intp, CORRELABS, 0x79);
236 } else {
237 stv0900_write_reg(intp, CARFREQ, 0xef);
238 stv0900_write_reg(intp, CORRELABS, 0x68);
320 } 239 }
321 240
322 trialCounter = 0; 241 stv0900_write_reg(intp, DMDCFGMD, 0xc9);
323 do { 242 zigzag = FALSE;
324 lock = stv0900_search_carr_sw_loop(i_params,
325 freqIncrement,
326 softStepTimeout,
327 zigzag,
328 max_steps,
329 demod);
330 no_signal = stv0900_check_signal_presence(i_params,
331 demod);
332 trialCounter++;
333 if ((lock == TRUE)
334 || (no_signal == TRUE)
335 || (trialCounter == 2)) {
336
337 if (i_params->chip_id >= 0x20) {
338 stv0900_write_reg(i_params,
339 R0900_P1_CARFREQ,
340 0x49);
341 stv0900_write_reg(i_params,
342 R0900_P1_CORRELABS,
343 0x9e);
344 } else {
345 stv0900_write_reg(i_params,
346 R0900_P1_CARFREQ,
347 0xed);
348 stv0900_write_reg(i_params,
349 R0900_P1_CORRELABS,
350 0x88);
351 }
352
353 if ((lock == TRUE) && (stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS2_FOUND)) {
354 msleep(softStepTimeout);
355 dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P1_FLYWHEEL_CPT);
356
357 if (dvbs2_fly_wheel < 0xd) {
358 msleep(softStepTimeout);
359 dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P1_FLYWHEEL_CPT);
360 }
361
362 if (dvbs2_fly_wheel < 0xd) {
363 lock = FALSE;
364
365 if (trialCounter < 2) {
366 if (i_params->chip_id >= 0x20)
367 stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x79);
368 else
369 stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x68);
370
371 stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 0x89);
372 }
373 }
374 }
375 }
376
377 } while ((lock == FALSE)
378 && (trialCounter < 2)
379 && (no_signal == FALSE));
380
381 break; 243 break;
382 case STV0900_DEMOD_2: 244 }
383 switch (i_params->dmd2_srch_stndrd) {
384 case STV0900_SEARCH_DVBS1:
385 case STV0900_SEARCH_DSS:
386 if (i_params->chip_id >= 0x20)
387 stv0900_write_reg(i_params, R0900_P2_CARFREQ,
388 0x3b);
389 else
390 stv0900_write_reg(i_params, R0900_P2_CARFREQ,
391 0xef);
392
393 stv0900_write_reg(i_params, R0900_P2_DMDCFGMD,
394 0x49);
395 zigzag = FALSE;
396 break;
397 case STV0900_SEARCH_DVBS2:
398 if (i_params->chip_id >= 0x20)
399 stv0900_write_reg(i_params, R0900_P2_CORRELABS,
400 0x79);
401 else
402 stv0900_write_reg(i_params, R0900_P2_CORRELABS,
403 0x68);
404 245
405 stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0x89); 246 trial_cntr = 0;
406 zigzag = TRUE; 247 do {
407 break; 248 lock = stv0900_search_carr_sw_loop(intp,
408 case STV0900_AUTO_SEARCH: 249 fqc_inc,
409 default: 250 sft_stp_tout,
410 if (i_params->chip_id >= 0x20) { 251 zigzag,
411 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 252 max_steps,
412 0x3b); 253 demod);
413 stv0900_write_reg(i_params, R0900_P2_CORRELABS, 254 no_signal = stv0900_check_signal_presence(intp, demod);
414 0x79); 255 trial_cntr++;
256 if ((lock == TRUE)
257 || (no_signal == TRUE)
258 || (trial_cntr == 2)) {
259
260 if (intp->chip_id >= 0x20) {
261 stv0900_write_reg(intp, CARFREQ, 0x49);
262 stv0900_write_reg(intp, CORRELABS, 0x9e);
415 } else { 263 } else {
416 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 264 stv0900_write_reg(intp, CARFREQ, 0xed);
417 0xef); 265 stv0900_write_reg(intp, CORRELABS, 0x88);
418 stv0900_write_reg(i_params, R0900_P2_CORRELABS,
419 0x68);
420 } 266 }
421 267
422 stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0xc9); 268 if ((stv0900_get_bits(intp, HEADER_MODE) ==
423 269 STV0900_DVBS2_FOUND) &&
424 zigzag = FALSE; 270 (lock == TRUE)) {
425 break; 271 msleep(sft_stp_tout);
426 } 272 s2fw = stv0900_get_bits(intp, FLYWHEEL_CPT);
427
428 trialCounter = 0;
429 273
430 do { 274 if (s2fw < 0xd) {
431 lock = stv0900_search_carr_sw_loop(i_params, 275 msleep(sft_stp_tout);
432 freqIncrement, 276 s2fw = stv0900_get_bits(intp,
433 softStepTimeout, 277 FLYWHEEL_CPT);
434 zigzag,
435 max_steps,
436 demod);
437 no_signal = stv0900_check_signal_presence(i_params,
438 demod);
439 trialCounter++;
440 if ((lock == TRUE)
441 || (no_signal == TRUE)
442 || (trialCounter == 2)) {
443 if (i_params->chip_id >= 0x20) {
444 stv0900_write_reg(i_params,
445 R0900_P2_CARFREQ,
446 0x49);
447 stv0900_write_reg(i_params,
448 R0900_P2_CORRELABS,
449 0x9e);
450 } else {
451 stv0900_write_reg(i_params,
452 R0900_P2_CARFREQ,
453 0xed);
454 stv0900_write_reg(i_params,
455 R0900_P2_CORRELABS,
456 0x88);
457 } 278 }
458 279
459 if ((lock == TRUE) && (stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS2_FOUND)) { 280 if (s2fw < 0xd) {
460 msleep(softStepTimeout); 281 lock = FALSE;
461 dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P2_FLYWHEEL_CPT);
462 if (dvbs2_fly_wheel < 0xd) {
463 msleep(softStepTimeout);
464 dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P2_FLYWHEEL_CPT);
465 }
466 282
467 if (dvbs2_fly_wheel < 0xd) { 283 if (trial_cntr < 2) {
468 lock = FALSE; 284 if (intp->chip_id >= 0x20)
469 if (trialCounter < 2) { 285 stv0900_write_reg(intp,
470 if (i_params->chip_id >= 0x20) 286 CORRELABS,
471 stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x79); 287 0x79);
472 else 288 else
473 stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x68); 289 stv0900_write_reg(intp,
290 CORRELABS,
291 0x68);
474 292
475 stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0x89); 293 stv0900_write_reg(intp,
476 } 294 DMDCFGMD,
295 0x89);
477 } 296 }
478 } 297 }
479 } 298 }
299 }
480 300
481 } while ((lock == FALSE) && (trialCounter < 2) && (no_signal == FALSE)); 301 } while ((lock == FALSE)
482 302 && (trial_cntr < 2)
483 break; 303 && (no_signal == FALSE));
484 }
485 304
486 return lock; 305 return lock;
487} 306}
488 307
489static u32 stv0900_get_symbol_rate(struct stv0900_internal *i_params, 308static u32 stv0900_get_symbol_rate(struct stv0900_internal *intp,
490 u32 mclk, 309 u32 mclk,
491 enum fe_stv0900_demod_num demod) 310 enum fe_stv0900_demod_num demod)
492{ 311{
493 s32 sfr_field3, sfr_field2, sfr_field1, sfr_field0, 312 s32 rem1, rem2, intval1, intval2, srate;
494 rem1, rem2, intval1, intval2, srate; 313
495 314 srate = (stv0900_get_bits(intp, SYMB_FREQ3) << 24) +
496 dmd_reg(sfr_field3, F0900_P1_SYMB_FREQ3, F0900_P2_SYMB_FREQ3); 315 (stv0900_get_bits(intp, SYMB_FREQ2) << 16) +
497 dmd_reg(sfr_field2, F0900_P1_SYMB_FREQ2, F0900_P2_SYMB_FREQ2); 316 (stv0900_get_bits(intp, SYMB_FREQ1) << 8) +
498 dmd_reg(sfr_field1, F0900_P1_SYMB_FREQ1, F0900_P2_SYMB_FREQ1); 317 (stv0900_get_bits(intp, SYMB_FREQ0));
499 dmd_reg(sfr_field0, F0900_P1_SYMB_FREQ0, F0900_P2_SYMB_FREQ0);
500
501 srate = (stv0900_get_bits(i_params, sfr_field3) << 24) +
502 (stv0900_get_bits(i_params, sfr_field2) << 16) +
503 (stv0900_get_bits(i_params, sfr_field1) << 8) +
504 (stv0900_get_bits(i_params, sfr_field0));
505 dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n", 318 dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n",
506 srate, stv0900_get_bits(i_params, sfr_field0), 319 srate, stv0900_get_bits(intp, SYMB_FREQ0),
507 stv0900_get_bits(i_params, sfr_field1), 320 stv0900_get_bits(intp, SYMB_FREQ1),
508 stv0900_get_bits(i_params, sfr_field2), 321 stv0900_get_bits(intp, SYMB_FREQ2),
509 stv0900_get_bits(i_params, sfr_field3)); 322 stv0900_get_bits(intp, SYMB_FREQ3));
510 323
511 intval1 = (mclk) >> 16; 324 intval1 = (mclk) >> 16;
512 intval2 = (srate) >> 16; 325 intval2 = (srate) >> 16;
@@ -520,18 +333,15 @@ static u32 stv0900_get_symbol_rate(struct stv0900_internal *i_params,
520 return srate; 333 return srate;
521} 334}
522 335
523static void stv0900_set_symbol_rate(struct stv0900_internal *i_params, 336static void stv0900_set_symbol_rate(struct stv0900_internal *intp,
524 u32 mclk, u32 srate, 337 u32 mclk, u32 srate,
525 enum fe_stv0900_demod_num demod) 338 enum fe_stv0900_demod_num demod)
526{ 339{
527 s32 sfr_init_reg;
528 u32 symb; 340 u32 symb;
529 341
530 dprintk(KERN_INFO "%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk, 342 dprintk("%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk,
531 srate, demod); 343 srate, demod);
532 344
533 dmd_reg(sfr_init_reg, R0900_P1_SFRINIT1, R0900_P2_SFRINIT1);
534
535 if (srate > 60000000) { 345 if (srate > 60000000) {
536 symb = srate << 4; 346 symb = srate << 4;
537 symb /= (mclk >> 12); 347 symb /= (mclk >> 12);
@@ -543,19 +353,16 @@ static void stv0900_set_symbol_rate(struct stv0900_internal *i_params,
543 symb /= (mclk >> 7); 353 symb /= (mclk >> 7);
544 } 354 }
545 355
546 stv0900_write_reg(i_params, sfr_init_reg, (symb >> 8) & 0x7F); 356 stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0x7f);
547 stv0900_write_reg(i_params, sfr_init_reg + 1, (symb & 0xFF)); 357 stv0900_write_reg(intp, SFRINIT1 + 1, (symb & 0xff));
548} 358}
549 359
550static void stv0900_set_max_symbol_rate(struct stv0900_internal *i_params, 360static void stv0900_set_max_symbol_rate(struct stv0900_internal *intp,
551 u32 mclk, u32 srate, 361 u32 mclk, u32 srate,
552 enum fe_stv0900_demod_num demod) 362 enum fe_stv0900_demod_num demod)
553{ 363{
554 s32 sfr_max_reg;
555 u32 symb; 364 u32 symb;
556 365
557 dmd_reg(sfr_max_reg, R0900_P1_SFRUP1, R0900_P2_SFRUP1);
558
559 srate = 105 * (srate / 100); 366 srate = 105 * (srate / 100);
560 367
561 if (srate > 60000000) { 368 if (srate > 60000000) {
@@ -570,23 +377,20 @@ static void stv0900_set_max_symbol_rate(struct stv0900_internal *i_params,
570 } 377 }
571 378
572 if (symb < 0x7fff) { 379 if (symb < 0x7fff) {
573 stv0900_write_reg(i_params, sfr_max_reg, (symb >> 8) & 0x7F); 380 stv0900_write_reg(intp, SFRUP1, (symb >> 8) & 0x7f);
574 stv0900_write_reg(i_params, sfr_max_reg + 1, (symb & 0xFF)); 381 stv0900_write_reg(intp, SFRUP1 + 1, (symb & 0xff));
575 } else { 382 } else {
576 stv0900_write_reg(i_params, sfr_max_reg, 0x7F); 383 stv0900_write_reg(intp, SFRUP1, 0x7f);
577 stv0900_write_reg(i_params, sfr_max_reg + 1, 0xFF); 384 stv0900_write_reg(intp, SFRUP1 + 1, 0xff);
578 } 385 }
579} 386}
580 387
581static void stv0900_set_min_symbol_rate(struct stv0900_internal *i_params, 388static void stv0900_set_min_symbol_rate(struct stv0900_internal *intp,
582 u32 mclk, u32 srate, 389 u32 mclk, u32 srate,
583 enum fe_stv0900_demod_num demod) 390 enum fe_stv0900_demod_num demod)
584{ 391{
585 s32 sfr_min_reg;
586 u32 symb; 392 u32 symb;
587 393
588 dmd_reg(sfr_min_reg, R0900_P1_SFRLOW1, R0900_P2_SFRLOW1);
589
590 srate = 95 * (srate / 100); 394 srate = 95 * (srate / 100);
591 if (srate > 60000000) { 395 if (srate > 60000000) {
592 symb = srate << 4; 396 symb = srate << 4;
@@ -601,22 +405,20 @@ static void stv0900_set_min_symbol_rate(struct stv0900_internal *i_params,
601 symb /= (mclk >> 7); 405 symb /= (mclk >> 7);
602 } 406 }
603 407
604 stv0900_write_reg(i_params, sfr_min_reg, (symb >> 8) & 0xFF); 408 stv0900_write_reg(intp, SFRLOW1, (symb >> 8) & 0xff);
605 stv0900_write_reg(i_params, sfr_min_reg + 1, (symb & 0xFF)); 409 stv0900_write_reg(intp, SFRLOW1 + 1, (symb & 0xff));
606} 410}
607 411
608static s32 stv0900_get_timing_offst(struct stv0900_internal *i_params, 412static s32 stv0900_get_timing_offst(struct stv0900_internal *intp,
609 u32 srate, 413 u32 srate,
610 enum fe_stv0900_demod_num demod) 414 enum fe_stv0900_demod_num demod)
611{ 415{
612 s32 tmgreg, 416 s32 timingoffset;
613 timingoffset;
614 417
615 dmd_reg(tmgreg, R0900_P1_TMGREG2, R0900_P2_TMGREG2);
616 418
617 timingoffset = (stv0900_read_reg(i_params, tmgreg) << 16) + 419 timingoffset = (stv0900_read_reg(intp, TMGREG2) << 16) +
618 (stv0900_read_reg(i_params, tmgreg + 1) << 8) + 420 (stv0900_read_reg(intp, TMGREG2 + 1) << 8) +
619 (stv0900_read_reg(i_params, tmgreg + 2)); 421 (stv0900_read_reg(intp, TMGREG2 + 2));
620 422
621 timingoffset = ge2comp(timingoffset, 24); 423 timingoffset = ge2comp(timingoffset, 24);
622 424
@@ -630,22 +432,19 @@ static s32 stv0900_get_timing_offst(struct stv0900_internal *i_params,
630 return timingoffset; 432 return timingoffset;
631} 433}
632 434
633static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *i_params, 435static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *intp,
634 enum fe_stv0900_demod_num demod) 436 enum fe_stv0900_demod_num demod)
635{ 437{
636 s32 rolloff, man_fld, matstr_reg, rolloff_ctl_fld; 438 s32 rolloff;
637 439
638 dmd_reg(man_fld, F0900_P1_MANUAL_ROLLOFF, F0900_P2_MANUAL_ROLLOFF); 440 if (intp->chip_id == 0x10) {
639 dmd_reg(matstr_reg, R0900_P1_MATSTR1, R0900_P2_MATSTR1); 441 stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
640 dmd_reg(rolloff_ctl_fld, F0900_P1_ROLLOFF_CONTROL, 442 rolloff = stv0900_read_reg(intp, MATSTR1) & 0x03;
641 F0900_P2_ROLLOFF_CONTROL); 443 stv0900_write_bits(intp, ROLLOFF_CONTROL, rolloff);
642 444 } else if (intp->chip_id <= 0x20)
643 if (i_params->chip_id == 0x10) { 445 stv0900_write_bits(intp, MANUALSX_ROLLOFF, 0);
644 stv0900_write_bits(i_params, man_fld, 1); 446 else /* cut 3.0 */
645 rolloff = stv0900_read_reg(i_params, matstr_reg) & 0x03; 447 stv0900_write_bits(intp, MANUALS2_ROLLOFF, 0);
646 stv0900_write_bits(i_params, rolloff_ctl_fld, rolloff);
647 } else
648 stv0900_write_bits(i_params, man_fld, 0);
649} 448}
650 449
651static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro) 450static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro)
@@ -668,84 +467,47 @@ static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro)
668 return srate + (srate * rolloff) / 100; 467 return srate + (srate * rolloff) / 100;
669} 468}
670 469
671static int stv0900_check_timing_lock(struct stv0900_internal *i_params, 470static int stv0900_check_timing_lock(struct stv0900_internal *intp,
672 enum fe_stv0900_demod_num demod) 471 enum fe_stv0900_demod_num demod)
673{ 472{
674 int timingLock = FALSE; 473 int timingLock = FALSE;
675 s32 i, 474 s32 i,
676 timingcpt = 0; 475 timingcpt = 0;
677 u8 carFreq, 476 u8 car_freq,
678 tmgTHhigh, 477 tmg_th_high,
679 tmgTHLow; 478 tmg_th_low;
680 479
681 switch (demod) { 480 car_freq = stv0900_read_reg(intp, CARFREQ);
682 case STV0900_DEMOD_1: 481 tmg_th_high = stv0900_read_reg(intp, TMGTHRISE);
683 default: 482 tmg_th_low = stv0900_read_reg(intp, TMGTHFALL);
684 carFreq = stv0900_read_reg(i_params, R0900_P1_CARFREQ); 483 stv0900_write_reg(intp, TMGTHRISE, 0x20);
685 tmgTHhigh = stv0900_read_reg(i_params, R0900_P1_TMGTHRISE); 484 stv0900_write_reg(intp, TMGTHFALL, 0x0);
686 tmgTHLow = stv0900_read_reg(i_params, R0900_P1_TMGTHFALL); 485 stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
687 stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0x20); 486 stv0900_write_reg(intp, RTC, 0x80);
688 stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0x0); 487 stv0900_write_reg(intp, RTCS2, 0x40);
689 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); 488 stv0900_write_reg(intp, CARFREQ, 0x0);
690 stv0900_write_reg(i_params, R0900_P1_RTC, 0x80); 489 stv0900_write_reg(intp, CFRINIT1, 0x0);
691 stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x40); 490 stv0900_write_reg(intp, CFRINIT0, 0x0);
692 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x0); 491 stv0900_write_reg(intp, AGC2REF, 0x65);
693 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0x0); 492 stv0900_write_reg(intp, DMDISTATE, 0x18);
694 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0x0); 493 msleep(7);
695 stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x65); 494
696 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); 495 for (i = 0; i < 10; i++) {
697 msleep(7); 496 if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2)
698 497 timingcpt++;
699 for (i = 0; i < 10; i++) { 498
700 if (stv0900_get_bits(i_params, F0900_P1_TMGLOCK_QUALITY) >= 2) 499 msleep(1);
701 timingcpt++; 500 }
702
703 msleep(1);
704 }
705
706 if (timingcpt >= 3)
707 timingLock = TRUE;
708
709 stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
710 stv0900_write_reg(i_params, R0900_P1_RTC, 0x88);
711 stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x68);
712 stv0900_write_reg(i_params, R0900_P1_CARFREQ, carFreq);
713 stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, tmgTHhigh);
714 stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, tmgTHLow);
715 break;
716 case STV0900_DEMOD_2:
717 carFreq = stv0900_read_reg(i_params, R0900_P2_CARFREQ);
718 tmgTHhigh = stv0900_read_reg(i_params, R0900_P2_TMGTHRISE);
719 tmgTHLow = stv0900_read_reg(i_params, R0900_P2_TMGTHFALL);
720 stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0x20);
721 stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0);
722 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0);
723 stv0900_write_reg(i_params, R0900_P2_RTC, 0x80);
724 stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x40);
725 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x0);
726 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0x0);
727 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0x0);
728 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x65);
729 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
730 msleep(5);
731 for (i = 0; i < 10; i++) {
732 if (stv0900_get_bits(i_params, F0900_P2_TMGLOCK_QUALITY) >= 2)
733 timingcpt++;
734 501
735 msleep(1); 502 if (timingcpt >= 3)
736 } 503 timingLock = TRUE;
737 504
738 if (timingcpt >= 3) 505 stv0900_write_reg(intp, AGC2REF, 0x38);
739 timingLock = TRUE; 506 stv0900_write_reg(intp, RTC, 0x88);
740 507 stv0900_write_reg(intp, RTCS2, 0x68);
741 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38); 508 stv0900_write_reg(intp, CARFREQ, car_freq);
742 stv0900_write_reg(i_params, R0900_P2_RTC, 0x88); 509 stv0900_write_reg(intp, TMGTHRISE, tmg_th_high);
743 stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x68); 510 stv0900_write_reg(intp, TMGTHFALL, tmg_th_low);
744 stv0900_write_reg(i_params, R0900_P2_CARFREQ, carFreq);
745 stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, tmgTHhigh);
746 stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, tmgTHLow);
747 break;
748 }
749 511
750 return timingLock; 512 return timingLock;
751} 513}
@@ -754,142 +516,119 @@ static int stv0900_get_demod_cold_lock(struct dvb_frontend *fe,
754 s32 demod_timeout) 516 s32 demod_timeout)
755{ 517{
756 struct stv0900_state *state = fe->demodulator_priv; 518 struct stv0900_state *state = fe->demodulator_priv;
757 struct stv0900_internal *i_params = state->internal; 519 struct stv0900_internal *intp = state->internal;
758 enum fe_stv0900_demod_num demod = state->demod; 520 enum fe_stv0900_demod_num demod = state->demod;
521 int lock = FALSE,
522 d = demod;
523 s32 srate,
524 search_range,
525 locktimeout,
526 currier_step,
527 nb_steps,
528 current_step,
529 direction,
530 tuner_freq,
531 timeout,
532 freq;
759 533
760 int lock = FALSE; 534 srate = intp->symbol_rate[d];
761 s32 srate, search_range, locktimeout, 535 search_range = intp->srch_range[d];
762 currier_step, nb_steps, current_step,
763 direction, tuner_freq, timeout;
764
765 switch (demod) {
766 case STV0900_DEMOD_1:
767 default:
768 srate = i_params->dmd1_symbol_rate;
769 search_range = i_params->dmd1_srch_range;
770 break;
771
772 case STV0900_DEMOD_2:
773 srate = i_params->dmd2_symbol_rate;
774 search_range = i_params->dmd2_srch_range;
775 break;
776 }
777 536
778 if (srate >= 10000000) 537 if (srate >= 10000000)
779 locktimeout = demod_timeout / 3; 538 locktimeout = demod_timeout / 3;
780 else 539 else
781 locktimeout = demod_timeout / 2; 540 locktimeout = demod_timeout / 2;
782 541
783 lock = stv0900_get_demod_lock(i_params, demod, locktimeout); 542 lock = stv0900_get_demod_lock(intp, d, locktimeout);
784
785 if (lock == FALSE) {
786 if (srate >= 10000000) {
787 if (stv0900_check_timing_lock(i_params, demod) == TRUE) {
788 switch (demod) {
789 case STV0900_DEMOD_1:
790 default:
791 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f);
792 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15);
793 break;
794 case STV0900_DEMOD_2:
795 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f);
796 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15);
797 break;
798 }
799 543
800 lock = stv0900_get_demod_lock(i_params, demod, demod_timeout); 544 if (lock != FALSE)
801 } else 545 return lock;
802 lock = FALSE; 546
803 } else { 547 if (srate >= 10000000) {
804 if (srate <= 4000000) 548 if (stv0900_check_timing_lock(intp, d) == TRUE) {
805 currier_step = 1000; 549 stv0900_write_reg(intp, DMDISTATE, 0x1f);
806 else if (srate <= 7000000) 550 stv0900_write_reg(intp, DMDISTATE, 0x15);
807 currier_step = 2000; 551 lock = stv0900_get_demod_lock(intp, d, demod_timeout);
808 else if (srate <= 10000000) 552 } else
809 currier_step = 3000; 553 lock = FALSE;
810 else 554
811 currier_step = 5000; 555 return lock;
812 556 }
813 nb_steps = ((search_range / 1000) / currier_step); 557
814 nb_steps /= 2; 558 if (intp->chip_id <= 0x20) {
815 nb_steps = (2 * (nb_steps + 1)); 559 if (srate <= 1000000)
816 if (nb_steps < 0) 560 currier_step = 500;
817 nb_steps = 2; 561 else if (srate <= 4000000)
818 else if (nb_steps > 12) 562 currier_step = 1000;
819 nb_steps = 12; 563 else if (srate <= 7000000)
820 564 currier_step = 2000;
821 current_step = 1; 565 else if (srate <= 10000000)
822 direction = 1; 566 currier_step = 3000;
567 else
568 currier_step = 5000;
569
570 if (srate >= 2000000) {
823 timeout = (demod_timeout / 3); 571 timeout = (demod_timeout / 3);
824 if (timeout > 1000) 572 if (timeout > 1000)
825 timeout = 1000; 573 timeout = 1000;
574 } else
575 timeout = (demod_timeout / 2);
576 } else {
577 /*cut 3.0 */
578 currier_step = srate / 4000;
579 timeout = (demod_timeout * 3) / 4;
580 }
826 581
827 switch (demod) { 582 nb_steps = ((search_range / 1000) / currier_step);
828 case STV0900_DEMOD_1:
829 default:
830 if (lock == FALSE) {
831 tuner_freq = i_params->tuner1_freq;
832 i_params->tuner1_bw = stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + i_params->dmd1_symbol_rate;
833 583
834 while ((current_step <= nb_steps) && (lock == FALSE)) { 584 if ((nb_steps % 2) != 0)
585 nb_steps += 1;
835 586
836 if (direction > 0) 587 if (nb_steps <= 0)
837 tuner_freq += (current_step * currier_step); 588 nb_steps = 2;
838 else 589 else if (nb_steps > 12)
839 tuner_freq -= (current_step * currier_step); 590 nb_steps = 12;
840
841 stv0900_set_tuner(fe, tuner_freq, i_params->tuner1_bw);
842 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C);
843 if (i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS2) {
844 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
845 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
846 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
847 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
848 }
849
850 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0);
851 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0);
852 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F);
853 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15);
854 lock = stv0900_get_demod_lock(i_params, demod, timeout);
855 direction *= -1;
856 current_step++;
857 }
858 }
859 break;
860 case STV0900_DEMOD_2:
861 if (lock == FALSE) {
862 tuner_freq = i_params->tuner2_freq;
863 i_params->tuner2_bw = stv0900_carrier_width(srate, i_params->rolloff) + srate;
864 591
865 while ((current_step <= nb_steps) && (lock == FALSE)) { 592 current_step = 1;
593 direction = 1;
866 594
867 if (direction > 0) 595 if (intp->chip_id <= 0x20) {
868 tuner_freq += (current_step * currier_step); 596 tuner_freq = intp->freq[d];
869 else 597 intp->bw[d] = stv0900_carrier_width(intp->symbol_rate[d],
870 tuner_freq -= (current_step * currier_step); 598 intp->rolloff) + intp->symbol_rate[d];
871 599 } else
872 stv0900_set_tuner(fe, tuner_freq, i_params->tuner2_bw); 600 tuner_freq = 0;
873 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C); 601
874 if (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS2) { 602 while ((current_step <= nb_steps) && (lock == FALSE)) {
875 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0); 603 if (direction > 0)
876 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); 604 tuner_freq += (current_step * currier_step);
877 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); 605 else
878 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); 606 tuner_freq -= (current_step * currier_step);
879 } 607
880 608 if (intp->chip_id <= 0x20) {
881 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0); 609 if (intp->tuner_type[d] == 3)
882 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0); 610 stv0900_set_tuner_auto(intp, tuner_freq,
883 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); 611 intp->bw[d], demod);
884 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15); 612 else
885 lock = stv0900_get_demod_lock(i_params, demod, timeout); 613 stv0900_set_tuner(fe, tuner_freq, intp->bw[d]);
886 direction *= -1; 614
887 current_step++; 615 stv0900_write_reg(intp, DMDISTATE, 0x1c);
888 } 616 stv0900_write_reg(intp, CFRINIT1, 0);
889 } 617 stv0900_write_reg(intp, CFRINIT0, 0);
890 break; 618 stv0900_write_reg(intp, DMDISTATE, 0x1f);
891 } 619 stv0900_write_reg(intp, DMDISTATE, 0x15);
620 } else {
621 stv0900_write_reg(intp, DMDISTATE, 0x1c);
622 freq = (tuner_freq * 65536) / (intp->mclk / 1000);
623 stv0900_write_bits(intp, CFR_INIT1, MSB(freq));
624 stv0900_write_bits(intp, CFR_INIT0, LSB(freq));
625 stv0900_write_reg(intp, DMDISTATE, 0x1f);
626 stv0900_write_reg(intp, DMDISTATE, 0x05);
892 } 627 }
628
629 lock = stv0900_get_demod_lock(intp, d, timeout);
630 direction *= -1;
631 current_step++;
893 } 632 }
894 633
895 return lock; 634 return lock;
@@ -931,9 +670,7 @@ static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout,
931 } else if (srate <= 20000000) { 670 } else if (srate <= 20000000) {
932 (*demod_timeout) = 400; 671 (*demod_timeout) = 400;
933 (*fec_timeout) = 130; 672 (*fec_timeout) = 130;
934 } 673 } else {
935
936 else {
937 (*demod_timeout) = 300; 674 (*demod_timeout) = 300;
938 (*fec_timeout) = 100; 675 (*fec_timeout) = 100;
939 } 676 }
@@ -946,95 +683,77 @@ static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout,
946 (*demod_timeout) /= 2; 683 (*demod_timeout) /= 2;
947} 684}
948 685
949static void stv0900_set_viterbi_tracq(struct stv0900_internal *i_params, 686static void stv0900_set_viterbi_tracq(struct stv0900_internal *intp,
950 enum fe_stv0900_demod_num demod) 687 enum fe_stv0900_demod_num demod)
951{ 688{
952 689
953 s32 vth_reg; 690 s32 vth_reg = VTH12;
954 691
955 dprintk(KERN_INFO "%s\n", __func__); 692 dprintk("%s\n", __func__);
956 693
957 dmd_reg(vth_reg, R0900_P1_VTH12, R0900_P2_VTH12); 694 stv0900_write_reg(intp, vth_reg++, 0xd0);
958 695 stv0900_write_reg(intp, vth_reg++, 0x7d);
959 stv0900_write_reg(i_params, vth_reg++, 0xd0); 696 stv0900_write_reg(intp, vth_reg++, 0x53);
960 stv0900_write_reg(i_params, vth_reg++, 0x7d); 697 stv0900_write_reg(intp, vth_reg++, 0x2f);
961 stv0900_write_reg(i_params, vth_reg++, 0x53); 698 stv0900_write_reg(intp, vth_reg++, 0x24);
962 stv0900_write_reg(i_params, vth_reg++, 0x2F); 699 stv0900_write_reg(intp, vth_reg++, 0x1f);
963 stv0900_write_reg(i_params, vth_reg++, 0x24);
964 stv0900_write_reg(i_params, vth_reg++, 0x1F);
965} 700}
966 701
967static void stv0900_set_viterbi_standard(struct stv0900_internal *i_params, 702static void stv0900_set_viterbi_standard(struct stv0900_internal *intp,
968 enum fe_stv0900_search_standard Standard, 703 enum fe_stv0900_search_standard standard,
969 enum fe_stv0900_fec PunctureRate, 704 enum fe_stv0900_fec fec,
970 enum fe_stv0900_demod_num demod) 705 enum fe_stv0900_demod_num demod)
971{ 706{
707 dprintk("%s: ViterbiStandard = ", __func__);
972 708
973 s32 fecmReg, 709 switch (standard) {
974 prvitReg;
975
976 dprintk(KERN_INFO "%s: ViterbiStandard = ", __func__);
977
978 switch (demod) {
979 case STV0900_DEMOD_1:
980 default:
981 fecmReg = R0900_P1_FECM;
982 prvitReg = R0900_P1_PRVIT;
983 break;
984 case STV0900_DEMOD_2:
985 fecmReg = R0900_P2_FECM;
986 prvitReg = R0900_P2_PRVIT;
987 break;
988 }
989
990 switch (Standard) {
991 case STV0900_AUTO_SEARCH: 710 case STV0900_AUTO_SEARCH:
992 dprintk("Auto\n"); 711 dprintk("Auto\n");
993 stv0900_write_reg(i_params, fecmReg, 0x10); 712 stv0900_write_reg(intp, FECM, 0x10);
994 stv0900_write_reg(i_params, prvitReg, 0x3F); 713 stv0900_write_reg(intp, PRVIT, 0x3f);
995 break; 714 break;
996 case STV0900_SEARCH_DVBS1: 715 case STV0900_SEARCH_DVBS1:
997 dprintk("DVBS1\n"); 716 dprintk("DVBS1\n");
998 stv0900_write_reg(i_params, fecmReg, 0x00); 717 stv0900_write_reg(intp, FECM, 0x00);
999 switch (PunctureRate) { 718 switch (fec) {
1000 case STV0900_FEC_UNKNOWN: 719 case STV0900_FEC_UNKNOWN:
1001 default: 720 default:
1002 stv0900_write_reg(i_params, prvitReg, 0x2F); 721 stv0900_write_reg(intp, PRVIT, 0x2f);
1003 break; 722 break;
1004 case STV0900_FEC_1_2: 723 case STV0900_FEC_1_2:
1005 stv0900_write_reg(i_params, prvitReg, 0x01); 724 stv0900_write_reg(intp, PRVIT, 0x01);
1006 break; 725 break;
1007 case STV0900_FEC_2_3: 726 case STV0900_FEC_2_3:
1008 stv0900_write_reg(i_params, prvitReg, 0x02); 727 stv0900_write_reg(intp, PRVIT, 0x02);
1009 break; 728 break;
1010 case STV0900_FEC_3_4: 729 case STV0900_FEC_3_4:
1011 stv0900_write_reg(i_params, prvitReg, 0x04); 730 stv0900_write_reg(intp, PRVIT, 0x04);
1012 break; 731 break;
1013 case STV0900_FEC_5_6: 732 case STV0900_FEC_5_6:
1014 stv0900_write_reg(i_params, prvitReg, 0x08); 733 stv0900_write_reg(intp, PRVIT, 0x08);
1015 break; 734 break;
1016 case STV0900_FEC_7_8: 735 case STV0900_FEC_7_8:
1017 stv0900_write_reg(i_params, prvitReg, 0x20); 736 stv0900_write_reg(intp, PRVIT, 0x20);
1018 break; 737 break;
1019 } 738 }
1020 739
1021 break; 740 break;
1022 case STV0900_SEARCH_DSS: 741 case STV0900_SEARCH_DSS:
1023 dprintk("DSS\n"); 742 dprintk("DSS\n");
1024 stv0900_write_reg(i_params, fecmReg, 0x80); 743 stv0900_write_reg(intp, FECM, 0x80);
1025 switch (PunctureRate) { 744 switch (fec) {
1026 case STV0900_FEC_UNKNOWN: 745 case STV0900_FEC_UNKNOWN:
1027 default: 746 default:
1028 stv0900_write_reg(i_params, prvitReg, 0x13); 747 stv0900_write_reg(intp, PRVIT, 0x13);
1029 break; 748 break;
1030 case STV0900_FEC_1_2: 749 case STV0900_FEC_1_2:
1031 stv0900_write_reg(i_params, prvitReg, 0x01); 750 stv0900_write_reg(intp, PRVIT, 0x01);
1032 break; 751 break;
1033 case STV0900_FEC_2_3: 752 case STV0900_FEC_2_3:
1034 stv0900_write_reg(i_params, prvitReg, 0x02); 753 stv0900_write_reg(intp, PRVIT, 0x02);
1035 break; 754 break;
1036 case STV0900_FEC_6_7: 755 case STV0900_FEC_6_7:
1037 stv0900_write_reg(i_params, prvitReg, 0x10); 756 stv0900_write_reg(intp, PRVIT, 0x10);
1038 break; 757 break;
1039 } 758 }
1040 break; 759 break;
@@ -1043,340 +762,285 @@ static void stv0900_set_viterbi_standard(struct stv0900_internal *i_params,
1043 } 762 }
1044} 763}
1045 764
1046static void stv0900_track_optimization(struct dvb_frontend *fe) 765static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *intp,
766 enum fe_stv0900_demod_num demod)
1047{ 767{
1048 struct stv0900_state *state = fe->demodulator_priv; 768 enum fe_stv0900_fec prate;
1049 struct stv0900_internal *i_params = state->internal; 769 s32 rate_fld = stv0900_get_bits(intp, VIT_CURPUN);
1050 enum fe_stv0900_demod_num demod = state->demod;
1051 770
1052 s32 srate, pilots, aclc, freq1, freq0, 771 switch (rate_fld) {
1053 i = 0, timed, timef, blindTunSw = 0; 772 case 13:
773 prate = STV0900_FEC_1_2;
774 break;
775 case 18:
776 prate = STV0900_FEC_2_3;
777 break;
778 case 21:
779 prate = STV0900_FEC_3_4;
780 break;
781 case 24:
782 prate = STV0900_FEC_5_6;
783 break;
784 case 25:
785 prate = STV0900_FEC_6_7;
786 break;
787 case 26:
788 prate = STV0900_FEC_7_8;
789 break;
790 default:
791 prate = STV0900_FEC_UNKNOWN;
792 break;
793 }
1054 794
1055 enum fe_stv0900_rolloff rolloff; 795 return prate;
1056 enum fe_stv0900_modcode foundModcod; 796}
1057 797
1058 dprintk(KERN_INFO "%s\n", __func__); 798static void stv0900_set_dvbs1_track_car_loop(struct stv0900_internal *intp,
799 enum fe_stv0900_demod_num demod,
800 u32 srate)
801{
802 if (intp->chip_id >= 0x30) {
803 if (srate >= 15000000) {
804 stv0900_write_reg(intp, ACLC, 0x2b);
805 stv0900_write_reg(intp, BCLC, 0x1a);
806 } else if ((srate >= 7000000) && (15000000 > srate)) {
807 stv0900_write_reg(intp, ACLC, 0x0c);
808 stv0900_write_reg(intp, BCLC, 0x1b);
809 } else if (srate < 7000000) {
810 stv0900_write_reg(intp, ACLC, 0x2c);
811 stv0900_write_reg(intp, BCLC, 0x1c);
812 }
1059 813
1060 srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); 814 } else { /*cut 2.0 and 1.x*/
1061 srate += stv0900_get_timing_offst(i_params, srate, demod); 815 stv0900_write_reg(intp, ACLC, 0x1a);
816 stv0900_write_reg(intp, BCLC, 0x09);
817 }
1062 818
1063 switch (demod) { 819}
1064 case STV0900_DEMOD_1:
1065 default:
1066 switch (i_params->dmd1_rslts.standard) {
1067 case STV0900_DVBS1_STANDARD:
1068 if (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH) {
1069 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
1070 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
1071 }
1072 820
1073 stv0900_write_bits(i_params, F0900_P1_ROLLOFF_CONTROL, i_params->rolloff); 821static void stv0900_track_optimization(struct dvb_frontend *fe)
1074 stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1); 822{
1075 stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75); 823 struct stv0900_state *state = fe->demodulator_priv;
1076 break; 824 struct stv0900_internal *intp = state->internal;
1077 case STV0900_DSS_STANDARD: 825 enum fe_stv0900_demod_num demod = state->demod;
1078 if (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH) {
1079 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
1080 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
1081 }
1082 826
1083 stv0900_write_bits(i_params, F0900_P1_ROLLOFF_CONTROL, i_params->rolloff); 827 s32 srate,
1084 stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1); 828 pilots,
1085 stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75); 829 aclc,
1086 break; 830 freq1,
1087 case STV0900_DVBS2_STANDARD: 831 freq0,
1088 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0); 832 i = 0,
1089 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1); 833 timed,
1090 stv0900_write_reg(i_params, R0900_P1_ACLC, 0); 834 timef,
1091 stv0900_write_reg(i_params, R0900_P1_BCLC, 0); 835 blind_tun_sw = 0,
1092 if (i_params->dmd1_rslts.frame_length == STV0900_LONG_FRAME) { 836 modulation;
1093 foundModcod = stv0900_get_bits(i_params, F0900_P1_DEMOD_MODCOD);
1094 pilots = stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE) & 0x01;
1095 aclc = stv0900_get_optim_carr_loop(srate, foundModcod, pilots, i_params->chip_id);
1096 if (foundModcod <= STV0900_QPSK_910)
1097 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, aclc);
1098 else if (foundModcod <= STV0900_8PSK_910) {
1099 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
1100 stv0900_write_reg(i_params, R0900_P1_ACLC2S28, aclc);
1101 }
1102 837
1103 if ((i_params->demod_mode == STV0900_SINGLE) && (foundModcod > STV0900_8PSK_910)) { 838 enum fe_stv0900_rolloff rolloff;
1104 if (foundModcod <= STV0900_16APSK_910) { 839 enum fe_stv0900_modcode foundModcod;
1105 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
1106 stv0900_write_reg(i_params, R0900_P1_ACLC2S216A, aclc);
1107 } else if (foundModcod <= STV0900_32APSK_910) {
1108 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
1109 stv0900_write_reg(i_params, R0900_P1_ACLC2S232A, aclc);
1110 }
1111 }
1112 840
1113 } else { 841 dprintk("%s\n", __func__);
1114 aclc = stv0900_get_optim_short_carr_loop(srate, i_params->dmd1_rslts.modulation, i_params->chip_id);
1115 if (i_params->dmd1_rslts.modulation == STV0900_QPSK)
1116 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, aclc);
1117
1118 else if (i_params->dmd1_rslts.modulation == STV0900_8PSK) {
1119 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
1120 stv0900_write_reg(i_params, R0900_P1_ACLC2S28, aclc);
1121 } else if (i_params->dmd1_rslts.modulation == STV0900_16APSK) {
1122 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
1123 stv0900_write_reg(i_params, R0900_P1_ACLC2S216A, aclc);
1124 } else if (i_params->dmd1_rslts.modulation == STV0900_32APSK) {
1125 stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
1126 stv0900_write_reg(i_params, R0900_P1_ACLC2S232A, aclc);
1127 }
1128 842
1129 } 843 srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
844 srate += stv0900_get_timing_offst(intp, srate, demod);
1130 845
1131 if (i_params->chip_id <= 0x11) { 846 switch (intp->result[demod].standard) {
1132 if (i_params->demod_mode != STV0900_SINGLE) 847 case STV0900_DVBS1_STANDARD:
1133 stv0900_activate_s2_modcode(i_params, demod); 848 case STV0900_DSS_STANDARD:
849 dprintk("%s: found DVB-S or DSS\n", __func__);
850 if (intp->srch_standard[demod] == STV0900_AUTO_SEARCH) {
851 stv0900_write_bits(intp, DVBS1_ENABLE, 1);
852 stv0900_write_bits(intp, DVBS2_ENABLE, 0);
853 }
1134 854
1135 } 855 stv0900_write_bits(intp, ROLLOFF_CONTROL, intp->rolloff);
856 stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
1136 857
1137 stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x67); 858 if (intp->chip_id < 0x30) {
1138 break; 859 stv0900_write_reg(intp, ERRCTRL1, 0x75);
1139 case STV0900_UNKNOWN_STANDARD:
1140 default:
1141 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
1142 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
1143 break; 860 break;
1144 } 861 }
1145 862
1146 freq1 = stv0900_read_reg(i_params, R0900_P1_CFR2); 863 if (stv0900_get_vit_fec(intp, demod) == STV0900_FEC_1_2) {
1147 freq0 = stv0900_read_reg(i_params, R0900_P1_CFR1); 864 stv0900_write_reg(intp, GAUSSR0, 0x98);
1148 rolloff = stv0900_get_bits(i_params, F0900_P1_ROLLOFF_STATUS); 865 stv0900_write_reg(intp, CCIR0, 0x18);
1149 if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) { 866 } else {
1150 stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x00); 867 stv0900_write_reg(intp, GAUSSR0, 0x18);
1151 stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 0); 868 stv0900_write_reg(intp, CCIR0, 0x18);
1152 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
1153 stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01);
1154 stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
1155 stv0900_set_max_symbol_rate(i_params, i_params->mclk, srate, demod);
1156 stv0900_set_min_symbol_rate(i_params, i_params->mclk, srate, demod);
1157 blindTunSw = 1;
1158 } 869 }
1159 870
1160 if (i_params->chip_id >= 0x20) { 871 stv0900_write_reg(intp, ERRCTRL1, 0x75);
1161 if ((i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS1) || (i_params->dmd1_srch_standard == STV0900_SEARCH_DSS) || (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH)) { 872 break;
1162 stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0a); 873 case STV0900_DVBS2_STANDARD:
1163 stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x0); 874 dprintk("%s: found DVB-S2\n", __func__);
875 stv0900_write_bits(intp, DVBS1_ENABLE, 0);
876 stv0900_write_bits(intp, DVBS2_ENABLE, 1);
877 stv0900_write_reg(intp, ACLC, 0);
878 stv0900_write_reg(intp, BCLC, 0);
879 if (intp->result[demod].frame_len == STV0900_LONG_FRAME) {
880 foundModcod = stv0900_get_bits(intp, DEMOD_MODCOD);
881 pilots = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01;
882 aclc = stv0900_get_optim_carr_loop(srate,
883 foundModcod,
884 pilots,
885 intp->chip_id);
886 if (foundModcod <= STV0900_QPSK_910)
887 stv0900_write_reg(intp, ACLC2S2Q, aclc);
888 else if (foundModcod <= STV0900_8PSK_910) {
889 stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
890 stv0900_write_reg(intp, ACLC2S28, aclc);
1164 } 891 }
1165 }
1166
1167 if (i_params->chip_id < 0x20)
1168 stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x08);
1169
1170 if (i_params->chip_id == 0x10)
1171 stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0x0A);
1172 892
1173 stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38); 893 if ((intp->demod_mode == STV0900_SINGLE) &&
1174 894 (foundModcod > STV0900_8PSK_910)) {
1175 if ((i_params->chip_id >= 0x20) || (blindTunSw == 1) || (i_params->dmd1_symbol_rate < 10000000)) { 895 if (foundModcod <= STV0900_16APSK_910) {
1176 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); 896 stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
1177 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); 897 stv0900_write_reg(intp, ACLC2S216A,
1178 i_params->tuner1_bw = stv0900_carrier_width(srate, i_params->rolloff) + 10000000; 898 aclc);
1179 899 } else if (foundModcod <= STV0900_32APSK_910) {
1180 if ((i_params->chip_id >= 0x20) || (blindTunSw == 1)) { 900 stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
1181 if (i_params->dmd1_srch_algo != STV0900_WARM_START) 901 stv0900_write_reg(intp, ACLC2S232A,
1182 stv0900_set_bandwidth(fe, i_params->tuner1_bw); 902 aclc);
903 }
1183 } 904 }
1184 905
1185 if ((i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd1_symbol_rate < 10000000)) 906 } else {
1186 msleep(50); 907 modulation = intp->result[demod].modulation;
1187 else 908 aclc = stv0900_get_optim_short_carr_loop(srate,
1188 msleep(5); 909 modulation, intp->chip_id);
1189 910 if (modulation == STV0900_QPSK)
1190 stv0900_get_lock_timeout(&timed, &timef, srate, STV0900_WARM_START); 911 stv0900_write_reg(intp, ACLC2S2Q, aclc);
1191 912 else if (modulation == STV0900_8PSK) {
1192 if (stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) { 913 stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
1193 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F); 914 stv0900_write_reg(intp, ACLC2S28, aclc);
1194 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); 915 } else if (modulation == STV0900_16APSK) {
1195 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); 916 stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
1196 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); 917 stv0900_write_reg(intp, ACLC2S216A, aclc);
1197 i = 0; 918 } else if (modulation == STV0900_32APSK) {
1198 while ((stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) && (i <= 2)) { 919 stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
1199 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F); 920 stv0900_write_reg(intp, ACLC2S232A, aclc);
1200 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1);
1201 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0);
1202 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
1203 i++;
1204 }
1205 } 921 }
1206 922
1207 } 923 }
1208 924
1209 if (i_params->chip_id >= 0x20) 925 if (intp->chip_id <= 0x11) {
1210 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x49); 926 if (intp->demod_mode != STV0900_SINGLE)
927 stv0900_activate_s2_modcod(intp, demod);
1211 928
1212 if ((i_params->dmd1_rslts.standard == STV0900_DVBS1_STANDARD) || (i_params->dmd1_rslts.standard == STV0900_DSS_STANDARD)) 929 }
1213 stv0900_set_viterbi_tracq(i_params, demod);
1214 930
931 stv0900_write_reg(intp, ERRCTRL1, 0x67);
1215 break; 932 break;
933 case STV0900_UNKNOWN_STANDARD:
934 default:
935 dprintk("%s: found unknown standard\n", __func__);
936 stv0900_write_bits(intp, DVBS1_ENABLE, 1);
937 stv0900_write_bits(intp, DVBS2_ENABLE, 1);
938 break;
939 }
1216 940
1217 case STV0900_DEMOD_2: 941 freq1 = stv0900_read_reg(intp, CFR2);
1218 switch (i_params->dmd2_rslts.standard) { 942 freq0 = stv0900_read_reg(intp, CFR1);
1219 case STV0900_DVBS1_STANDARD: 943 rolloff = stv0900_get_bits(intp, ROLLOFF_STATUS);
1220 944 if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) {
1221 if (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH) { 945 stv0900_write_reg(intp, SFRSTEP, 0x00);
1222 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); 946 stv0900_write_bits(intp, SCAN_ENABLE, 0);
1223 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); 947 stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
1224 } 948 stv0900_write_reg(intp, TMGCFG2, 0xc1);
1225 949 stv0900_set_symbol_rate(intp, intp->mclk, srate, demod);
1226 stv0900_write_bits(i_params, F0900_P2_ROLLOFF_CONTROL, i_params->rolloff); 950 blind_tun_sw = 1;
1227 stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1); 951 if (intp->result[demod].standard != STV0900_DVBS2_STANDARD)
1228 stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75); 952 stv0900_set_dvbs1_track_car_loop(intp, demod, srate);
1229 break;
1230 case STV0900_DSS_STANDARD:
1231 if (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH) {
1232 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
1233 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
1234 }
1235
1236 stv0900_write_bits(i_params, F0900_P2_ROLLOFF_CONTROL, i_params->rolloff);
1237 stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1);
1238 stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75);
1239 break;
1240 case STV0900_DVBS2_STANDARD:
1241 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0);
1242 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
1243 stv0900_write_reg(i_params, R0900_P2_ACLC, 0);
1244 stv0900_write_reg(i_params, R0900_P2_BCLC, 0);
1245 if (i_params->dmd2_rslts.frame_length == STV0900_LONG_FRAME) {
1246 foundModcod = stv0900_get_bits(i_params, F0900_P2_DEMOD_MODCOD);
1247 pilots = stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE) & 0x01;
1248 aclc = stv0900_get_optim_carr_loop(srate, foundModcod, pilots, i_params->chip_id);
1249 if (foundModcod <= STV0900_QPSK_910)
1250 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, aclc);
1251 else if (foundModcod <= STV0900_8PSK_910) {
1252 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
1253 stv0900_write_reg(i_params, R0900_P2_ACLC2S28, aclc);
1254 }
1255 953
1256 if ((i_params->demod_mode == STV0900_SINGLE) && (foundModcod > STV0900_8PSK_910)) { 954 }
1257 if (foundModcod <= STV0900_16APSK_910) {
1258 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
1259 stv0900_write_reg(i_params, R0900_P2_ACLC2S216A, aclc);
1260 } else if (foundModcod <= STV0900_32APSK_910) {
1261 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
1262 stv0900_write_reg(i_params, R0900_P2_ACLC2S232A, aclc);
1263 }
1264 955
1265 } 956 if (intp->chip_id >= 0x20) {
957 if ((intp->srch_standard[demod] == STV0900_SEARCH_DVBS1) ||
958 (intp->srch_standard[demod] ==
959 STV0900_SEARCH_DSS) ||
960 (intp->srch_standard[demod] ==
961 STV0900_AUTO_SEARCH)) {
962 stv0900_write_reg(intp, VAVSRVIT, 0x0a);
963 stv0900_write_reg(intp, VITSCALE, 0x0);
964 }
965 }
1266 966
1267 } else { 967 if (intp->chip_id < 0x20)
1268 aclc = stv0900_get_optim_short_carr_loop(srate, 968 stv0900_write_reg(intp, CARHDR, 0x08);
1269 i_params->dmd2_rslts.modulation,
1270 i_params->chip_id);
1271
1272 if (i_params->dmd2_rslts.modulation == STV0900_QPSK)
1273 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, aclc);
1274
1275 else if (i_params->dmd2_rslts.modulation == STV0900_8PSK) {
1276 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
1277 stv0900_write_reg(i_params, R0900_P2_ACLC2S28, aclc);
1278 } else if (i_params->dmd2_rslts.modulation == STV0900_16APSK) {
1279 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
1280 stv0900_write_reg(i_params, R0900_P2_ACLC2S216A, aclc);
1281 } else if (i_params->dmd2_rslts.modulation == STV0900_32APSK) {
1282 stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
1283 stv0900_write_reg(i_params, R0900_P2_ACLC2S232A, aclc);
1284 }
1285 }
1286 969
1287 stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x67); 970 if (intp->chip_id == 0x10)
971 stv0900_write_reg(intp, CORRELEXP, 0x0a);
1288 972
1289 break; 973 stv0900_write_reg(intp, AGC2REF, 0x38);
1290 case STV0900_UNKNOWN_STANDARD:
1291 default:
1292 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
1293 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
1294 break;
1295 }
1296 974
1297 freq1 = stv0900_read_reg(i_params, R0900_P2_CFR2); 975 if ((intp->chip_id >= 0x20) ||
1298 freq0 = stv0900_read_reg(i_params, R0900_P2_CFR1); 976 (blind_tun_sw == 1) ||
1299 rolloff = stv0900_get_bits(i_params, F0900_P2_ROLLOFF_STATUS); 977 (intp->symbol_rate[demod] < 10000000)) {
1300 if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) { 978 stv0900_write_reg(intp, CFRINIT1, freq1);
1301 stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x00); 979 stv0900_write_reg(intp, CFRINIT0, freq0);
1302 stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 0); 980 intp->bw[demod] = stv0900_carrier_width(srate,
1303 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); 981 intp->rolloff) + 10000000;
1304 stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01);
1305 stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
1306 stv0900_set_max_symbol_rate(i_params, i_params->mclk, srate, demod);
1307 stv0900_set_min_symbol_rate(i_params, i_params->mclk, srate, demod);
1308 blindTunSw = 1;
1309 }
1310 982
1311 if (i_params->chip_id >= 0x20) { 983 if ((intp->chip_id >= 0x20) || (blind_tun_sw == 1)) {
1312 if ((i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS1) || (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DSS) || (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH)) { 984 if (intp->srch_algo[demod] != STV0900_WARM_START) {
1313 stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0a); 985 if (intp->tuner_type[demod] == 3)
1314 stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x0); 986 stv0900_set_tuner_auto(intp,
987 intp->freq[demod],
988 intp->bw[demod],
989 demod);
990 else
991 stv0900_set_bandwidth(fe,
992 intp->bw[demod]);
1315 } 993 }
1316 } 994 }
1317 995
1318 if (i_params->chip_id < 0x20) 996 if ((intp->srch_algo[demod] == STV0900_BLIND_SEARCH) ||
1319 stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x08); 997 (intp->symbol_rate[demod] < 10000000))
1320 998 msleep(50);
1321 if (i_params->chip_id == 0x10) 999 else
1322 stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0x0a); 1000 msleep(5);
1323
1324 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38);
1325 if ((i_params->chip_id >= 0x20) || (blindTunSw == 1) || (i_params->dmd2_symbol_rate < 10000000)) {
1326 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
1327 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
1328 i_params->tuner2_bw = stv0900_carrier_width(srate, i_params->rolloff) + 10000000;
1329 1001
1330 if ((i_params->chip_id >= 0x20) || (blindTunSw == 1)) { 1002 stv0900_get_lock_timeout(&timed, &timef, srate,
1331 if (i_params->dmd2_srch_algo != STV0900_WARM_START) 1003 STV0900_WARM_START);
1332 stv0900_set_bandwidth(fe, i_params->tuner2_bw);
1333 }
1334 1004
1335 if ((i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd2_symbol_rate < 10000000)) 1005 if (stv0900_get_demod_lock(intp, demod, timed / 2) == FALSE) {
1336 msleep(50); 1006 stv0900_write_reg(intp, DMDISTATE, 0x1f);
1337 else 1007 stv0900_write_reg(intp, CFRINIT1, freq1);
1338 msleep(5); 1008 stv0900_write_reg(intp, CFRINIT0, freq0);
1339 1009 stv0900_write_reg(intp, DMDISTATE, 0x18);
1340 stv0900_get_lock_timeout(&timed, &timef, srate, STV0900_WARM_START); 1010 i = 0;
1341 if (stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) { 1011 while ((stv0900_get_demod_lock(intp,
1342 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); 1012 demod,
1343 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); 1013 timed / 2) == FALSE) &&
1344 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0); 1014 (i <= 2)) {
1345 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18); 1015 stv0900_write_reg(intp, DMDISTATE, 0x1f);
1346 i = 0; 1016 stv0900_write_reg(intp, CFRINIT1, freq1);
1347 while ((stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) && (i <= 2)) { 1017 stv0900_write_reg(intp, CFRINIT0, freq0);
1348 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); 1018 stv0900_write_reg(intp, DMDISTATE, 0x18);
1349 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1); 1019 i++;
1350 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
1351 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
1352 i++;
1353 }
1354 } 1020 }
1355 } 1021 }
1356 1022
1357 if (i_params->chip_id >= 0x20) 1023 }
1358 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x49);
1359 1024
1360 if ((i_params->dmd2_rslts.standard == STV0900_DVBS1_STANDARD) || (i_params->dmd2_rslts.standard == STV0900_DSS_STANDARD)) 1025 if (intp->chip_id >= 0x20)
1361 stv0900_set_viterbi_tracq(i_params, demod); 1026 stv0900_write_reg(intp, CARFREQ, 0x49);
1027
1028 if ((intp->result[demod].standard == STV0900_DVBS1_STANDARD) ||
1029 (intp->result[demod].standard == STV0900_DSS_STANDARD))
1030 stv0900_set_viterbi_tracq(intp, demod);
1362 1031
1363 break;
1364 }
1365} 1032}
1366 1033
1367static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv0900_demod_num demod, s32 time_out) 1034static int stv0900_get_fec_lock(struct stv0900_internal *intp,
1035 enum fe_stv0900_demod_num demod, s32 time_out)
1368{ 1036{
1369 s32 timer = 0, lock = 0, header_field, pktdelin_field, lock_vit_field; 1037 s32 timer = 0, lock = 0;
1370 1038
1371 enum fe_stv0900_search_state dmd_state; 1039 enum fe_stv0900_search_state dmd_state;
1372 1040
1373 dprintk(KERN_INFO "%s\n", __func__); 1041 dprintk("%s\n", __func__);
1374
1375 dmd_reg(header_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE);
1376 dmd_reg(pktdelin_field, F0900_P1_PKTDELIN_LOCK, F0900_P2_PKTDELIN_LOCK);
1377 dmd_reg(lock_vit_field, F0900_P1_LOCKEDVIT, F0900_P2_LOCKEDVIT);
1378 1042
1379 dmd_state = stv0900_get_bits(i_params, header_field); 1043 dmd_state = stv0900_get_bits(intp, HEADER_MODE);
1380 1044
1381 while ((timer < time_out) && (lock == 0)) { 1045 while ((timer < time_out) && (lock == 0)) {
1382 switch (dmd_state) { 1046 switch (dmd_state) {
@@ -1386,10 +1050,10 @@ static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv09
1386 lock = 0; 1050 lock = 0;
1387 break; 1051 break;
1388 case STV0900_DVBS2_FOUND: 1052 case STV0900_DVBS2_FOUND:
1389 lock = stv0900_get_bits(i_params, pktdelin_field); 1053 lock = stv0900_get_bits(intp, PKTDELIN_LOCK);
1390 break; 1054 break;
1391 case STV0900_DVBS_FOUND: 1055 case STV0900_DVBS_FOUND:
1392 lock = stv0900_get_bits(i_params, lock_vit_field); 1056 lock = stv0900_get_bits(intp, LOCKEDVIT);
1393 break; 1057 break;
1394 } 1058 }
1395 1059
@@ -1400,46 +1064,44 @@ static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv09
1400 } 1064 }
1401 1065
1402 if (lock) 1066 if (lock)
1403 dprintk("DEMOD FEC LOCK OK\n"); 1067 dprintk("%s: DEMOD FEC LOCK OK\n", __func__);
1404 else 1068 else
1405 dprintk("DEMOD FEC LOCK FAIL\n"); 1069 dprintk("%s: DEMOD FEC LOCK FAIL\n", __func__);
1406 1070
1407 return lock; 1071 return lock;
1408} 1072}
1409 1073
1410static int stv0900_wait_for_lock(struct stv0900_internal *i_params, 1074static int stv0900_wait_for_lock(struct stv0900_internal *intp,
1411 enum fe_stv0900_demod_num demod, 1075 enum fe_stv0900_demod_num demod,
1412 s32 dmd_timeout, s32 fec_timeout) 1076 s32 dmd_timeout, s32 fec_timeout)
1413{ 1077{
1414 1078
1415 s32 timer = 0, lock = 0, str_merg_rst_fld, str_merg_lock_fld; 1079 s32 timer = 0, lock = 0;
1416 1080
1417 dprintk(KERN_INFO "%s\n", __func__); 1081 dprintk("%s\n", __func__);
1418 1082
1419 dmd_reg(str_merg_rst_fld, F0900_P1_RST_HWARE, F0900_P2_RST_HWARE); 1083 lock = stv0900_get_demod_lock(intp, demod, dmd_timeout);
1420 dmd_reg(str_merg_lock_fld, F0900_P1_TSFIFO_LINEOK, F0900_P2_TSFIFO_LINEOK);
1421
1422 lock = stv0900_get_demod_lock(i_params, demod, dmd_timeout);
1423 1084
1424 if (lock) 1085 if (lock)
1425 lock = lock && stv0900_get_fec_lock(i_params, demod, fec_timeout); 1086 lock = lock && stv0900_get_fec_lock(intp, demod, fec_timeout);
1426 1087
1427 if (lock) { 1088 if (lock) {
1428 lock = 0; 1089 lock = 0;
1429 1090
1430 dprintk(KERN_INFO "%s: Timer = %d, time_out = %d\n", __func__, timer, fec_timeout); 1091 dprintk("%s: Timer = %d, time_out = %d\n",
1092 __func__, timer, fec_timeout);
1431 1093
1432 while ((timer < fec_timeout) && (lock == 0)) { 1094 while ((timer < fec_timeout) && (lock == 0)) {
1433 lock = stv0900_get_bits(i_params, str_merg_lock_fld); 1095 lock = stv0900_get_bits(intp, TSFIFO_LINEOK);
1434 msleep(1); 1096 msleep(1);
1435 timer++; 1097 timer++;
1436 } 1098 }
1437 } 1099 }
1438 1100
1439 if (lock) 1101 if (lock)
1440 dprintk(KERN_INFO "%s: DEMOD LOCK OK\n", __func__); 1102 dprintk("%s: DEMOD LOCK OK\n", __func__);
1441 else 1103 else
1442 dprintk(KERN_INFO "%s: DEMOD LOCK FAIL\n", __func__); 1104 dprintk("%s: DEMOD LOCK FAIL\n", __func__);
1443 1105
1444 if (lock) 1106 if (lock)
1445 return TRUE; 1107 return TRUE;
@@ -1451,43 +1113,43 @@ enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe,
1451 enum fe_stv0900_demod_num demod) 1113 enum fe_stv0900_demod_num demod)
1452{ 1114{
1453 struct stv0900_state *state = fe->demodulator_priv; 1115 struct stv0900_state *state = fe->demodulator_priv;
1454 struct stv0900_internal *i_params = state->internal; 1116 struct stv0900_internal *intp = state->internal;
1455 enum fe_stv0900_tracking_standard fnd_standard; 1117 enum fe_stv0900_tracking_standard fnd_standard;
1456 s32 state_field,
1457 dss_dvb_field;
1458
1459 dprintk(KERN_INFO "%s\n", __func__);
1460 1118
1461 dmd_reg(state_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE); 1119 int hdr_mode = stv0900_get_bits(intp, HEADER_MODE);
1462 dmd_reg(dss_dvb_field, F0900_P1_DSS_DVB, F0900_P2_DSS_DVB);
1463 1120
1464 if (stv0900_get_bits(i_params, state_field) == 2) 1121 switch (hdr_mode) {
1122 case 2:
1465 fnd_standard = STV0900_DVBS2_STANDARD; 1123 fnd_standard = STV0900_DVBS2_STANDARD;
1466 1124 break;
1467 else if (stv0900_get_bits(i_params, state_field) == 3) { 1125 case 3:
1468 if (stv0900_get_bits(i_params, dss_dvb_field) == 1) 1126 if (stv0900_get_bits(intp, DSS_DVB) == 1)
1469 fnd_standard = STV0900_DSS_STANDARD; 1127 fnd_standard = STV0900_DSS_STANDARD;
1470 else 1128 else
1471 fnd_standard = STV0900_DVBS1_STANDARD; 1129 fnd_standard = STV0900_DVBS1_STANDARD;
1472 } else 1130
1131 break;
1132 default:
1473 fnd_standard = STV0900_UNKNOWN_STANDARD; 1133 fnd_standard = STV0900_UNKNOWN_STANDARD;
1134 }
1135
1136 dprintk("%s: standard %d\n", __func__, fnd_standard);
1474 1137
1475 return fnd_standard; 1138 return fnd_standard;
1476} 1139}
1477 1140
1478static s32 stv0900_get_carr_freq(struct stv0900_internal *i_params, u32 mclk, 1141static s32 stv0900_get_carr_freq(struct stv0900_internal *intp, u32 mclk,
1479 enum fe_stv0900_demod_num demod) 1142 enum fe_stv0900_demod_num demod)
1480{ 1143{
1481 s32 cfr_field2, cfr_field1, cfr_field0, 1144 s32 derot,
1482 derot, rem1, rem2, intval1, intval2; 1145 rem1,
1483 1146 rem2,
1484 dmd_reg(cfr_field2, F0900_P1_CAR_FREQ2, F0900_P2_CAR_FREQ2); 1147 intval1,
1485 dmd_reg(cfr_field1, F0900_P1_CAR_FREQ1, F0900_P2_CAR_FREQ1); 1148 intval2;
1486 dmd_reg(cfr_field0, F0900_P1_CAR_FREQ0, F0900_P2_CAR_FREQ0);
1487 1149
1488 derot = (stv0900_get_bits(i_params, cfr_field2) << 16) + 1150 derot = (stv0900_get_bits(intp, CAR_FREQ2) << 16) +
1489 (stv0900_get_bits(i_params, cfr_field1) << 8) + 1151 (stv0900_get_bits(intp, CAR_FREQ1) << 8) +
1490 (stv0900_get_bits(i_params, cfr_field0)); 1152 (stv0900_get_bits(intp, CAR_FREQ0));
1491 1153
1492 derot = ge2comp(derot, 24); 1154 derot = ge2comp(derot, 24);
1493 intval1 = mclk >> 12; 1155 intval1 = mclk >> 12;
@@ -1505,7 +1167,7 @@ static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe)
1505{ 1167{
1506 struct dvb_frontend_ops *frontend_ops = NULL; 1168 struct dvb_frontend_ops *frontend_ops = NULL;
1507 struct dvb_tuner_ops *tuner_ops = NULL; 1169 struct dvb_tuner_ops *tuner_ops = NULL;
1508 u32 frequency = 0; 1170 u32 freq = 0;
1509 1171
1510 if (&fe->ops) 1172 if (&fe->ops)
1511 frontend_ops = &fe->ops; 1173 frontend_ops = &fe->ops;
@@ -1514,304 +1176,170 @@ static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe)
1514 tuner_ops = &frontend_ops->tuner_ops; 1176 tuner_ops = &frontend_ops->tuner_ops;
1515 1177
1516 if (tuner_ops->get_frequency) { 1178 if (tuner_ops->get_frequency) {
1517 if ((tuner_ops->get_frequency(fe, &frequency)) < 0) 1179 if ((tuner_ops->get_frequency(fe, &freq)) < 0)
1518 dprintk("%s: Invalid parameter\n", __func__); 1180 dprintk("%s: Invalid parameter\n", __func__);
1519 else 1181 else
1520 dprintk("%s: Frequency=%d\n", __func__, frequency); 1182 dprintk("%s: Frequency=%d\n", __func__, freq);
1521 1183
1522 } 1184 }
1523 1185
1524 return frequency; 1186 return freq;
1525}
1526
1527static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *i_params,
1528 enum fe_stv0900_demod_num demod)
1529{
1530 s32 rate_fld, vit_curpun_fld;
1531 enum fe_stv0900_fec prate;
1532
1533 dmd_reg(vit_curpun_fld, F0900_P1_VIT_CURPUN, F0900_P2_VIT_CURPUN);
1534 rate_fld = stv0900_get_bits(i_params, vit_curpun_fld);
1535
1536 switch (rate_fld) {
1537 case 13:
1538 prate = STV0900_FEC_1_2;
1539 break;
1540 case 18:
1541 prate = STV0900_FEC_2_3;
1542 break;
1543 case 21:
1544 prate = STV0900_FEC_3_4;
1545 break;
1546 case 24:
1547 prate = STV0900_FEC_5_6;
1548 break;
1549 case 25:
1550 prate = STV0900_FEC_6_7;
1551 break;
1552 case 26:
1553 prate = STV0900_FEC_7_8;
1554 break;
1555 default:
1556 prate = STV0900_FEC_UNKNOWN;
1557 break;
1558 }
1559
1560 return prate;
1561} 1187}
1562 1188
1563static enum fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe) 1189static enum
1190fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe)
1564{ 1191{
1565 struct stv0900_state *state = fe->demodulator_priv; 1192 struct stv0900_state *state = fe->demodulator_priv;
1566 struct stv0900_internal *i_params = state->internal; 1193 struct stv0900_internal *intp = state->internal;
1567 enum fe_stv0900_demod_num demod = state->demod; 1194 enum fe_stv0900_demod_num demod = state->demod;
1568 enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE; 1195 enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE;
1569 s32 offsetFreq, 1196 struct stv0900_signal_info *result = &intp->result[demod];
1570 srate_offset, 1197 s32 offsetFreq,
1571 i = 0; 1198 srate_offset;
1199 int i = 0,
1200 d = demod;
1572 1201
1573 u8 timing; 1202 u8 timing;
1574 1203
1575 msleep(5); 1204 msleep(5);
1576 switch (demod) { 1205 if (intp->srch_algo[d] == STV0900_BLIND_SEARCH) {
1577 case STV0900_DEMOD_1: 1206 timing = stv0900_read_reg(intp, TMGREG2);
1578 default: 1207 i = 0;
1579 if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) { 1208 stv0900_write_reg(intp, SFRSTEP, 0x5c);
1580 timing = stv0900_read_reg(i_params, R0900_P1_TMGREG2); 1209
1581 i = 0; 1210 while ((i <= 50) && (timing != 0) && (timing != 0xff)) {
1582 stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x5c); 1211 timing = stv0900_read_reg(intp, TMGREG2);
1583 1212 msleep(5);
1584 while ((i <= 50) && (timing != 0) && (timing != 0xFF)) { 1213 i += 5;
1585 timing = stv0900_read_reg(i_params, R0900_P1_TMGREG2);
1586 msleep(5);
1587 i += 5;
1588 }
1589 }
1590
1591 i_params->dmd1_rslts.standard = stv0900_get_standard(fe, demod);
1592 i_params->dmd1_rslts.frequency = stv0900_get_tuner_freq(fe);
1593 offsetFreq = stv0900_get_carr_freq(i_params, i_params->mclk, demod) / 1000;
1594 i_params->dmd1_rslts.frequency += offsetFreq;
1595 i_params->dmd1_rslts.symbol_rate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
1596 srate_offset = stv0900_get_timing_offst(i_params, i_params->dmd1_rslts.symbol_rate, demod);
1597 i_params->dmd1_rslts.symbol_rate += srate_offset;
1598 i_params->dmd1_rslts.fec = stv0900_get_vit_fec(i_params, demod);
1599 i_params->dmd1_rslts.modcode = stv0900_get_bits(i_params, F0900_P1_DEMOD_MODCOD);
1600 i_params->dmd1_rslts.pilot = stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE) & 0x01;
1601 i_params->dmd1_rslts.frame_length = ((u32)stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE)) >> 1;
1602 i_params->dmd1_rslts.rolloff = stv0900_get_bits(i_params, F0900_P1_ROLLOFF_STATUS);
1603 switch (i_params->dmd1_rslts.standard) {
1604 case STV0900_DVBS2_STANDARD:
1605 i_params->dmd1_rslts.spectrum = stv0900_get_bits(i_params, F0900_P1_SPECINV_DEMOD);
1606 if (i_params->dmd1_rslts.modcode <= STV0900_QPSK_910)
1607 i_params->dmd1_rslts.modulation = STV0900_QPSK;
1608 else if (i_params->dmd1_rslts.modcode <= STV0900_8PSK_910)
1609 i_params->dmd1_rslts.modulation = STV0900_8PSK;
1610 else if (i_params->dmd1_rslts.modcode <= STV0900_16APSK_910)
1611 i_params->dmd1_rslts.modulation = STV0900_16APSK;
1612 else if (i_params->dmd1_rslts.modcode <= STV0900_32APSK_910)
1613 i_params->dmd1_rslts.modulation = STV0900_32APSK;
1614 else
1615 i_params->dmd1_rslts.modulation = STV0900_UNKNOWN;
1616 break;
1617 case STV0900_DVBS1_STANDARD:
1618 case STV0900_DSS_STANDARD:
1619 i_params->dmd1_rslts.spectrum = stv0900_get_bits(i_params, F0900_P1_IQINV);
1620 i_params->dmd1_rslts.modulation = STV0900_QPSK;
1621 break;
1622 default:
1623 break;
1624 } 1214 }
1215 }
1625 1216
1626 if ((i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd1_symbol_rate < 10000000)) { 1217 result->standard = stv0900_get_standard(fe, d);
1627 offsetFreq = i_params->dmd1_rslts.frequency - i_params->tuner1_freq; 1218 if (intp->tuner_type[demod] == 3)
1628 i_params->tuner1_freq = stv0900_get_tuner_freq(fe); 1219 result->frequency = stv0900_get_freq_auto(intp, d);
1629 if (ABS(offsetFreq) <= ((i_params->dmd1_srch_range / 2000) + 500)) 1220 else
1630 range = STV0900_RANGEOK; 1221 result->frequency = stv0900_get_tuner_freq(fe);
1631 else 1222
1632 if (ABS(offsetFreq) <= (stv0900_carrier_width(i_params->dmd1_rslts.symbol_rate, i_params->dmd1_rslts.rolloff) / 2000)) 1223 offsetFreq = stv0900_get_carr_freq(intp, intp->mclk, d) / 1000;
1633 range = STV0900_RANGEOK; 1224 result->frequency += offsetFreq;
1634 else 1225 result->symbol_rate = stv0900_get_symbol_rate(intp, intp->mclk, d);
1635 range = STV0900_OUTOFRANGE; 1226 srate_offset = stv0900_get_timing_offst(intp, result->symbol_rate, d);
1636 1227 result->symbol_rate += srate_offset;
1637 } else { 1228 result->fec = stv0900_get_vit_fec(intp, d);
1638 if (ABS(offsetFreq) <= ((i_params->dmd1_srch_range / 2000) + 500)) 1229 result->modcode = stv0900_get_bits(intp, DEMOD_MODCOD);
1639 range = STV0900_RANGEOK; 1230 result->pilot = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01;
1640 else 1231 result->frame_len = ((u32)stv0900_get_bits(intp, DEMOD_TYPE)) >> 1;
1641 range = STV0900_OUTOFRANGE; 1232 result->rolloff = stv0900_get_bits(intp, ROLLOFF_STATUS);
1642 } 1233
1234 dprintk("%s: modcode=0x%x \n", __func__, result->modcode);
1235
1236 switch (result->standard) {
1237 case STV0900_DVBS2_STANDARD:
1238 result->spectrum = stv0900_get_bits(intp, SPECINV_DEMOD);
1239 if (result->modcode <= STV0900_QPSK_910)
1240 result->modulation = STV0900_QPSK;
1241 else if (result->modcode <= STV0900_8PSK_910)
1242 result->modulation = STV0900_8PSK;
1243 else if (result->modcode <= STV0900_16APSK_910)
1244 result->modulation = STV0900_16APSK;
1245 else if (result->modcode <= STV0900_32APSK_910)
1246 result->modulation = STV0900_32APSK;
1247 else
1248 result->modulation = STV0900_UNKNOWN;
1643 break; 1249 break;
1644 case STV0900_DEMOD_2: 1250 case STV0900_DVBS1_STANDARD:
1645 if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) { 1251 case STV0900_DSS_STANDARD:
1646 timing = stv0900_read_reg(i_params, R0900_P2_TMGREG2); 1252 result->spectrum = stv0900_get_bits(intp, IQINV);
1647 i = 0; 1253 result->modulation = STV0900_QPSK;
1648 stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x5c); 1254 break;
1649 1255 default:
1650 while ((i <= 50) && (timing != 0) && (timing != 0xff)) { 1256 break;
1651 timing = stv0900_read_reg(i_params, R0900_P2_TMGREG2); 1257 }
1652 msleep(5);
1653 i += 5;
1654 }
1655 }
1656 1258
1657 i_params->dmd2_rslts.standard = stv0900_get_standard(fe, demod); 1259 if ((intp->srch_algo[d] == STV0900_BLIND_SEARCH) ||
1658 i_params->dmd2_rslts.frequency = stv0900_get_tuner_freq(fe); 1260 (intp->symbol_rate[d] < 10000000)) {
1659 offsetFreq = stv0900_get_carr_freq(i_params, i_params->mclk, demod) / 1000; 1261 offsetFreq = result->frequency - intp->freq[d];
1660 i_params->dmd2_rslts.frequency += offsetFreq; 1262 if (intp->tuner_type[demod] == 3)
1661 i_params->dmd2_rslts.symbol_rate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); 1263 intp->freq[d] = stv0900_get_freq_auto(intp, d);
1662 srate_offset = stv0900_get_timing_offst(i_params, i_params->dmd2_rslts.symbol_rate, demod); 1264 else
1663 i_params->dmd2_rslts.symbol_rate += srate_offset; 1265 intp->freq[d] = stv0900_get_tuner_freq(fe);
1664 i_params->dmd2_rslts.fec = stv0900_get_vit_fec(i_params, demod);
1665 i_params->dmd2_rslts.modcode = stv0900_get_bits(i_params, F0900_P2_DEMOD_MODCOD);
1666 i_params->dmd2_rslts.pilot = stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE) & 0x01;
1667 i_params->dmd2_rslts.frame_length = ((u32)stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE)) >> 1;
1668 i_params->dmd2_rslts.rolloff = stv0900_get_bits(i_params, F0900_P2_ROLLOFF_STATUS);
1669 switch (i_params->dmd2_rslts.standard) {
1670 case STV0900_DVBS2_STANDARD:
1671 i_params->dmd2_rslts.spectrum = stv0900_get_bits(i_params, F0900_P2_SPECINV_DEMOD);
1672 if (i_params->dmd2_rslts.modcode <= STV0900_QPSK_910)
1673 i_params->dmd2_rslts.modulation = STV0900_QPSK;
1674 else if (i_params->dmd2_rslts.modcode <= STV0900_8PSK_910)
1675 i_params->dmd2_rslts.modulation = STV0900_8PSK;
1676 else if (i_params->dmd2_rslts.modcode <= STV0900_16APSK_910)
1677 i_params->dmd2_rslts.modulation = STV0900_16APSK;
1678 else if (i_params->dmd2_rslts.modcode <= STV0900_32APSK_910)
1679 i_params->dmd2_rslts.modulation = STV0900_32APSK;
1680 else
1681 i_params->dmd2_rslts.modulation = STV0900_UNKNOWN;
1682 break;
1683 case STV0900_DVBS1_STANDARD:
1684 case STV0900_DSS_STANDARD:
1685 i_params->dmd2_rslts.spectrum = stv0900_get_bits(i_params, F0900_P2_IQINV);
1686 i_params->dmd2_rslts.modulation = STV0900_QPSK;
1687 break;
1688 default:
1689 break;
1690 }
1691 1266
1692 if ((i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd2_symbol_rate < 10000000)) { 1267 if (ABS(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500))
1693 offsetFreq = i_params->dmd2_rslts.frequency - i_params->tuner2_freq; 1268 range = STV0900_RANGEOK;
1694 i_params->tuner2_freq = stv0900_get_tuner_freq(fe); 1269 else if (ABS(offsetFreq) <=
1270 (stv0900_carrier_width(result->symbol_rate,
1271 result->rolloff) / 2000))
1272 range = STV0900_RANGEOK;
1695 1273
1696 if (ABS(offsetFreq) <= ((i_params->dmd2_srch_range / 2000) + 500)) 1274 } else if (ABS(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500))
1697 range = STV0900_RANGEOK; 1275 range = STV0900_RANGEOK;
1698 else
1699 if (ABS(offsetFreq) <= (stv0900_carrier_width(i_params->dmd2_rslts.symbol_rate, i_params->dmd2_rslts.rolloff) / 2000))
1700 range = STV0900_RANGEOK;
1701 else
1702 range = STV0900_OUTOFRANGE;
1703 } else {
1704 if (ABS(offsetFreq) <= ((i_params->dmd2_srch_range / 2000) + 500))
1705 range = STV0900_RANGEOK;
1706 else
1707 range = STV0900_OUTOFRANGE;
1708 }
1709 1276
1710 break; 1277 dprintk("%s: range %d\n", __func__, range);
1711 }
1712 1278
1713 return range; 1279 return range;
1714} 1280}
1715 1281
1716static enum fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe) 1282static enum
1283fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe)
1717{ 1284{
1718 struct stv0900_state *state = fe->demodulator_priv; 1285 struct stv0900_state *state = fe->demodulator_priv;
1719 struct stv0900_internal *i_params = state->internal; 1286 struct stv0900_internal *intp = state->internal;
1720 enum fe_stv0900_demod_num demod = state->demod; 1287 enum fe_stv0900_demod_num demod = state->demod;
1721
1722 s32 srate, demod_timeout,
1723 fec_timeout, freq1, freq0;
1724 enum fe_stv0900_signal_type signal_type = STV0900_NODATA; 1288 enum fe_stv0900_signal_type signal_type = STV0900_NODATA;
1725 1289
1726 switch (demod) { 1290 s32 srate,
1727 case STV0900_DEMOD_1: 1291 demod_timeout,
1728 default: 1292 fec_timeout,
1729 i_params->dmd1_rslts.locked = FALSE; 1293 freq1,
1730 if (stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS_FOUND) { 1294 freq0;
1731 srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); 1295
1732 srate += stv0900_get_timing_offst(i_params, srate, demod); 1296 intp->result[demod].locked = FALSE;
1733 if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) 1297
1734 stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod); 1298 if (stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) {
1735 1299 srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
1736 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, srate, STV0900_WARM_START); 1300 srate += stv0900_get_timing_offst(intp, srate, demod);
1737 freq1 = stv0900_read_reg(i_params, R0900_P1_CFR2); 1301 if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH)
1738 freq0 = stv0900_read_reg(i_params, R0900_P1_CFR1); 1302 stv0900_set_symbol_rate(intp, intp->mclk, srate, demod);
1739 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0); 1303
1740 stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, STV0900_IQ_FORCE_SWAPPED); 1304 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout,
1741 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C); 1305 srate, STV0900_WARM_START);
1742 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); 1306 freq1 = stv0900_read_reg(intp, CFR2);
1743 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); 1307 freq0 = stv0900_read_reg(intp, CFR1);
1744 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); 1308 stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
1745 if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) { 1309 stv0900_write_bits(intp, SPECINV_CONTROL,
1746 i_params->dmd1_rslts.locked = TRUE; 1310 STV0900_IQ_FORCE_SWAPPED);
1747 signal_type = stv0900_get_signal_params(fe); 1311 stv0900_write_reg(intp, DMDISTATE, 0x1c);
1748 stv0900_track_optimization(fe); 1312 stv0900_write_reg(intp, CFRINIT1, freq1);
1749 } else { 1313 stv0900_write_reg(intp, CFRINIT0, freq0);
1750 stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, STV0900_IQ_FORCE_NORMAL); 1314 stv0900_write_reg(intp, DMDISTATE, 0x18);
1751 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1c); 1315 if (stv0900_wait_for_lock(intp, demod,
1752 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1); 1316 demod_timeout, fec_timeout) == TRUE) {
1753 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0); 1317 intp->result[demod].locked = TRUE;
1754 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18); 1318 signal_type = stv0900_get_signal_params(fe);
1755 if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) { 1319 stv0900_track_optimization(fe);
1756 i_params->dmd1_rslts.locked = TRUE; 1320 } else {
1757 signal_type = stv0900_get_signal_params(fe); 1321 stv0900_write_bits(intp, SPECINV_CONTROL,
1758 stv0900_track_optimization(fe); 1322 STV0900_IQ_FORCE_NORMAL);
1759 } 1323 stv0900_write_reg(intp, DMDISTATE, 0x1c);
1760 1324 stv0900_write_reg(intp, CFRINIT1, freq1);
1761 } 1325 stv0900_write_reg(intp, CFRINIT0, freq0);
1762 1326 stv0900_write_reg(intp, DMDISTATE, 0x18);
1763 } else 1327 if (stv0900_wait_for_lock(intp, demod,
1764 i_params->dmd1_rslts.locked = FALSE; 1328 demod_timeout, fec_timeout) == TRUE) {
1765 1329 intp->result[demod].locked = TRUE;
1766 break;
1767 case STV0900_DEMOD_2:
1768 i_params->dmd2_rslts.locked = FALSE;
1769 if (stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS_FOUND) {
1770 srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
1771 srate += stv0900_get_timing_offst(i_params, srate, demod);
1772
1773 if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH)
1774 stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
1775
1776 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, srate, STV0900_WARM_START);
1777 freq1 = stv0900_read_reg(i_params, R0900_P2_CFR2);
1778 freq0 = stv0900_read_reg(i_params, R0900_P2_CFR1);
1779 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0);
1780 stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, STV0900_IQ_FORCE_SWAPPED);
1781 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C);
1782 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
1783 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
1784 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
1785
1786 if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) {
1787 i_params->dmd2_rslts.locked = TRUE;
1788 signal_type = stv0900_get_signal_params(fe); 1330 signal_type = stv0900_get_signal_params(fe);
1789 stv0900_track_optimization(fe); 1331 stv0900_track_optimization(fe);
1790 } else {
1791 stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, STV0900_IQ_FORCE_NORMAL);
1792 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1c);
1793 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
1794 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
1795 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
1796
1797 if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) {
1798 i_params->dmd2_rslts.locked = TRUE;
1799 signal_type = stv0900_get_signal_params(fe);
1800 stv0900_track_optimization(fe);
1801 }
1802
1803 } 1332 }
1804 1333
1805 } else 1334 }
1806 i_params->dmd1_rslts.locked = FALSE;
1807 1335
1808 break; 1336 } else
1809 } 1337 intp->result[demod].locked = FALSE;
1810 1338
1811 return signal_type; 1339 return signal_type;
1812} 1340}
1813 1341
1814static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params, 1342static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *intp,
1815 enum fe_stv0900_demod_num demod) 1343 enum fe_stv0900_demod_num demod)
1816{ 1344{
1817 u32 minagc2level = 0xffff, 1345 u32 minagc2level = 0xffff,
@@ -1820,105 +1348,54 @@ static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params,
1820 1348
1821 s32 i, j, nb_steps, direction; 1349 s32 i, j, nb_steps, direction;
1822 1350
1823 dprintk(KERN_INFO "%s\n", __func__); 1351 dprintk("%s\n", __func__);
1824
1825 switch (demod) {
1826 case STV0900_DEMOD_1:
1827 default:
1828 stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
1829 stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 1);
1830 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 1);
1831
1832 stv0900_write_reg(i_params, R0900_P1_SFRUP1, 0x83);
1833 stv0900_write_reg(i_params, R0900_P1_SFRUP0, 0xc0);
1834
1835 stv0900_write_reg(i_params, R0900_P1_SFRLOW1, 0x82);
1836 stv0900_write_reg(i_params, R0900_P1_SFRLOW0, 0xa0);
1837 stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x0);
1838 1352
1839 stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod); 1353 stv0900_write_reg(intp, AGC2REF, 0x38);
1840 nb_steps = -1 + (i_params->dmd1_srch_range / 1000000); 1354 stv0900_write_bits(intp, SCAN_ENABLE, 0);
1841 nb_steps /= 2; 1355 stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
1842 nb_steps = (2 * nb_steps) + 1;
1843 1356
1844 if (nb_steps < 0) 1357 stv0900_write_bits(intp, AUTO_GUP, 1);
1845 nb_steps = 1; 1358 stv0900_write_bits(intp, AUTO_GLOW, 1);
1846 1359
1847 direction = 1; 1360 stv0900_write_reg(intp, DMDT0M, 0x0);
1848 1361
1849 freq_step = (1000000 << 8) / (i_params->mclk >> 8); 1362 stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod);
1363 nb_steps = -1 + (intp->srch_range[demod] / 1000000);
1364 nb_steps /= 2;
1365 nb_steps = (2 * nb_steps) + 1;
1850 1366
1851 init_freq = 0; 1367 if (nb_steps < 0)
1368 nb_steps = 1;
1852 1369
1853 for (i = 0; i < nb_steps; i++) { 1370 direction = 1;
1854 if (direction > 0)
1855 init_freq = init_freq + (freq_step * i);
1856 else
1857 init_freq = init_freq - (freq_step * i);
1858 1371
1859 direction *= -1; 1372 freq_step = (1000000 << 8) / (intp->mclk >> 8);
1860 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5C);
1861 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, (init_freq >> 8) & 0xff);
1862 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, init_freq & 0xff);
1863 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x58);
1864 msleep(10);
1865 agc2level = 0;
1866 1373
1867 for (j = 0; j < 10; j++) 1374 init_freq = 0;
1868 agc2level += (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8)
1869 | stv0900_read_reg(i_params, R0900_P1_AGC2I0);
1870 1375
1871 agc2level /= 10; 1376 for (i = 0; i < nb_steps; i++) {
1872 1377 if (direction > 0)
1873 if (agc2level < minagc2level) 1378 init_freq = init_freq + (freq_step * i);
1874 minagc2level = agc2level; 1379 else
1875 } 1380 init_freq = init_freq - (freq_step * i);
1876 break;
1877 case STV0900_DEMOD_2:
1878 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38);
1879 stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 1);
1880 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 1);
1881 stv0900_write_reg(i_params, R0900_P2_SFRUP1, 0x83);
1882 stv0900_write_reg(i_params, R0900_P2_SFRUP0, 0xc0);
1883 stv0900_write_reg(i_params, R0900_P2_SFRLOW1, 0x82);
1884 stv0900_write_reg(i_params, R0900_P2_SFRLOW0, 0xa0);
1885 stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x0);
1886 stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
1887 nb_steps = -1 + (i_params->dmd2_srch_range / 1000000);
1888 nb_steps /= 2;
1889 nb_steps = (2 * nb_steps) + 1;
1890
1891 if (nb_steps < 0)
1892 nb_steps = 1;
1893
1894 direction = 1;
1895 freq_step = (1000000 << 8) / (i_params->mclk >> 8);
1896 init_freq = 0;
1897 for (i = 0; i < nb_steps; i++) {
1898 if (direction > 0)
1899 init_freq = init_freq + (freq_step * i);
1900 else
1901 init_freq = init_freq - (freq_step * i);
1902 1381
1903 direction *= -1; 1382 direction *= -1;
1383 stv0900_write_reg(intp, DMDISTATE, 0x5C);
1384 stv0900_write_reg(intp, CFRINIT1, (init_freq >> 8) & 0xff);
1385 stv0900_write_reg(intp, CFRINIT0, init_freq & 0xff);
1386 stv0900_write_reg(intp, DMDISTATE, 0x58);
1387 msleep(10);
1388 agc2level = 0;
1904 1389
1905 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5C); 1390 for (j = 0; j < 10; j++)
1906 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, (init_freq >> 8) & 0xff); 1391 agc2level += (stv0900_read_reg(intp, AGC2I1) << 8)
1907 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, init_freq & 0xff); 1392 | stv0900_read_reg(intp, AGC2I0);
1908 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x58);
1909 1393
1910 msleep(10); 1394 agc2level /= 10;
1911 agc2level = 0;
1912 for (j = 0; j < 10; j++)
1913 agc2level += (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
1914 | stv0900_read_reg(i_params, R0900_P2_AGC2I0);
1915 1395
1916 agc2level /= 10; 1396 if (agc2level < minagc2level)
1397 minagc2level = agc2level;
1917 1398
1918 if (agc2level < minagc2level)
1919 minagc2level = agc2level;
1920 }
1921 break;
1922 } 1399 }
1923 1400
1924 return (u16)minagc2level; 1401 return (u16)minagc2level;
@@ -1927,336 +1404,197 @@ static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params,
1927static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe) 1404static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe)
1928{ 1405{
1929 struct stv0900_state *state = fe->demodulator_priv; 1406 struct stv0900_state *state = fe->demodulator_priv;
1930 struct stv0900_internal *i_params = state->internal; 1407 struct stv0900_internal *intp = state->internal;
1931 enum fe_stv0900_demod_num demod = state->demod; 1408 enum fe_stv0900_demod_num demod = state->demod;
1932 int timingLock = FALSE; 1409 int timing_lck = FALSE;
1933 s32 i, timingcpt = 0, 1410 s32 i, timingcpt = 0,
1934 direction = 1, 1411 direction = 1,
1935 nb_steps, 1412 nb_steps,
1936 current_step = 0, 1413 current_step = 0,
1937 tuner_freq; 1414 tuner_freq;
1415 u32 agc2_th,
1416 coarse_srate = 0,
1417 agc2_integr = 0,
1418 currier_step = 1200;
1938 1419
1939 u32 coarse_srate = 0, agc2_integr = 0, currier_step = 1200; 1420 if (intp->chip_id >= 0x30)
1940 1421 agc2_th = 0x2e00;
1941 switch (demod) { 1422 else
1942 case STV0900_DEMOD_1: 1423 agc2_th = 0x1f00;
1943 default: 1424
1944 stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x1F); 1425 stv0900_write_bits(intp, DEMOD_MODE, 0x1f);
1945 stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0x12); 1426 stv0900_write_reg(intp, TMGCFG, 0x12);
1946 stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0xf0); 1427 stv0900_write_reg(intp, TMGTHRISE, 0xf0);
1947 stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0xe0); 1428 stv0900_write_reg(intp, TMGTHFALL, 0xe0);
1948 stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 1); 1429 stv0900_write_bits(intp, SCAN_ENABLE, 1);
1949 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 1); 1430 stv0900_write_bits(intp, CFR_AUTOSCAN, 1);
1950 stv0900_write_reg(i_params, R0900_P1_SFRUP1, 0x83); 1431 stv0900_write_reg(intp, SFRUP1, 0x83);
1951 stv0900_write_reg(i_params, R0900_P1_SFRUP0, 0xc0); 1432 stv0900_write_reg(intp, SFRUP0, 0xc0);
1952 stv0900_write_reg(i_params, R0900_P1_SFRLOW1, 0x82); 1433 stv0900_write_reg(intp, SFRLOW1, 0x82);
1953 stv0900_write_reg(i_params, R0900_P1_SFRLOW0, 0xa0); 1434 stv0900_write_reg(intp, SFRLOW0, 0xa0);
1954 stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x0); 1435 stv0900_write_reg(intp, DMDT0M, 0x0);
1955 stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x50); 1436 stv0900_write_reg(intp, AGC2REF, 0x50);
1956 1437
1957 if (i_params->chip_id >= 0x20) { 1438 if (intp->chip_id >= 0x30) {
1958 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x6a); 1439 stv0900_write_reg(intp, CARFREQ, 0x99);
1959 stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x95); 1440 stv0900_write_reg(intp, SFRSTEP, 0x98);
1960 } else { 1441 } else if (intp->chip_id >= 0x20) {
1961 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed); 1442 stv0900_write_reg(intp, CARFREQ, 0x6a);
1962 stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x73); 1443 stv0900_write_reg(intp, SFRSTEP, 0x95);
1963 } 1444 } else {
1445 stv0900_write_reg(intp, CARFREQ, 0xed);
1446 stv0900_write_reg(intp, SFRSTEP, 0x73);
1447 }
1964 1448
1965 if (i_params->dmd1_symbol_rate <= 2000000) 1449 if (intp->symbol_rate[demod] <= 2000000)
1966 currier_step = 1000; 1450 currier_step = 1000;
1967 else if (i_params->dmd1_symbol_rate <= 5000000) 1451 else if (intp->symbol_rate[demod] <= 5000000)
1968 currier_step = 2000; 1452 currier_step = 2000;
1969 else if (i_params->dmd1_symbol_rate <= 12000000) 1453 else if (intp->symbol_rate[demod] <= 12000000)
1970 currier_step = 3000; 1454 currier_step = 3000;
1971 else 1455 else
1972 currier_step = 5000; 1456 currier_step = 5000;
1973 1457
1974 nb_steps = -1 + ((i_params->dmd1_srch_range / 1000) / currier_step); 1458 nb_steps = -1 + ((intp->srch_range[demod] / 1000) / currier_step);
1975 nb_steps /= 2; 1459 nb_steps /= 2;
1976 nb_steps = (2 * nb_steps) + 1; 1460 nb_steps = (2 * nb_steps) + 1;
1977
1978 if (nb_steps < 0)
1979 nb_steps = 1;
1980
1981 else if (nb_steps > 10) {
1982 nb_steps = 11;
1983 currier_step = (i_params->dmd1_srch_range / 1000) / 10;
1984 }
1985
1986 current_step = 0;
1987
1988 direction = 1;
1989 tuner_freq = i_params->tuner1_freq;
1990
1991 while ((timingLock == FALSE) && (current_step < nb_steps)) {
1992 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5F);
1993 stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x0);
1994
1995 msleep(50);
1996
1997 for (i = 0; i < 10; i++) {
1998 if (stv0900_get_bits(i_params, F0900_P1_TMGLOCK_QUALITY) >= 2)
1999 timingcpt++;
2000
2001 agc2_integr += (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) | stv0900_read_reg(i_params, R0900_P1_AGC2I0);
2002
2003 }
2004
2005 agc2_integr /= 10;
2006 coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
2007 current_step++;
2008 direction *= -1;
2009
2010 dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started. tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n", tuner_freq, agc2_integr, coarse_srate, timingcpt);
2011 1461
2012 if ((timingcpt >= 5) && (agc2_integr < 0x1F00) && (coarse_srate < 55000000) && (coarse_srate > 850000)) { 1462 if (nb_steps < 0)
2013 timingLock = TRUE; 1463 nb_steps = 1;
2014 } 1464 else if (nb_steps > 10) {
2015 1465 nb_steps = 11;
2016 else if (current_step < nb_steps) { 1466 currier_step = (intp->srch_range[demod] / 1000) / 10;
2017 if (direction > 0) 1467 }
2018 tuner_freq += (current_step * currier_step);
2019 else
2020 tuner_freq -= (current_step * currier_step);
2021 1468
2022 stv0900_set_tuner(fe, tuner_freq, i_params->tuner1_bw); 1469 current_step = 0;
2023 } 1470 direction = 1;
2024 }
2025 1471
2026 if (timingLock == FALSE) 1472 tuner_freq = intp->freq[demod];
2027 coarse_srate = 0;
2028 else
2029 coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
2030 break;
2031 case STV0900_DEMOD_2:
2032 stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x1F);
2033 stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0x12);
2034 stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0xf0);
2035 stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0xe0);
2036 stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 1);
2037 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 1);
2038 stv0900_write_reg(i_params, R0900_P2_SFRUP1, 0x83);
2039 stv0900_write_reg(i_params, R0900_P2_SFRUP0, 0xc0);
2040 stv0900_write_reg(i_params, R0900_P2_SFRLOW1, 0x82);
2041 stv0900_write_reg(i_params, R0900_P2_SFRLOW0, 0xa0);
2042 stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x0);
2043 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x50);
2044
2045 if (i_params->chip_id >= 0x20) {
2046 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x6a);
2047 stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x95);
2048 } else {
2049 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed);
2050 stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x73);
2051 }
2052 1473
2053 if (i_params->dmd2_symbol_rate <= 2000000) 1474 while ((timing_lck == FALSE) && (current_step < nb_steps)) {
2054 currier_step = 1000; 1475 stv0900_write_reg(intp, DMDISTATE, 0x5f);
2055 else if (i_params->dmd2_symbol_rate <= 5000000) 1476 stv0900_write_bits(intp, DEMOD_MODE, 0);
2056 currier_step = 2000;
2057 else if (i_params->dmd2_symbol_rate <= 12000000)
2058 currier_step = 3000;
2059 else
2060 currier_step = 5000;
2061 1477
1478 msleep(50);
2062 1479
2063 nb_steps = -1 + ((i_params->dmd2_srch_range / 1000) / currier_step); 1480 for (i = 0; i < 10; i++) {
2064 nb_steps /= 2; 1481 if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2)
2065 nb_steps = (2 * nb_steps) + 1; 1482 timingcpt++;
2066 1483
2067 if (nb_steps < 0) 1484 agc2_integr += (stv0900_read_reg(intp, AGC2I1) << 8) |
2068 nb_steps = 1; 1485 stv0900_read_reg(intp, AGC2I0);
2069 else if (nb_steps > 10) {
2070 nb_steps = 11;
2071 currier_step = (i_params->dmd2_srch_range / 1000) / 10;
2072 } 1486 }
2073 1487
2074 current_step = 0; 1488 agc2_integr /= 10;
2075 direction = 1; 1489 coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
2076 tuner_freq = i_params->tuner2_freq; 1490 current_step++;
2077 1491 direction *= -1;
2078 while ((timingLock == FALSE) && (current_step < nb_steps)) { 1492
2079 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5F); 1493 dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started."
2080 stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x0); 1494 " tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n",
2081 1495 tuner_freq, agc2_integr, coarse_srate, timingcpt);
2082 msleep(50); 1496
2083 timingcpt = 0; 1497 if ((timingcpt >= 5) &&
2084 1498 (agc2_integr < agc2_th) &&
2085 for (i = 0; i < 20; i++) { 1499 (coarse_srate < 55000000) &&
2086 if (stv0900_get_bits(i_params, F0900_P2_TMGLOCK_QUALITY) >= 2) 1500 (coarse_srate > 850000))
2087 timingcpt++; 1501 timing_lck = TRUE;
2088 agc2_integr += (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8) 1502 else if (current_step < nb_steps) {
2089 | stv0900_read_reg(i_params, R0900_P2_AGC2I0); 1503 if (direction > 0)
2090 } 1504 tuner_freq += (current_step * currier_step);
2091 1505 else
2092 agc2_integr /= 20; 1506 tuner_freq -= (current_step * currier_step);
2093 coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
2094 if ((timingcpt >= 10) && (agc2_integr < 0x1F00) && (coarse_srate < 55000000) && (coarse_srate > 850000))
2095 timingLock = TRUE;
2096 else {
2097 current_step++;
2098 direction *= -1;
2099
2100 if (direction > 0)
2101 tuner_freq += (current_step * currier_step);
2102 else
2103 tuner_freq -= (current_step * currier_step);
2104 1507
2105 stv0900_set_tuner(fe, tuner_freq, i_params->tuner2_bw); 1508 if (intp->tuner_type[demod] == 3)
2106 } 1509 stv0900_set_tuner_auto(intp, tuner_freq,
1510 intp->bw[demod], demod);
1511 else
1512 stv0900_set_tuner(fe, tuner_freq,
1513 intp->bw[demod]);
2107 } 1514 }
2108
2109 if (timingLock == FALSE)
2110 coarse_srate = 0;
2111 else
2112 coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
2113 break;
2114 } 1515 }
2115 1516
1517 if (timing_lck == FALSE)
1518 coarse_srate = 0;
1519 else
1520 coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
1521
2116 return coarse_srate; 1522 return coarse_srate;
2117} 1523}
2118 1524
2119static u32 stv0900_search_srate_fine(struct dvb_frontend *fe) 1525static u32 stv0900_search_srate_fine(struct dvb_frontend *fe)
2120{ 1526{
2121 struct stv0900_state *state = fe->demodulator_priv; 1527 struct stv0900_state *state = fe->demodulator_priv;
2122 struct stv0900_internal *i_params = state->internal; 1528 struct stv0900_internal *intp = state->internal;
2123 enum fe_stv0900_demod_num demod = state->demod; 1529 enum fe_stv0900_demod_num demod = state->demod;
2124 u32 coarse_srate, 1530 u32 coarse_srate,
2125 coarse_freq, 1531 coarse_freq,
2126 symb; 1532 symb,
1533 symbmax,
1534 symbmin,
1535 symbcomp;
1536
1537 coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
1538
1539 if (coarse_srate > 3000000) {
1540 symbmax = 13 * (coarse_srate / 10);
1541 symbmax = (symbmax / 1000) * 65536;
1542 symbmax /= (intp->mclk / 1000);
1543
1544 symbmin = 10 * (coarse_srate / 13);
1545 symbmin = (symbmin / 1000)*65536;
1546 symbmin /= (intp->mclk / 1000);
1547
1548 symb = (coarse_srate / 1000) * 65536;
1549 symb /= (intp->mclk / 1000);
1550 } else {
1551 symbmax = 13 * (coarse_srate / 10);
1552 symbmax = (symbmax / 100) * 65536;
1553 symbmax /= (intp->mclk / 100);
2127 1554
2128 coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod); 1555 symbmin = 10 * (coarse_srate / 14);
1556 symbmin = (symbmin / 100) * 65536;
1557 symbmin /= (intp->mclk / 100);
2129 1558
2130 switch (demod) { 1559 symb = (coarse_srate / 100) * 65536;
2131 case STV0900_DEMOD_1: 1560 symb /= (intp->mclk / 100);
2132 default: 1561 }
2133 coarse_freq = (stv0900_read_reg(i_params, R0900_P1_CFR2) << 8)
2134 | stv0900_read_reg(i_params, R0900_P1_CFR1);
2135 symb = 13 * (coarse_srate / 10);
2136
2137 if (symb < i_params->dmd1_symbol_rate)
2138 coarse_srate = 0;
2139 else {
2140 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F);
2141 stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01);
2142 stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0x20);
2143 stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0x00);
2144 stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0xd2);
2145 stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
2146
2147 if (i_params->chip_id >= 0x20)
2148 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x49);
2149 else
2150 stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed);
2151
2152 if (coarse_srate > 3000000) {
2153 symb = 13 * (coarse_srate / 10);
2154 symb = (symb / 1000) * 65536;
2155 symb /= (i_params->mclk / 1000);
2156 stv0900_write_reg(i_params, R0900_P1_SFRUP1, (symb >> 8) & 0x7F);
2157 stv0900_write_reg(i_params, R0900_P1_SFRUP0, (symb & 0xFF));
2158
2159 symb = 10 * (coarse_srate / 13);
2160 symb = (symb / 1000) * 65536;
2161 symb /= (i_params->mclk / 1000);
2162
2163 stv0900_write_reg(i_params, R0900_P1_SFRLOW1, (symb >> 8) & 0x7F);
2164 stv0900_write_reg(i_params, R0900_P1_SFRLOW0, (symb & 0xFF));
2165
2166 symb = (coarse_srate / 1000) * 65536;
2167 symb /= (i_params->mclk / 1000);
2168 stv0900_write_reg(i_params, R0900_P1_SFRINIT1, (symb >> 8) & 0xFF);
2169 stv0900_write_reg(i_params, R0900_P1_SFRINIT0, (symb & 0xFF));
2170 } else {
2171 symb = 13 * (coarse_srate / 10);
2172 symb = (symb / 100) * 65536;
2173 symb /= (i_params->mclk / 100);
2174 stv0900_write_reg(i_params, R0900_P1_SFRUP1, (symb >> 8) & 0x7F);
2175 stv0900_write_reg(i_params, R0900_P1_SFRUP0, (symb & 0xFF));
2176
2177 symb = 10 * (coarse_srate / 14);
2178 symb = (symb / 100) * 65536;
2179 symb /= (i_params->mclk / 100);
2180 stv0900_write_reg(i_params, R0900_P1_SFRLOW1, (symb >> 8) & 0x7F);
2181 stv0900_write_reg(i_params, R0900_P1_SFRLOW0, (symb & 0xFF));
2182
2183 symb = (coarse_srate / 100) * 65536;
2184 symb /= (i_params->mclk / 100);
2185 stv0900_write_reg(i_params, R0900_P1_SFRINIT1, (symb >> 8) & 0xFF);
2186 stv0900_write_reg(i_params, R0900_P1_SFRINIT0, (symb & 0xFF));
2187 }
2188 1562
2189 stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x20); 1563 symbcomp = 13 * (coarse_srate / 10);
2190 stv0900_write_reg(i_params, R0900_P1_CFRINIT1, (coarse_freq >> 8) & 0xff); 1564 coarse_freq = (stv0900_read_reg(intp, CFR2) << 8)
2191 stv0900_write_reg(i_params, R0900_P1_CFRINIT0, coarse_freq & 0xff); 1565 | stv0900_read_reg(intp, CFR1);
2192 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15); 1566
2193 } 1567 if (symbcomp < intp->symbol_rate[demod])
2194 break; 1568 coarse_srate = 0;
2195 case STV0900_DEMOD_2: 1569 else {
2196 coarse_freq = (stv0900_read_reg(i_params, R0900_P2_CFR2) << 8) 1570 stv0900_write_reg(intp, DMDISTATE, 0x1f);
2197 | stv0900_read_reg(i_params, R0900_P2_CFR1); 1571 stv0900_write_reg(intp, TMGCFG2, 0xc1);
2198 1572 stv0900_write_reg(intp, TMGTHRISE, 0x20);
2199 symb = 13 * (coarse_srate / 10); 1573 stv0900_write_reg(intp, TMGTHFALL, 0x00);
2200 1574 stv0900_write_reg(intp, TMGCFG, 0xd2);
2201 if (symb < i_params->dmd2_symbol_rate) 1575 stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
2202 coarse_srate = 0; 1576 stv0900_write_reg(intp, AGC2REF, 0x38);
2203 else { 1577
2204 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F); 1578 if (intp->chip_id >= 0x30)
2205 stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01); 1579 stv0900_write_reg(intp, CARFREQ, 0x79);
2206 stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0x20); 1580 else if (intp->chip_id >= 0x20)
2207 stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0x00); 1581 stv0900_write_reg(intp, CARFREQ, 0x49);
2208 stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0xd2); 1582 else
2209 stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0); 1583 stv0900_write_reg(intp, CARFREQ, 0xed);
2210
2211 if (i_params->chip_id >= 0x20)
2212 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x49);
2213 else
2214 stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed);
2215
2216 if (coarse_srate > 3000000) {
2217 symb = 13 * (coarse_srate / 10);
2218 symb = (symb / 1000) * 65536;
2219 symb /= (i_params->mclk / 1000);
2220 stv0900_write_reg(i_params, R0900_P2_SFRUP1, (symb >> 8) & 0x7F);
2221 stv0900_write_reg(i_params, R0900_P2_SFRUP0, (symb & 0xFF));
2222
2223 symb = 10 * (coarse_srate / 13);
2224 symb = (symb / 1000) * 65536;
2225 symb /= (i_params->mclk / 1000);
2226
2227 stv0900_write_reg(i_params, R0900_P2_SFRLOW1, (symb >> 8) & 0x7F);
2228 stv0900_write_reg(i_params, R0900_P2_SFRLOW0, (symb & 0xFF));
2229
2230 symb = (coarse_srate / 1000) * 65536;
2231 symb /= (i_params->mclk / 1000);
2232 stv0900_write_reg(i_params, R0900_P2_SFRINIT1, (symb >> 8) & 0xFF);
2233 stv0900_write_reg(i_params, R0900_P2_SFRINIT0, (symb & 0xFF));
2234 } else {
2235 symb = 13 * (coarse_srate / 10);
2236 symb = (symb / 100) * 65536;
2237 symb /= (i_params->mclk / 100);
2238 stv0900_write_reg(i_params, R0900_P2_SFRUP1, (symb >> 8) & 0x7F);
2239 stv0900_write_reg(i_params, R0900_P2_SFRUP0, (symb & 0xFF));
2240
2241 symb = 10 * (coarse_srate / 14);
2242 symb = (symb / 100) * 65536;
2243 symb /= (i_params->mclk / 100);
2244 stv0900_write_reg(i_params, R0900_P2_SFRLOW1, (symb >> 8) & 0x7F);
2245 stv0900_write_reg(i_params, R0900_P2_SFRLOW0, (symb & 0xFF));
2246
2247 symb = (coarse_srate / 100) * 65536;
2248 symb /= (i_params->mclk / 100);
2249 stv0900_write_reg(i_params, R0900_P2_SFRINIT1, (symb >> 8) & 0xFF);
2250 stv0900_write_reg(i_params, R0900_P2_SFRINIT0, (symb & 0xFF));
2251 }
2252 1584
2253 stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x20); 1585 stv0900_write_reg(intp, SFRUP1, (symbmax >> 8) & 0x7f);
2254 stv0900_write_reg(i_params, R0900_P2_CFRINIT1, (coarse_freq >> 8) & 0xff); 1586 stv0900_write_reg(intp, SFRUP0, (symbmax & 0xff));
2255 stv0900_write_reg(i_params, R0900_P2_CFRINIT0, coarse_freq & 0xff);
2256 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15);
2257 }
2258 1587
2259 break; 1588 stv0900_write_reg(intp, SFRLOW1, (symbmin >> 8) & 0x7f);
1589 stv0900_write_reg(intp, SFRLOW0, (symbmin & 0xff));
1590
1591 stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0xff);
1592 stv0900_write_reg(intp, SFRINIT0, (symb & 0xff));
1593
1594 stv0900_write_reg(intp, DMDT0M, 0x20);
1595 stv0900_write_reg(intp, CFRINIT1, (coarse_freq >> 8) & 0xff);
1596 stv0900_write_reg(intp, CFRINIT0, coarse_freq & 0xff);
1597 stv0900_write_reg(intp, DMDISTATE, 0x15);
2260 } 1598 }
2261 1599
2262 return coarse_srate; 1600 return coarse_srate;
@@ -2265,163 +1603,136 @@ static u32 stv0900_search_srate_fine(struct dvb_frontend *fe)
2265static int stv0900_blind_search_algo(struct dvb_frontend *fe) 1603static int stv0900_blind_search_algo(struct dvb_frontend *fe)
2266{ 1604{
2267 struct stv0900_state *state = fe->demodulator_priv; 1605 struct stv0900_state *state = fe->demodulator_priv;
2268 struct stv0900_internal *i_params = state->internal; 1606 struct stv0900_internal *intp = state->internal;
2269 enum fe_stv0900_demod_num demod = state->demod; 1607 enum fe_stv0900_demod_num demod = state->demod;
2270 u8 k_ref_tmg, k_ref_tmg_max, k_ref_tmg_min; 1608 u8 k_ref_tmg,
2271 u32 coarse_srate; 1609 k_ref_tmg_max,
2272 int lock = FALSE, coarse_fail = FALSE; 1610 k_ref_tmg_min;
2273 s32 demod_timeout = 500, fec_timeout = 50, kref_tmg_reg, fail_cpt, i, agc2_overflow; 1611 u32 coarse_srate,
2274 u16 agc2_integr; 1612 agc2_th;
2275 u8 dstatus2; 1613 int lock = FALSE,
2276 1614 coarse_fail = FALSE;
2277 dprintk(KERN_INFO "%s\n", __func__); 1615 s32 demod_timeout = 500,
2278 1616 fec_timeout = 50,
2279 if (i_params->chip_id < 0x20) { 1617 fail_cpt,
1618 i,
1619 agc2_overflow;
1620 u16 agc2_int;
1621 u8 dstatus2;
1622
1623 dprintk("%s\n", __func__);
1624
1625 if (intp->chip_id < 0x20) {
2280 k_ref_tmg_max = 233; 1626 k_ref_tmg_max = 233;
2281 k_ref_tmg_min = 143; 1627 k_ref_tmg_min = 143;
2282 } else { 1628 } else {
2283 k_ref_tmg_max = 120; 1629 k_ref_tmg_max = 110;
2284 k_ref_tmg_min = 30; 1630 k_ref_tmg_min = 10;
2285 } 1631 }
2286 1632
2287 agc2_integr = stv0900_blind_check_agc2_min_level(i_params, demod); 1633 if (intp->chip_id <= 0x20)
2288 1634 agc2_th = STV0900_BLIND_SEARCH_AGC2_TH;
2289 if (agc2_integr > STV0900_BLIND_SEARCH_AGC2_TH) { 1635 else
2290 lock = FALSE; 1636 agc2_th = STV0900_BLIND_SEARCH_AGC2_TH_CUT30;
2291
2292 } else {
2293 switch (demod) {
2294 case STV0900_DEMOD_1:
2295 default:
2296 if (i_params->chip_id == 0x10)
2297 stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0xAA);
2298
2299 if (i_params->chip_id < 0x20)
2300 stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x55);
2301
2302 stv0900_write_reg(i_params, R0900_P1_CARCFG, 0xC4);
2303 stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x44);
2304
2305 if (i_params->chip_id >= 0x20) {
2306 stv0900_write_reg(i_params, R0900_P1_EQUALCFG, 0x41);
2307 stv0900_write_reg(i_params, R0900_P1_FFECFG, 0x41);
2308 stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x82);
2309 stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0);
2310 }
2311
2312 kref_tmg_reg = R0900_P1_KREFTMG;
2313 break;
2314 case STV0900_DEMOD_2:
2315 if (i_params->chip_id == 0x10)
2316 stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0xAA);
2317
2318 if (i_params->chip_id < 0x20)
2319 stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x55);
2320 1637
2321 stv0900_write_reg(i_params, R0900_P2_CARCFG, 0xC4); 1638 agc2_int = stv0900_blind_check_agc2_min_level(intp, demod);
2322 stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x44);
2323 1639
2324 if (i_params->chip_id >= 0x20) { 1640 dprintk("%s agc2_int=%d agc2_th=%d \n", __func__, agc2_int, agc2_th);
2325 stv0900_write_reg(i_params, R0900_P2_EQUALCFG, 0x41); 1641 if (agc2_int > agc2_th)
2326 stv0900_write_reg(i_params, R0900_P2_FFECFG, 0x41); 1642 return FALSE;
2327 stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x82);
2328 stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0);
2329 }
2330 1643
2331 kref_tmg_reg = R0900_P2_KREFTMG; 1644 if (intp->chip_id == 0x10)
2332 break; 1645 stv0900_write_reg(intp, CORRELEXP, 0xaa);
2333 }
2334 1646
2335 k_ref_tmg = k_ref_tmg_max; 1647 if (intp->chip_id < 0x20)
1648 stv0900_write_reg(intp, CARHDR, 0x55);
1649 else
1650 stv0900_write_reg(intp, CARHDR, 0x20);
2336 1651
2337 do { 1652 if (intp->chip_id <= 0x20)
2338 stv0900_write_reg(i_params, kref_tmg_reg, k_ref_tmg); 1653 stv0900_write_reg(intp, CARCFG, 0xc4);
2339 if (stv0900_search_srate_coarse(fe) != 0) { 1654 else
2340 coarse_srate = stv0900_search_srate_fine(fe); 1655 stv0900_write_reg(intp, CARCFG, 0x6);
2341 1656
2342 if (coarse_srate != 0) { 1657 stv0900_write_reg(intp, RTCS2, 0x44);
2343 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, coarse_srate, STV0900_BLIND_SEARCH);
2344 lock = stv0900_get_demod_lock(i_params, demod, demod_timeout);
2345 } else
2346 lock = FALSE;
2347 } else {
2348 fail_cpt = 0;
2349 agc2_overflow = 0;
2350 1658
2351 switch (demod) { 1659 if (intp->chip_id >= 0x20) {
2352 case STV0900_DEMOD_1: 1660 stv0900_write_reg(intp, EQUALCFG, 0x41);
2353 default: 1661 stv0900_write_reg(intp, FFECFG, 0x41);
2354 for (i = 0; i < 10; i++) { 1662 stv0900_write_reg(intp, VITSCALE, 0x82);
2355 agc2_integr = (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) 1663 stv0900_write_reg(intp, VAVSRVIT, 0x0);
2356 | stv0900_read_reg(i_params, R0900_P1_AGC2I0); 1664 }
2357 1665
2358 if (agc2_integr >= 0xff00) 1666 k_ref_tmg = k_ref_tmg_max;
2359 agc2_overflow++;
2360 1667
2361 dstatus2 = stv0900_read_reg(i_params, R0900_P1_DSTATUS2); 1668 do {
1669 stv0900_write_reg(intp, KREFTMG, k_ref_tmg);
1670 if (stv0900_search_srate_coarse(fe) != 0) {
1671 coarse_srate = stv0900_search_srate_fine(fe);
1672
1673 if (coarse_srate != 0) {
1674 stv0900_get_lock_timeout(&demod_timeout,
1675 &fec_timeout,
1676 coarse_srate,
1677 STV0900_BLIND_SEARCH);
1678 lock = stv0900_get_demod_lock(intp,
1679 demod,
1680 demod_timeout);
1681 } else
1682 lock = FALSE;
1683 } else {
1684 fail_cpt = 0;
1685 agc2_overflow = 0;
2362 1686
2363 if (((dstatus2 & 0x1) == 0x1) && ((dstatus2 >> 7) == 1)) 1687 for (i = 0; i < 10; i++) {
2364 fail_cpt++; 1688 agc2_int = (stv0900_read_reg(intp, AGC2I1) << 8)
2365 } 1689 | stv0900_read_reg(intp, AGC2I0);
2366 break;
2367 case STV0900_DEMOD_2:
2368 for (i = 0; i < 10; i++) {
2369 agc2_integr = (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
2370 | stv0900_read_reg(i_params, R0900_P2_AGC2I0);
2371 1690
2372 if (agc2_integr >= 0xff00) 1691 if (agc2_int >= 0xff00)
2373 agc2_overflow++; 1692 agc2_overflow++;
2374 1693
2375 dstatus2 = stv0900_read_reg(i_params, R0900_P2_DSTATUS2); 1694 dstatus2 = stv0900_read_reg(intp, DSTATUS2);
2376 1695
2377 if (((dstatus2 & 0x1) == 0x1) && ((dstatus2 >> 7) == 1)) 1696 if (((dstatus2 & 0x1) == 0x1) &&
2378 fail_cpt++; 1697 ((dstatus2 >> 7) == 1))
2379 } 1698 fail_cpt++;
2380 break; 1699 }
2381 }
2382 1700
2383 if ((fail_cpt > 7) || (agc2_overflow > 7)) 1701 if ((fail_cpt > 7) || (agc2_overflow > 7))
2384 coarse_fail = TRUE; 1702 coarse_fail = TRUE;
2385 1703
2386 lock = FALSE; 1704 lock = FALSE;
2387 } 1705 }
2388 k_ref_tmg -= 30; 1706 k_ref_tmg -= 30;
2389 } while ((k_ref_tmg >= k_ref_tmg_min) && (lock == FALSE) && (coarse_fail == FALSE)); 1707 } while ((k_ref_tmg >= k_ref_tmg_min) &&
2390 } 1708 (lock == FALSE) &&
1709 (coarse_fail == FALSE));
2391 1710
2392 return lock; 1711 return lock;
2393} 1712}
2394 1713
2395static void stv0900_set_viterbi_acq(struct stv0900_internal *i_params, 1714static void stv0900_set_viterbi_acq(struct stv0900_internal *intp,
2396 enum fe_stv0900_demod_num demod) 1715 enum fe_stv0900_demod_num demod)
2397{ 1716{
2398 s32 vth_reg; 1717 s32 vth_reg = VTH12;
2399 1718
2400 dprintk(KERN_INFO "%s\n", __func__); 1719 dprintk("%s\n", __func__);
2401 1720
2402 dmd_reg(vth_reg, R0900_P1_VTH12, R0900_P2_VTH12); 1721 stv0900_write_reg(intp, vth_reg++, 0x96);
2403 1722 stv0900_write_reg(intp, vth_reg++, 0x64);
2404 stv0900_write_reg(i_params, vth_reg++, 0x96); 1723 stv0900_write_reg(intp, vth_reg++, 0x36);
2405 stv0900_write_reg(i_params, vth_reg++, 0x64); 1724 stv0900_write_reg(intp, vth_reg++, 0x23);
2406 stv0900_write_reg(i_params, vth_reg++, 0x36); 1725 stv0900_write_reg(intp, vth_reg++, 0x1e);
2407 stv0900_write_reg(i_params, vth_reg++, 0x23); 1726 stv0900_write_reg(intp, vth_reg++, 0x19);
2408 stv0900_write_reg(i_params, vth_reg++, 0x1E);
2409 stv0900_write_reg(i_params, vth_reg++, 0x19);
2410} 1727}
2411 1728
2412static void stv0900_set_search_standard(struct stv0900_internal *i_params, 1729static void stv0900_set_search_standard(struct stv0900_internal *intp,
2413 enum fe_stv0900_demod_num demod) 1730 enum fe_stv0900_demod_num demod)
2414{ 1731{
2415 1732
2416 int sstndrd; 1733 dprintk("%s\n", __func__);
2417
2418 dprintk(KERN_INFO "%s\n", __func__);
2419 1734
2420 sstndrd = i_params->dmd1_srch_standard; 1735 switch (intp->srch_standard[demod]) {
2421 if (demod == 1)
2422 sstndrd = i_params->dmd2_srch_stndrd;
2423
2424 switch (sstndrd) {
2425 case STV0900_SEARCH_DVBS1: 1736 case STV0900_SEARCH_DVBS1:
2426 dprintk("Search Standard = DVBS1\n"); 1737 dprintk("Search Standard = DVBS1\n");
2427 break; 1738 break;
@@ -2436,129 +1747,74 @@ static void stv0900_set_search_standard(struct stv0900_internal *i_params,
2436 break; 1747 break;
2437 } 1748 }
2438 1749
2439 switch (demod) { 1750 switch (intp->srch_standard[demod]) {
2440 case STV0900_DEMOD_1: 1751 case STV0900_SEARCH_DVBS1:
2441 default: 1752 case STV0900_SEARCH_DSS:
2442 switch (i_params->dmd1_srch_standard) { 1753 stv0900_write_bits(intp, DVBS1_ENABLE, 1);
2443 case STV0900_SEARCH_DVBS1: 1754 stv0900_write_bits(intp, DVBS2_ENABLE, 0);
2444 case STV0900_SEARCH_DSS: 1755 stv0900_write_bits(intp, STOP_CLKVIT, 0);
2445 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1); 1756 stv0900_set_dvbs1_track_car_loop(intp,
2446 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0); 1757 demod,
2447 1758 intp->symbol_rate[demod]);
2448 stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 0); 1759 stv0900_write_reg(intp, CAR2CFG, 0x22);
2449 stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a); 1760
2450 stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09); 1761 stv0900_set_viterbi_acq(intp, demod);
2451 stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x22); 1762 stv0900_set_viterbi_standard(intp,
2452 1763 intp->srch_standard[demod],
2453 stv0900_set_viterbi_acq(i_params, demod); 1764 intp->fec[demod], demod);
2454 stv0900_set_viterbi_standard(i_params,
2455 i_params->dmd1_srch_standard,
2456 i_params->dmd1_fec, demod);
2457
2458 break;
2459 case STV0900_SEARCH_DVBS2:
2460 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
2461 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
2462 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
2463 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
2464 stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 1);
2465 stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a);
2466 stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09);
2467 stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x26);
2468 if (i_params->demod_mode != STV0900_SINGLE) {
2469 if (i_params->chip_id <= 0x11)
2470 stv0900_stop_all_s2_modcod(i_params, demod);
2471 else
2472 stv0900_activate_s2_modcode(i_params, demod);
2473
2474 } else
2475 stv0900_activate_s2_modcode_single(i_params, demod);
2476
2477 stv0900_set_viterbi_tracq(i_params, demod);
2478
2479 break;
2480 case STV0900_AUTO_SEARCH:
2481 default:
2482 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
2483 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
2484 stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
2485 stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
2486 stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 0);
2487 stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a);
2488 stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09);
2489 stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x26);
2490 if (i_params->demod_mode != STV0900_SINGLE) {
2491 if (i_params->chip_id <= 0x11)
2492 stv0900_stop_all_s2_modcod(i_params, demod);
2493 else
2494 stv0900_activate_s2_modcode(i_params, demod);
2495 1765
2496 } else 1766 break;
2497 stv0900_activate_s2_modcode_single(i_params, demod); 1767 case STV0900_SEARCH_DVBS2:
1768 stv0900_write_bits(intp, DVBS1_ENABLE, 0);
1769 stv0900_write_bits(intp, DVBS2_ENABLE, 1);
1770 stv0900_write_bits(intp, STOP_CLKVIT, 1);
1771 stv0900_write_reg(intp, ACLC, 0x1a);
1772 stv0900_write_reg(intp, BCLC, 0x09);
1773 if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/
1774 stv0900_write_reg(intp, CAR2CFG, 0x26);
1775 else
1776 stv0900_write_reg(intp, CAR2CFG, 0x66);
2498 1777
2499 if (i_params->dmd1_symbol_rate >= 2000000) 1778 if (intp->demod_mode != STV0900_SINGLE) {
2500 stv0900_set_viterbi_acq(i_params, demod); 1779 if (intp->chip_id <= 0x11)
1780 stv0900_stop_all_s2_modcod(intp, demod);
2501 else 1781 else
2502 stv0900_set_viterbi_tracq(i_params, demod); 1782 stv0900_activate_s2_modcod(intp, demod);
2503 1783
2504 stv0900_set_viterbi_standard(i_params, i_params->dmd1_srch_standard, i_params->dmd1_fec, demod); 1784 } else
1785 stv0900_activate_s2_modcod_single(intp, demod);
2505 1786
2506 break; 1787 stv0900_set_viterbi_tracq(intp, demod);
2507 }
2508 break;
2509 case STV0900_DEMOD_2:
2510 switch (i_params->dmd2_srch_stndrd) {
2511 case STV0900_SEARCH_DVBS1:
2512 case STV0900_SEARCH_DSS:
2513 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
2514 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
2515 stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 0);
2516 stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a);
2517 stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09);
2518 stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x22);
2519 stv0900_set_viterbi_acq(i_params, demod);
2520 stv0900_set_viterbi_standard(i_params, i_params->dmd2_srch_stndrd, i_params->dmd2_fec, demod);
2521 break;
2522 case STV0900_SEARCH_DVBS2:
2523 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0);
2524 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
2525 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
2526 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
2527 stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 1);
2528 stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a);
2529 stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09);
2530 stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x26);
2531 if (i_params->demod_mode != STV0900_SINGLE)
2532 stv0900_activate_s2_modcode(i_params, demod);
2533 else
2534 stv0900_activate_s2_modcode_single(i_params, demod);
2535 1788
2536 stv0900_set_viterbi_tracq(i_params, demod); 1789 break;
2537 break; 1790 case STV0900_AUTO_SEARCH:
2538 case STV0900_AUTO_SEARCH: 1791 default:
2539 default: 1792 stv0900_write_bits(intp, DVBS1_ENABLE, 1);
2540 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0); 1793 stv0900_write_bits(intp, DVBS2_ENABLE, 1);
2541 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0); 1794 stv0900_write_bits(intp, STOP_CLKVIT, 0);
2542 stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1); 1795 stv0900_write_reg(intp, ACLC, 0x1a);
2543 stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1); 1796 stv0900_write_reg(intp, BCLC, 0x09);
2544 stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 0); 1797 stv0900_set_dvbs1_track_car_loop(intp,
2545 stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a); 1798 demod,
2546 stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09); 1799 intp->symbol_rate[demod]);
2547 stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x26); 1800 if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/
2548 if (i_params->demod_mode != STV0900_SINGLE) 1801 stv0900_write_reg(intp, CAR2CFG, 0x26);
2549 stv0900_activate_s2_modcode(i_params, demod); 1802 else
2550 else 1803 stv0900_write_reg(intp, CAR2CFG, 0x66);
2551 stv0900_activate_s2_modcode_single(i_params, demod);
2552 1804
2553 if (i_params->dmd2_symbol_rate >= 2000000) 1805 if (intp->demod_mode != STV0900_SINGLE) {
2554 stv0900_set_viterbi_acq(i_params, demod); 1806 if (intp->chip_id <= 0x11)
1807 stv0900_stop_all_s2_modcod(intp, demod);
2555 else 1808 else
2556 stv0900_set_viterbi_tracq(i_params, demod); 1809 stv0900_activate_s2_modcod(intp, demod);
2557 1810
2558 stv0900_set_viterbi_standard(i_params, i_params->dmd2_srch_stndrd, i_params->dmd2_fec, demod); 1811 } else
1812 stv0900_activate_s2_modcod_single(intp, demod);
2559 1813
2560 break; 1814 stv0900_set_viterbi_tracq(intp, demod);
2561 } 1815 stv0900_set_viterbi_standard(intp,
1816 intp->srch_standard[demod],
1817 intp->fec[demod], demod);
2562 1818
2563 break; 1819 break;
2564 } 1820 }
@@ -2567,10 +1823,11 @@ static void stv0900_set_search_standard(struct stv0900_internal *i_params,
2567enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe) 1823enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
2568{ 1824{
2569 struct stv0900_state *state = fe->demodulator_priv; 1825 struct stv0900_state *state = fe->demodulator_priv;
2570 struct stv0900_internal *i_params = state->internal; 1826 struct stv0900_internal *intp = state->internal;
2571 enum fe_stv0900_demod_num demod = state->demod; 1827 enum fe_stv0900_demod_num demod = state->demod;
2572 1828
2573 s32 demod_timeout = 500, fec_timeout = 50, stream_merger_field; 1829 s32 demod_timeout = 500, fec_timeout = 50;
1830 s32 aq_power, agc1_power, i;
2574 1831
2575 int lock = FALSE, low_sr = FALSE; 1832 int lock = FALSE, low_sr = FALSE;
2576 1833
@@ -2578,157 +1835,121 @@ enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
2578 enum fe_stv0900_search_algo algo; 1835 enum fe_stv0900_search_algo algo;
2579 int no_signal = FALSE; 1836 int no_signal = FALSE;
2580 1837
2581 dprintk(KERN_INFO "%s\n", __func__); 1838 dprintk("%s\n", __func__);
2582
2583 switch (demod) {
2584 case STV0900_DEMOD_1:
2585 default:
2586 algo = i_params->dmd1_srch_algo;
2587
2588 stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 1);
2589 stream_merger_field = F0900_P1_RST_HWARE;
2590
2591 stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5C);
2592 1839
2593 if (i_params->chip_id >= 0x20) 1840 algo = intp->srch_algo[demod];
2594 stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x9e); 1841 stv0900_write_bits(intp, RST_HWARE, 1);
1842 stv0900_write_reg(intp, DMDISTATE, 0x5c);
1843 if (intp->chip_id >= 0x20) {
1844 if (intp->symbol_rate[demod] > 5000000)
1845 stv0900_write_reg(intp, CORRELABS, 0x9e);
2595 else 1846 else
2596 stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x88); 1847 stv0900_write_reg(intp, CORRELABS, 0x82);
2597 1848 } else
2598 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, i_params->dmd1_symbol_rate, i_params->dmd1_srch_algo); 1849 stv0900_write_reg(intp, CORRELABS, 0x88);
2599
2600 if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) {
2601 i_params->tuner1_bw = 2 * 36000000;
2602
2603 stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x00);
2604 stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x70);
2605
2606 stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
2607 } else {
2608 stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x20);
2609 stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0xd2);
2610
2611 if (i_params->dmd1_symbol_rate < 2000000)
2612 stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x63);
2613 else
2614 stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x70);
2615
2616 stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
2617 if (i_params->chip_id >= 0x20) {
2618 stv0900_write_reg(i_params, R0900_P1_KREFTMG, 0x5a);
2619
2620 if (i_params->dmd1_srch_algo == STV0900_COLD_START)
2621 i_params->tuner1_bw = (15 * (stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000)) / 10;
2622 else if (i_params->dmd1_srch_algo == STV0900_WARM_START)
2623 i_params->tuner1_bw = stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000;
2624 } else {
2625 stv0900_write_reg(i_params, R0900_P1_KREFTMG, 0xc1);
2626 i_params->tuner1_bw = (15 * (stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000)) / 10;
2627 }
2628
2629 stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01);
2630
2631 stv0900_set_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod);
2632 stv0900_set_max_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod);
2633 stv0900_set_min_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod);
2634 if (i_params->dmd1_symbol_rate >= 10000000)
2635 low_sr = FALSE;
2636 else
2637 low_sr = TRUE;
2638
2639 }
2640
2641 stv0900_set_tuner(fe, i_params->tuner1_freq, i_params->tuner1_bw);
2642
2643 stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, i_params->dmd1_srch_iq_inv);
2644 stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1);
2645
2646 stv0900_set_search_standard(i_params, demod);
2647 1850
2648 if (i_params->dmd1_srch_algo != STV0900_BLIND_SEARCH) 1851 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout,
2649 stv0900_start_search(i_params, demod); 1852 intp->symbol_rate[demod],
2650 break; 1853 intp->srch_algo[demod]);
2651 case STV0900_DEMOD_2:
2652 algo = i_params->dmd2_srch_algo;
2653 1854
2654 stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 1); 1855 if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) {
1856 intp->bw[demod] = 2 * 36000000;
2655 1857
2656 stream_merger_field = F0900_P2_RST_HWARE; 1858 stv0900_write_reg(intp, TMGCFG2, 0xc0);
1859 stv0900_write_reg(intp, CORRELMANT, 0x70);
2657 1860
2658 stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5C); 1861 stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod);
1862 } else {
1863 stv0900_write_reg(intp, DMDT0M, 0x20);
1864 stv0900_write_reg(intp, TMGCFG, 0xd2);
2659 1865
2660 if (i_params->chip_id >= 0x20) 1866 if (intp->symbol_rate[demod] < 2000000)
2661 stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x9e); 1867 stv0900_write_reg(intp, CORRELMANT, 0x63);
2662 else 1868 else
2663 stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x88); 1869 stv0900_write_reg(intp, CORRELMANT, 0x70);
2664 1870
2665 stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, i_params->dmd2_symbol_rate, i_params->dmd2_srch_algo); 1871 stv0900_write_reg(intp, AGC2REF, 0x38);
2666 1872
2667 if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) { 1873 intp->bw[demod] =
2668 i_params->tuner2_bw = 2 * 36000000; 1874 stv0900_carrier_width(intp->symbol_rate[demod],
1875 intp->rolloff);
1876 if (intp->chip_id >= 0x20) {
1877 stv0900_write_reg(intp, KREFTMG, 0x5a);
2669 1878
2670 stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x00); 1879 if (intp->srch_algo[demod] == STV0900_COLD_START) {
2671 stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x70); 1880 intp->bw[demod] += 10000000;
1881 intp->bw[demod] *= 15;
1882 intp->bw[demod] /= 10;
1883 } else if (intp->srch_algo[demod] == STV0900_WARM_START)
1884 intp->bw[demod] += 10000000;
2672 1885
2673 stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
2674 } else { 1886 } else {
2675 stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x20); 1887 stv0900_write_reg(intp, KREFTMG, 0xc1);
2676 stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0xd2); 1888 intp->bw[demod] += 10000000;
1889 intp->bw[demod] *= 15;
1890 intp->bw[demod] /= 10;
1891 }
2677 1892
2678 if (i_params->dmd2_symbol_rate < 2000000) 1893 stv0900_write_reg(intp, TMGCFG2, 0xc1);
2679 stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x63);
2680 else
2681 stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x70);
2682 1894
2683 if (i_params->dmd2_symbol_rate >= 10000000) 1895 stv0900_set_symbol_rate(intp, intp->mclk,
2684 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38); 1896 intp->symbol_rate[demod], demod);
2685 else 1897 stv0900_set_max_symbol_rate(intp, intp->mclk,
2686 stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x60); 1898 intp->symbol_rate[demod], demod);
1899 stv0900_set_min_symbol_rate(intp, intp->mclk,
1900 intp->symbol_rate[demod], demod);
1901 if (intp->symbol_rate[demod] >= 10000000)
1902 low_sr = FALSE;
1903 else
1904 low_sr = TRUE;
2687 1905
2688 if (i_params->chip_id >= 0x20) { 1906 }
2689 stv0900_write_reg(i_params, R0900_P2_KREFTMG, 0x5a);
2690 1907
2691 if (i_params->dmd2_srch_algo == STV0900_COLD_START) 1908 if (intp->tuner_type[demod] == 3)
2692 i_params->tuner2_bw = (15 * (stv0900_carrier_width(i_params->dmd2_symbol_rate, 1909 stv0900_set_tuner_auto(intp, intp->freq[demod],
2693 i_params->rolloff) + 10000000)) / 10; 1910 intp->bw[demod], demod);
2694 else if (i_params->dmd2_srch_algo == STV0900_WARM_START) 1911 else
2695 i_params->tuner2_bw = stv0900_carrier_width(i_params->dmd2_symbol_rate, 1912 stv0900_set_tuner(fe, intp->freq[demod], intp->bw[demod]);
2696 i_params->rolloff) + 10000000;
2697 } else {
2698 stv0900_write_reg(i_params, R0900_P2_KREFTMG, 0xc1);
2699 i_params->tuner2_bw = (15 * (stv0900_carrier_width(i_params->dmd2_symbol_rate,
2700 i_params->rolloff) + 10000000)) / 10;
2701 }
2702 1913
2703 stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01); 1914 agc1_power = MAKEWORD(stv0900_get_bits(intp, AGCIQ_VALUE1),
1915 stv0900_get_bits(intp, AGCIQ_VALUE0));
2704 1916
2705 stv0900_set_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod); 1917 aq_power = 0;
2706 stv0900_set_max_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod);
2707 stv0900_set_min_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod);
2708 if (i_params->dmd2_symbol_rate >= 10000000)
2709 low_sr = FALSE;
2710 else
2711 low_sr = TRUE;
2712 1918
2713 } 1919 if (agc1_power == 0) {
1920 for (i = 0; i < 5; i++)
1921 aq_power += (stv0900_get_bits(intp, POWER_I) +
1922 stv0900_get_bits(intp, POWER_Q)) / 2;
2714 1923
2715 stv0900_set_tuner(fe, i_params->tuner2_freq, i_params->tuner2_bw); 1924 aq_power /= 5;
1925 }
2716 1926
2717 stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, i_params->dmd2_srch_iq_inv); 1927 if ((agc1_power == 0) && (aq_power < IQPOWER_THRESHOLD)) {
2718 stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1); 1928 intp->result[demod].locked = FALSE;
1929 signal_type = STV0900_NOAGC1;
1930 dprintk("%s: NO AGC1, POWERI, POWERQ\n", __func__);
1931 } else {
1932 stv0900_write_bits(intp, SPECINV_CONTROL,
1933 intp->srch_iq_inv[demod]);
1934 if (intp->chip_id <= 0x20) /*cut 2.0*/
1935 stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
1936 else /*cut 3.0*/
1937 stv0900_write_bits(intp, MANUALS2_ROLLOFF, 1);
2719 1938
2720 stv0900_set_search_standard(i_params, demod); 1939 stv0900_set_search_standard(intp, demod);
2721 1940
2722 if (i_params->dmd2_srch_algo != STV0900_BLIND_SEARCH) 1941 if (intp->srch_algo[demod] != STV0900_BLIND_SEARCH)
2723 stv0900_start_search(i_params, demod); 1942 stv0900_start_search(intp, demod);
2724 break;
2725 } 1943 }
2726 1944
2727 if (i_params->chip_id == 0x12) { 1945 if (signal_type == STV0900_NOAGC1)
2728 stv0900_write_bits(i_params, stream_merger_field, 0); 1946 return signal_type;
1947
1948 if (intp->chip_id == 0x12) {
1949 stv0900_write_bits(intp, RST_HWARE, 0);
2729 msleep(3); 1950 msleep(3);
2730 stv0900_write_bits(i_params, stream_merger_field, 1); 1951 stv0900_write_bits(intp, RST_HWARE, 1);
2731 stv0900_write_bits(i_params, stream_merger_field, 0); 1952 stv0900_write_bits(intp, RST_HWARE, 0);
2732 } 1953 }
2733 1954
2734 if (algo == STV0900_BLIND_SEARCH) 1955 if (algo == STV0900_BLIND_SEARCH)
@@ -2736,12 +1957,12 @@ enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
2736 else if (algo == STV0900_COLD_START) 1957 else if (algo == STV0900_COLD_START)
2737 lock = stv0900_get_demod_cold_lock(fe, demod_timeout); 1958 lock = stv0900_get_demod_cold_lock(fe, demod_timeout);
2738 else if (algo == STV0900_WARM_START) 1959 else if (algo == STV0900_WARM_START)
2739 lock = stv0900_get_demod_lock(i_params, demod, demod_timeout); 1960 lock = stv0900_get_demod_lock(intp, demod, demod_timeout);
2740 1961
2741 if ((lock == FALSE) && (algo == STV0900_COLD_START)) { 1962 if ((lock == FALSE) && (algo == STV0900_COLD_START)) {
2742 if (low_sr == FALSE) { 1963 if (low_sr == FALSE) {
2743 if (stv0900_check_timing_lock(i_params, demod) == TRUE) 1964 if (stv0900_check_timing_lock(intp, demod) == TRUE)
2744 lock = stv0900_sw_algo(i_params, demod); 1965 lock = stv0900_sw_algo(intp, demod);
2745 } 1966 }
2746 } 1967 }
2747 1968
@@ -2750,98 +1971,64 @@ enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
2750 1971
2751 if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) { 1972 if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) {
2752 stv0900_track_optimization(fe); 1973 stv0900_track_optimization(fe);
2753 if (i_params->chip_id <= 0x11) { 1974 if (intp->chip_id <= 0x11) {
2754 if ((stv0900_get_standard(fe, STV0900_DEMOD_1) == STV0900_DVBS1_STANDARD) && (stv0900_get_standard(fe, STV0900_DEMOD_2) == STV0900_DVBS1_STANDARD)) { 1975 if ((stv0900_get_standard(fe, 0) ==
1976 STV0900_DVBS1_STANDARD) &&
1977 (stv0900_get_standard(fe, 1) ==
1978 STV0900_DVBS1_STANDARD)) {
2755 msleep(20); 1979 msleep(20);
2756 stv0900_write_bits(i_params, stream_merger_field, 0); 1980 stv0900_write_bits(intp, RST_HWARE, 0);
2757 } else { 1981 } else {
2758 stv0900_write_bits(i_params, stream_merger_field, 0); 1982 stv0900_write_bits(intp, RST_HWARE, 0);
2759 msleep(3); 1983 msleep(3);
2760 stv0900_write_bits(i_params, stream_merger_field, 1); 1984 stv0900_write_bits(intp, RST_HWARE, 1);
2761 stv0900_write_bits(i_params, stream_merger_field, 0); 1985 stv0900_write_bits(intp, RST_HWARE, 0);
2762 } 1986 }
2763 } else if (i_params->chip_id == 0x20) { 1987
2764 stv0900_write_bits(i_params, stream_merger_field, 0); 1988 } else if (intp->chip_id >= 0x20) {
1989 stv0900_write_bits(intp, RST_HWARE, 0);
2765 msleep(3); 1990 msleep(3);
2766 stv0900_write_bits(i_params, stream_merger_field, 1); 1991 stv0900_write_bits(intp, RST_HWARE, 1);
2767 stv0900_write_bits(i_params, stream_merger_field, 0); 1992 stv0900_write_bits(intp, RST_HWARE, 0);
2768 } 1993 }
2769 1994
2770 if (stv0900_wait_for_lock(i_params, demod, fec_timeout, fec_timeout) == TRUE) { 1995 if (stv0900_wait_for_lock(intp, demod,
1996 fec_timeout, fec_timeout) == TRUE) {
2771 lock = TRUE; 1997 lock = TRUE;
2772 switch (demod) { 1998 intp->result[demod].locked = TRUE;
2773 case STV0900_DEMOD_1: 1999 if (intp->result[demod].standard ==
2774 default: 2000 STV0900_DVBS2_STANDARD) {
2775 i_params->dmd1_rslts.locked = TRUE; 2001 stv0900_set_dvbs2_rolloff(intp, demod);
2776 if (i_params->dmd1_rslts.standard == STV0900_DVBS2_STANDARD) { 2002 stv0900_write_bits(intp, RESET_UPKO_COUNT, 1);
2777 stv0900_set_dvbs2_rolloff(i_params, demod); 2003 stv0900_write_bits(intp, RESET_UPKO_COUNT, 0);
2778 stv0900_write_reg(i_params, R0900_P1_PDELCTRL2, 0x40); 2004 stv0900_write_reg(intp, ERRCTRL1, 0x67);
2779 stv0900_write_reg(i_params, R0900_P1_PDELCTRL2, 0); 2005 } else {
2780 stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x67); 2006 stv0900_write_reg(intp, ERRCTRL1, 0x75);
2781 } else {
2782 stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75);
2783 }
2784
2785 stv0900_write_reg(i_params, R0900_P1_FBERCPT4, 0);
2786 stv0900_write_reg(i_params, R0900_P1_ERRCTRL2, 0xc1);
2787 break;
2788 case STV0900_DEMOD_2:
2789 i_params->dmd2_rslts.locked = TRUE;
2790
2791 if (i_params->dmd2_rslts.standard == STV0900_DVBS2_STANDARD) {
2792 stv0900_set_dvbs2_rolloff(i_params, demod);
2793 stv0900_write_reg(i_params, R0900_P2_PDELCTRL2, 0x60);
2794 stv0900_write_reg(i_params, R0900_P2_PDELCTRL2, 0x20);
2795 stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x67);
2796 } else {
2797 stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75);
2798 }
2799
2800 stv0900_write_reg(i_params, R0900_P2_FBERCPT4, 0);
2801
2802 stv0900_write_reg(i_params, R0900_P2_ERRCTRL2, 0xc1);
2803 break;
2804 } 2007 }
2008
2009 stv0900_write_reg(intp, FBERCPT4, 0);
2010 stv0900_write_reg(intp, ERRCTRL2, 0xc1);
2805 } else { 2011 } else {
2806 lock = FALSE; 2012 lock = FALSE;
2807 signal_type = STV0900_NODATA; 2013 signal_type = STV0900_NODATA;
2808 no_signal = stv0900_check_signal_presence(i_params, demod); 2014 no_signal = stv0900_check_signal_presence(intp, demod);
2809 2015
2810 switch (demod) { 2016 intp->result[demod].locked = FALSE;
2811 case STV0900_DEMOD_1:
2812 default:
2813 i_params->dmd1_rslts.locked = FALSE;
2814 break;
2815 case STV0900_DEMOD_2:
2816 i_params->dmd2_rslts.locked = FALSE;
2817 break;
2818 }
2819 } 2017 }
2820 } 2018 }
2821 2019
2822 if ((signal_type == STV0900_NODATA) && (no_signal == FALSE)) { 2020 if ((signal_type != STV0900_NODATA) || (no_signal != FALSE))
2823 switch (demod) { 2021 return signal_type;
2824 case STV0900_DEMOD_1:
2825 default:
2826 if (i_params->chip_id <= 0x11) {
2827 if ((stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS_FOUND) &&
2828 (i_params->dmd1_srch_iq_inv <= STV0900_IQ_AUTO_NORMAL_FIRST))
2829 signal_type = stv0900_dvbs1_acq_workaround(fe);
2830 } else
2831 i_params->dmd1_rslts.locked = FALSE;
2832 2022
2833 break; 2023 if (intp->chip_id > 0x11) {
2834 case STV0900_DEMOD_2: 2024 intp->result[demod].locked = FALSE;
2835 if (i_params->chip_id <= 0x11) { 2025 return signal_type;
2836 if ((stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS_FOUND) &&
2837 (i_params->dmd2_srch_iq_inv <= STV0900_IQ_AUTO_NORMAL_FIRST))
2838 signal_type = stv0900_dvbs1_acq_workaround(fe);
2839 } else
2840 i_params->dmd2_rslts.locked = FALSE;
2841 break;
2842 }
2843 } 2026 }
2844 2027
2028 if ((stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) &&
2029 (intp->srch_iq_inv[demod] <= STV0900_IQ_AUTO_NORMAL_FIRST))
2030 signal_type = stv0900_dvbs1_acq_workaround(fe);
2031
2845 return signal_type; 2032 return signal_type;
2846} 2033}
2847 2034
diff --git a/drivers/media/dvb/frontends/stv090x.c b/drivers/media/dvb/frontends/stv090x.c
index 488bdfb34fb3..96972804f4ad 100644
--- a/drivers/media/dvb/frontends/stv090x.c
+++ b/drivers/media/dvb/frontends/stv090x.c
@@ -23,6 +23,7 @@
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/module.h> 24#include <linux/module.h>
25#include <linux/string.h> 25#include <linux/string.h>
26#include <linux/slab.h>
26#include <linux/mutex.h> 27#include <linux/mutex.h>
27 28
28#include <linux/dvb/frontend.h> 29#include <linux/dvb/frontend.h>
@@ -37,7 +38,82 @@
37static unsigned int verbose; 38static unsigned int verbose;
38module_param(verbose, int, 0644); 39module_param(verbose, int, 0644);
39 40
40struct mutex demod_lock; 41/* internal params node */
42struct stv090x_dev {
43 /* pointer for internal params, one for each pair of demods */
44 struct stv090x_internal *internal;
45 struct stv090x_dev *next_dev;
46};
47
48/* first internal params */
49static struct stv090x_dev *stv090x_first_dev;
50
51/* find chip by i2c adapter and i2c address */
52static struct stv090x_dev *find_dev(struct i2c_adapter *i2c_adap,
53 u8 i2c_addr)
54{
55 struct stv090x_dev *temp_dev = stv090x_first_dev;
56
57 /*
58 Search of the last stv0900 chip or
59 find it by i2c adapter and i2c address */
60 while ((temp_dev != NULL) &&
61 ((temp_dev->internal->i2c_adap != i2c_adap) ||
62 (temp_dev->internal->i2c_addr != i2c_addr))) {
63
64 temp_dev = temp_dev->next_dev;
65 }
66
67 return temp_dev;
68}
69
70/* deallocating chip */
71static void remove_dev(struct stv090x_internal *internal)
72{
73 struct stv090x_dev *prev_dev = stv090x_first_dev;
74 struct stv090x_dev *del_dev = find_dev(internal->i2c_adap,
75 internal->i2c_addr);
76
77 if (del_dev != NULL) {
78 if (del_dev == stv090x_first_dev) {
79 stv090x_first_dev = del_dev->next_dev;
80 } else {
81 while (prev_dev->next_dev != del_dev)
82 prev_dev = prev_dev->next_dev;
83
84 prev_dev->next_dev = del_dev->next_dev;
85 }
86
87 kfree(del_dev);
88 }
89}
90
91/* allocating new chip */
92static struct stv090x_dev *append_internal(struct stv090x_internal *internal)
93{
94 struct stv090x_dev *new_dev;
95 struct stv090x_dev *temp_dev;
96
97 new_dev = kmalloc(sizeof(struct stv090x_dev), GFP_KERNEL);
98 if (new_dev != NULL) {
99 new_dev->internal = internal;
100 new_dev->next_dev = NULL;
101
102 /* append to list */
103 if (stv090x_first_dev == NULL) {
104 stv090x_first_dev = new_dev;
105 } else {
106 temp_dev = stv090x_first_dev;
107 while (temp_dev->next_dev != NULL)
108 temp_dev = temp_dev->next_dev;
109
110 temp_dev->next_dev = new_dev;
111 }
112 }
113
114 return new_dev;
115}
116
41 117
42/* DVBS1 and DSS C/N Lookup table */ 118/* DVBS1 and DSS C/N Lookup table */
43static const struct stv090x_tab stv090x_s1cn_tab[] = { 119static const struct stv090x_tab stv090x_s1cn_tab[] = {
@@ -683,6 +759,9 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
683 struct stv090x_state *state = fe->demodulator_priv; 759 struct stv090x_state *state = fe->demodulator_priv;
684 u32 reg; 760 u32 reg;
685 761
762 if (enable)
763 mutex_lock(&state->internal->tuner_lock);
764
686 reg = STV090x_READ_DEMOD(state, I2CRPT); 765 reg = STV090x_READ_DEMOD(state, I2CRPT);
687 if (enable) { 766 if (enable) {
688 dprintk(FE_DEBUG, 1, "Enable Gate"); 767 dprintk(FE_DEBUG, 1, "Enable Gate");
@@ -696,9 +775,14 @@ static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
696 if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0) 775 if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0)
697 goto err; 776 goto err;
698 } 777 }
778
779 if (!enable)
780 mutex_unlock(&state->internal->tuner_lock);
781
699 return 0; 782 return 0;
700err: 783err:
701 dprintk(FE_ERROR, 1, "I/O error"); 784 dprintk(FE_ERROR, 1, "I/O error");
785 mutex_unlock(&state->internal->tuner_lock);
702 return -1; 786 return -1;
703} 787}
704 788
@@ -755,13 +839,13 @@ static int stv090x_set_srate(struct stv090x_state *state, u32 srate)
755 839
756 if (srate > 60000000) { 840 if (srate > 60000000) {
757 sym = (srate << 4); /* SR * 2^16 / master_clk */ 841 sym = (srate << 4); /* SR * 2^16 / master_clk */
758 sym /= (state->mclk >> 12); 842 sym /= (state->internal->mclk >> 12);
759 } else if (srate > 6000000) { 843 } else if (srate > 6000000) {
760 sym = (srate << 6); 844 sym = (srate << 6);
761 sym /= (state->mclk >> 10); 845 sym /= (state->internal->mclk >> 10);
762 } else { 846 } else {
763 sym = (srate << 9); 847 sym = (srate << 9);
764 sym /= (state->mclk >> 7); 848 sym /= (state->internal->mclk >> 7);
765 } 849 }
766 850
767 if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0x7f) < 0) /* MSB */ 851 if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0x7f) < 0) /* MSB */
@@ -782,13 +866,13 @@ static int stv090x_set_max_srate(struct stv090x_state *state, u32 clk, u32 srate
782 srate = 105 * (srate / 100); 866 srate = 105 * (srate / 100);
783 if (srate > 60000000) { 867 if (srate > 60000000) {
784 sym = (srate << 4); /* SR * 2^16 / master_clk */ 868 sym = (srate << 4); /* SR * 2^16 / master_clk */
785 sym /= (state->mclk >> 12); 869 sym /= (state->internal->mclk >> 12);
786 } else if (srate > 6000000) { 870 } else if (srate > 6000000) {
787 sym = (srate << 6); 871 sym = (srate << 6);
788 sym /= (state->mclk >> 10); 872 sym /= (state->internal->mclk >> 10);
789 } else { 873 } else {
790 sym = (srate << 9); 874 sym = (srate << 9);
791 sym /= (state->mclk >> 7); 875 sym /= (state->internal->mclk >> 7);
792 } 876 }
793 877
794 if (sym < 0x7fff) { 878 if (sym < 0x7fff) {
@@ -816,16 +900,16 @@ static int stv090x_set_min_srate(struct stv090x_state *state, u32 clk, u32 srate
816 srate = 95 * (srate / 100); 900 srate = 95 * (srate / 100);
817 if (srate > 60000000) { 901 if (srate > 60000000) {
818 sym = (srate << 4); /* SR * 2^16 / master_clk */ 902 sym = (srate << 4); /* SR * 2^16 / master_clk */
819 sym /= (state->mclk >> 12); 903 sym /= (state->internal->mclk >> 12);
820 } else if (srate > 6000000) { 904 } else if (srate > 6000000) {
821 sym = (srate << 6); 905 sym = (srate << 6);
822 sym /= (state->mclk >> 10); 906 sym /= (state->internal->mclk >> 10);
823 } else { 907 } else {
824 sym = (srate << 9); 908 sym = (srate << 9);
825 sym /= (state->mclk >> 7); 909 sym /= (state->internal->mclk >> 7);
826 } 910 }
827 911
828 if (STV090x_WRITE_DEMOD(state, SFRLOW1, ((sym >> 8) & 0xff)) < 0) /* MSB */ 912 if (STV090x_WRITE_DEMOD(state, SFRLOW1, ((sym >> 8) & 0x7f)) < 0) /* MSB */
829 goto err; 913 goto err;
830 if (STV090x_WRITE_DEMOD(state, SFRLOW0, (sym & 0xff)) < 0) /* LSB */ 914 if (STV090x_WRITE_DEMOD(state, SFRLOW0, (sym & 0xff)) < 0) /* LSB */
831 goto err; 915 goto err;
@@ -1103,21 +1187,21 @@ static int stv090x_vitclk_ctl(struct stv090x_state *state, int enable)
1103 1187
1104 switch (state->demod) { 1188 switch (state->demod) {
1105 case STV090x_DEMODULATOR_0: 1189 case STV090x_DEMODULATOR_0:
1106 mutex_lock(&demod_lock); 1190 mutex_lock(&state->internal->demod_lock);
1107 reg = stv090x_read_reg(state, STV090x_STOPCLK2); 1191 reg = stv090x_read_reg(state, STV090x_STOPCLK2);
1108 STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, enable); 1192 STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, enable);
1109 if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) 1193 if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0)
1110 goto err; 1194 goto err;
1111 mutex_unlock(&demod_lock); 1195 mutex_unlock(&state->internal->demod_lock);
1112 break; 1196 break;
1113 1197
1114 case STV090x_DEMODULATOR_1: 1198 case STV090x_DEMODULATOR_1:
1115 mutex_lock(&demod_lock); 1199 mutex_lock(&state->internal->demod_lock);
1116 reg = stv090x_read_reg(state, STV090x_STOPCLK2); 1200 reg = stv090x_read_reg(state, STV090x_STOPCLK2);
1117 STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, enable); 1201 STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, enable);
1118 if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) 1202 if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0)
1119 goto err; 1203 goto err;
1120 mutex_unlock(&demod_lock); 1204 mutex_unlock(&state->internal->demod_lock);
1121 break; 1205 break;
1122 1206
1123 default: 1207 default:
@@ -1126,14 +1210,14 @@ static int stv090x_vitclk_ctl(struct stv090x_state *state, int enable)
1126 } 1210 }
1127 return 0; 1211 return 0;
1128err: 1212err:
1129 mutex_unlock(&demod_lock); 1213 mutex_unlock(&state->internal->demod_lock);
1130 dprintk(FE_ERROR, 1, "I/O error"); 1214 dprintk(FE_ERROR, 1, "I/O error");
1131 return -1; 1215 return -1;
1132} 1216}
1133 1217
1134static int stv090x_dvbs_track_crl(struct stv090x_state *state) 1218static int stv090x_dvbs_track_crl(struct stv090x_state *state)
1135{ 1219{
1136 if (state->dev_ver >= 0x30) { 1220 if (state->internal->dev_ver >= 0x30) {
1137 /* Set ACLC BCLC optimised value vs SR */ 1221 /* Set ACLC BCLC optimised value vs SR */
1138 if (state->srate >= 15000000) { 1222 if (state->srate >= 15000000) {
1139 if (STV090x_WRITE_DEMOD(state, ACLC, 0x2b) < 0) 1223 if (STV090x_WRITE_DEMOD(state, ACLC, 0x2b) < 0)
@@ -1215,7 +1299,7 @@ static int stv090x_delivery_search(struct stv090x_state *state)
1215 if (STV090x_WRITE_DEMOD(state, BCLC, 0x09) < 0) 1299 if (STV090x_WRITE_DEMOD(state, BCLC, 0x09) < 0)
1216 goto err; 1300 goto err;
1217 1301
1218 if (state->dev_ver <= 0x20) { 1302 if (state->internal->dev_ver <= 0x20) {
1219 /* enable S2 carrier loop */ 1303 /* enable S2 carrier loop */
1220 if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) 1304 if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0)
1221 goto err; 1305 goto err;
@@ -1238,12 +1322,18 @@ static int stv090x_delivery_search(struct stv090x_state *state)
1238 goto err; 1322 goto err;
1239 } 1323 }
1240 1324
1325 if (stv090x_set_vit_thtracq(state) < 0)
1326 goto err;
1241 break; 1327 break;
1242 1328
1243 case STV090x_SEARCH_AUTO: 1329 case STV090x_SEARCH_AUTO:
1244 default: 1330 default:
1245 /* enable DVB-S2 and DVB-S2 in Auto MODE */ 1331 /* enable DVB-S2 and DVB-S2 in Auto MODE */
1246 reg = STV090x_READ_DEMOD(state, DMDCFGMD); 1332 reg = STV090x_READ_DEMOD(state, DMDCFGMD);
1333 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 0);
1334 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0);
1335 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
1336 goto err;
1247 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); 1337 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1);
1248 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1); 1338 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1);
1249 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) 1339 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
@@ -1255,7 +1345,7 @@ static int stv090x_delivery_search(struct stv090x_state *state)
1255 if (stv090x_dvbs_track_crl(state) < 0) 1345 if (stv090x_dvbs_track_crl(state) < 0)
1256 goto err; 1346 goto err;
1257 1347
1258 if (state->dev_ver <= 0x20) { 1348 if (state->internal->dev_ver <= 0x20) {
1259 /* enable S2 carrier loop */ 1349 /* enable S2 carrier loop */
1260 if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0) 1350 if (STV090x_WRITE_DEMOD(state, CAR2CFG, 0x26) < 0)
1261 goto err; 1351 goto err;
@@ -1278,17 +1368,8 @@ static int stv090x_delivery_search(struct stv090x_state *state)
1278 goto err; 1368 goto err;
1279 } 1369 }
1280 1370
1281 if (state->srate >= 2000000) { 1371 if (stv090x_set_vit_thacq(state) < 0)
1282 /* Srate >= 2MSPS, Viterbi threshold to acquire */ 1372 goto err;
1283 if (stv090x_set_vit_thacq(state) < 0)
1284 goto err;
1285 } else {
1286 /* Srate < 2MSPS, Reset Viterbi thresholdto track
1287 * and then re-acquire
1288 */
1289 if (stv090x_set_vit_thtracq(state) < 0)
1290 goto err;
1291 }
1292 1373
1293 if (stv090x_set_viterbi(state) < 0) 1374 if (stv090x_set_viterbi(state) < 0)
1294 goto err; 1375 goto err;
@@ -1311,13 +1392,13 @@ static int stv090x_start_search(struct stv090x_state *state)
1311 if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) 1392 if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0)
1312 goto err; 1393 goto err;
1313 1394
1314 if (state->dev_ver <= 0x20) { 1395 if (state->internal->dev_ver <= 0x20) {
1315 if (state->srate <= 5000000) { 1396 if (state->srate <= 5000000) {
1316 if (STV090x_WRITE_DEMOD(state, CARCFG, 0x44) < 0) 1397 if (STV090x_WRITE_DEMOD(state, CARCFG, 0x44) < 0)
1317 goto err; 1398 goto err;
1318 if (STV090x_WRITE_DEMOD(state, CFRUP1, 0x0f) < 0) 1399 if (STV090x_WRITE_DEMOD(state, CFRUP1, 0x0f) < 0)
1319 goto err; 1400 goto err;
1320 if (STV090x_WRITE_DEMOD(state, CFRUP1, 0xff) < 0) 1401 if (STV090x_WRITE_DEMOD(state, CFRUP0, 0xff) < 0)
1321 goto err; 1402 goto err;
1322 if (STV090x_WRITE_DEMOD(state, CFRLOW1, 0xf0) < 0) 1403 if (STV090x_WRITE_DEMOD(state, CFRLOW1, 0xf0) < 0)
1323 goto err; 1404 goto err;
@@ -1355,7 +1436,7 @@ static int stv090x_start_search(struct stv090x_state *state)
1355 * CFR max = +1MHz 1436 * CFR max = +1MHz
1356 */ 1437 */
1357 freq_abs = 1000 << 16; 1438 freq_abs = 1000 << 16;
1358 freq_abs /= (state->mclk / 1000); 1439 freq_abs /= (state->internal->mclk / 1000);
1359 freq = (s16) freq_abs; 1440 freq = (s16) freq_abs;
1360 } else { 1441 } else {
1361 /* COLD Start 1442 /* COLD Start
@@ -1365,13 +1446,13 @@ static int stv090x_start_search(struct stv090x_state *state)
1365 */ 1446 */
1366 freq_abs = (state->search_range / 2000) + 600; 1447 freq_abs = (state->search_range / 2000) + 600;
1367 freq_abs = freq_abs << 16; 1448 freq_abs = freq_abs << 16;
1368 freq_abs /= (state->mclk / 1000); 1449 freq_abs /= (state->internal->mclk / 1000);
1369 freq = (s16) freq_abs; 1450 freq = (s16) freq_abs;
1370 } 1451 }
1371 1452
1372 if (STV090x_WRITE_DEMOD(state, CFRUP1, MSB(freq)) < 0) 1453 if (STV090x_WRITE_DEMOD(state, CFRUP1, MSB(freq)) < 0)
1373 goto err; 1454 goto err;
1374 if (STV090x_WRITE_DEMOD(state, CFRUP1, LSB(freq)) < 0) 1455 if (STV090x_WRITE_DEMOD(state, CFRUP0, LSB(freq)) < 0)
1375 goto err; 1456 goto err;
1376 1457
1377 freq *= -1; 1458 freq *= -1;
@@ -1388,7 +1469,7 @@ static int stv090x_start_search(struct stv090x_state *state)
1388 if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0) < 0) 1469 if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0) < 0)
1389 goto err; 1470 goto err;
1390 1471
1391 if (state->dev_ver >= 0x20) { 1472 if (state->internal->dev_ver >= 0x20) {
1392 if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) 1473 if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0)
1393 goto err; 1474 goto err;
1394 if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) 1475 if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0)
@@ -1422,28 +1503,33 @@ static int stv090x_start_search(struct stv090x_state *state)
1422 if (STV090x_WRITE_DEMOD(state, DMDCFG2, reg) < 0) 1503 if (STV090x_WRITE_DEMOD(state, DMDCFG2, reg) < 0)
1423 goto err; 1504 goto err;
1424 1505
1425 if (state->dev_ver >= 0x20) { 1506 if (STV090x_WRITE_DEMOD(state, RTC, 0x88) < 0)
1507 goto err;
1508
1509 if (state->internal->dev_ver >= 0x20) {
1426 /*Frequency offset detector setting*/ 1510 /*Frequency offset detector setting*/
1427 if (state->srate < 2000000) { 1511 if (state->srate < 2000000) {
1428 if (state->dev_ver <= 0x20) { 1512 if (state->internal->dev_ver <= 0x20) {
1429 /* Cut 2 */ 1513 /* Cut 2 */
1430 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x39) < 0) 1514 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x39) < 0)
1431 goto err; 1515 goto err;
1432 } else { 1516 } else {
1433 /* Cut 2 */ 1517 /* Cut 3 */
1434 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x89) < 0) 1518 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x89) < 0)
1435 goto err; 1519 goto err;
1436 } 1520 }
1437 if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0) 1521 if (STV090x_WRITE_DEMOD(state, CARHDR, 0x40) < 0)
1438 goto err; 1522 goto err;
1439 } 1523 } else if (state->srate < 10000000) {
1440
1441 if (state->srate < 10000000) {
1442 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0) 1524 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4c) < 0)
1443 goto err; 1525 goto err;
1526 if (STV090x_WRITE_DEMOD(state, CARHDR, 0x20) < 0)
1527 goto err;
1444 } else { 1528 } else {
1445 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4b) < 0) 1529 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x4b) < 0)
1446 goto err; 1530 goto err;
1531 if (STV090x_WRITE_DEMOD(state, CARHDR, 0x20) < 0)
1532 goto err;
1447 } 1533 }
1448 } else { 1534 } else {
1449 if (state->srate < 10000000) { 1535 if (state->srate < 10000000) {
@@ -1485,14 +1571,14 @@ err:
1485 1571
1486static int stv090x_get_agc2_min_level(struct stv090x_state *state) 1572static int stv090x_get_agc2_min_level(struct stv090x_state *state)
1487{ 1573{
1488 u32 agc2_min = 0, agc2 = 0, freq_init, freq_step, reg; 1574 u32 agc2_min = 0xffff, agc2 = 0, freq_init, freq_step, reg;
1489 s32 i, j, steps, dir; 1575 s32 i, j, steps, dir;
1490 1576
1491 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) 1577 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0)
1492 goto err; 1578 goto err;
1493 reg = STV090x_READ_DEMOD(state, DMDCFGMD); 1579 reg = STV090x_READ_DEMOD(state, DMDCFGMD);
1494 STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); 1580 STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 0);
1495 STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 1); 1581 STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0);
1496 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) 1582 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
1497 goto err; 1583 goto err;
1498 1584
@@ -1509,14 +1595,12 @@ static int stv090x_get_agc2_min_level(struct stv090x_state *state)
1509 if (stv090x_set_srate(state, 1000000) < 0) 1595 if (stv090x_set_srate(state, 1000000) < 0)
1510 goto err; 1596 goto err;
1511 1597
1512 steps = -1 + state->search_range / 1000000; 1598 steps = state->search_range / 1000000;
1513 steps /= 2; 1599 if (steps <= 0)
1514 steps = (2 * steps) + 1;
1515 if (steps < 0)
1516 steps = 1; 1600 steps = 1;
1517 1601
1518 dir = 1; 1602 dir = 1;
1519 freq_step = (1000000 * 256) / (state->mclk / 256); 1603 freq_step = (1000000 * 256) / (state->internal->mclk / 256);
1520 freq_init = 0; 1604 freq_init = 0;
1521 1605
1522 for (i = 0; i < steps; i++) { 1606 for (i = 0; i < steps; i++) {
@@ -1525,7 +1609,7 @@ static int stv090x_get_agc2_min_level(struct stv090x_state *state)
1525 else 1609 else
1526 freq_init = freq_init - (freq_step * i); 1610 freq_init = freq_init - (freq_step * i);
1527 1611
1528 dir = -1; 1612 dir *= -1;
1529 1613
1530 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod RESET */ 1614 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod RESET */
1531 goto err; 1615 goto err;
@@ -1536,13 +1620,14 @@ static int stv090x_get_agc2_min_level(struct stv090x_state *state)
1536 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x58) < 0) /* Demod RESET */ 1620 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x58) < 0) /* Demod RESET */
1537 goto err; 1621 goto err;
1538 msleep(10); 1622 msleep(10);
1623
1624 agc2 = 0;
1539 for (j = 0; j < 10; j++) { 1625 for (j = 0; j < 10; j++) {
1540 agc2 += STV090x_READ_DEMOD(state, AGC2I1) << 8; 1626 agc2 += (STV090x_READ_DEMOD(state, AGC2I1) << 8) |
1541 agc2 |= STV090x_READ_DEMOD(state, AGC2I0); 1627 STV090x_READ_DEMOD(state, AGC2I0);
1542 } 1628 }
1543 agc2 /= 10; 1629 agc2 /= 10;
1544 agc2_min = 0xffff; 1630 if (agc2 < agc2_min)
1545 if (agc2 < 0xffff)
1546 agc2_min = agc2; 1631 agc2_min = agc2;
1547 } 1632 }
1548 1633
@@ -1584,6 +1669,12 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1584 int tmg_lock = 0, i; 1669 int tmg_lock = 0, i;
1585 s32 tmg_cpt = 0, dir = 1, steps, cur_step = 0, freq; 1670 s32 tmg_cpt = 0, dir = 1, steps, cur_step = 0, freq;
1586 u32 srate_coarse = 0, agc2 = 0, car_step = 1200, reg; 1671 u32 srate_coarse = 0, agc2 = 0, car_step = 1200, reg;
1672 u32 agc2th;
1673
1674 if (state->internal->dev_ver >= 0x30)
1675 agc2th = 0x2e00;
1676 else
1677 agc2th = 0x1f00;
1587 1678
1588 reg = STV090x_READ_DEMOD(state, DMDISTATE); 1679 reg = STV090x_READ_DEMOD(state, DMDISTATE);
1589 STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x1f); /* Demod RESET */ 1680 STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x1f); /* Demod RESET */
@@ -1591,13 +1682,15 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1591 goto err; 1682 goto err;
1592 if (STV090x_WRITE_DEMOD(state, TMGCFG, 0x12) < 0) 1683 if (STV090x_WRITE_DEMOD(state, TMGCFG, 0x12) < 0)
1593 goto err; 1684 goto err;
1685 if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc0) < 0)
1686 goto err;
1594 if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0xf0) < 0) 1687 if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0xf0) < 0)
1595 goto err; 1688 goto err;
1596 if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0xe0) < 0) 1689 if (STV090x_WRITE_DEMOD(state, TMGTHFALL, 0xe0) < 0)
1597 goto err; 1690 goto err;
1598 reg = STV090x_READ_DEMOD(state, DMDCFGMD); 1691 reg = STV090x_READ_DEMOD(state, DMDCFGMD);
1599 STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1); 1692 STV090x_SETFIELD_Px(reg, SCAN_ENABLE_FIELD, 1);
1600 STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 1); 1693 STV090x_SETFIELD_Px(reg, CFR_AUTOSCAN_FIELD, 0);
1601 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) 1694 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
1602 goto err; 1695 goto err;
1603 1696
@@ -1611,16 +1704,16 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1611 goto err; 1704 goto err;
1612 if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x00) < 0) 1705 if (STV090x_WRITE_DEMOD(state, DMDTOM, 0x00) < 0)
1613 goto err; 1706 goto err;
1614 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x60) < 0) 1707 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x50) < 0)
1615 goto err; 1708 goto err;
1616 1709
1617 if (state->dev_ver >= 0x30) { 1710 if (state->internal->dev_ver >= 0x30) {
1618 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x99) < 0) 1711 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x99) < 0)
1619 goto err; 1712 goto err;
1620 if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) 1713 if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x98) < 0)
1621 goto err; 1714 goto err;
1622 1715
1623 } else if (state->dev_ver >= 0x20) { 1716 } else if (state->internal->dev_ver >= 0x20) {
1624 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x6a) < 0) 1717 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x6a) < 0)
1625 goto err; 1718 goto err;
1626 if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0) 1719 if (STV090x_WRITE_DEMOD(state, SFRSTEP, 0x95) < 0)
@@ -1652,23 +1745,31 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1652 while ((!tmg_lock) && (cur_step < steps)) { 1745 while ((!tmg_lock) && (cur_step < steps)) {
1653 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5f) < 0) /* Demod RESET */ 1746 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5f) < 0) /* Demod RESET */
1654 goto err; 1747 goto err;
1655 reg = STV090x_READ_DEMOD(state, DMDISTATE); 1748 if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0)
1656 STV090x_SETFIELD_Px(reg, I2C_DEMOD_MODE_FIELD, 0x00); /* trigger acquisition */ 1749 goto err;
1657 if (STV090x_WRITE_DEMOD(state, DMDISTATE, reg) < 0) 1750 if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0)
1751 goto err;
1752 if (STV090x_WRITE_DEMOD(state, SFRINIT1, 0x00) < 0)
1753 goto err;
1754 if (STV090x_WRITE_DEMOD(state, SFRINIT0, 0x00) < 0)
1755 goto err;
1756 /* trigger acquisition */
1757 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x40) < 0)
1658 goto err; 1758 goto err;
1659 msleep(50); 1759 msleep(50);
1660 for (i = 0; i < 10; i++) { 1760 for (i = 0; i < 10; i++) {
1661 reg = STV090x_READ_DEMOD(state, DSTATUS); 1761 reg = STV090x_READ_DEMOD(state, DSTATUS);
1662 if (STV090x_GETFIELD_Px(reg, TMGLOCK_QUALITY_FIELD) >= 2) 1762 if (STV090x_GETFIELD_Px(reg, TMGLOCK_QUALITY_FIELD) >= 2)
1663 tmg_cpt++; 1763 tmg_cpt++;
1664 agc2 += STV090x_READ_DEMOD(state, AGC2I1) << 8; 1764 agc2 += (STV090x_READ_DEMOD(state, AGC2I1) << 8) |
1665 agc2 |= STV090x_READ_DEMOD(state, AGC2I0); 1765 STV090x_READ_DEMOD(state, AGC2I0);
1666 } 1766 }
1667 agc2 /= 10; 1767 agc2 /= 10;
1668 srate_coarse = stv090x_get_srate(state, state->mclk); 1768 srate_coarse = stv090x_get_srate(state, state->internal->mclk);
1669 cur_step++; 1769 cur_step++;
1670 dir *= -1; 1770 dir *= -1;
1671 if ((tmg_cpt >= 5) && (agc2 < 0x1f00) && (srate_coarse < 55000000) && (srate_coarse > 850000)) 1771 if ((tmg_cpt >= 5) && (agc2 < agc2th) &&
1772 (srate_coarse < 50000000) && (srate_coarse > 850000))
1672 tmg_lock = 1; 1773 tmg_lock = 1;
1673 else if (cur_step < steps) { 1774 else if (cur_step < steps) {
1674 if (dir > 0) 1775 if (dir > 0)
@@ -1681,13 +1782,13 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1681 goto err; 1782 goto err;
1682 1783
1683 if (state->config->tuner_set_frequency) { 1784 if (state->config->tuner_set_frequency) {
1684 if (state->config->tuner_set_frequency(fe, state->frequency) < 0) 1785 if (state->config->tuner_set_frequency(fe, freq) < 0)
1685 goto err; 1786 goto err_gateoff;
1686 } 1787 }
1687 1788
1688 if (state->config->tuner_set_bandwidth) { 1789 if (state->config->tuner_set_bandwidth) {
1689 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) 1790 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0)
1690 goto err; 1791 goto err_gateoff;
1691 } 1792 }
1692 1793
1693 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 1794 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
@@ -1700,7 +1801,7 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1700 1801
1701 if (state->config->tuner_get_status) { 1802 if (state->config->tuner_get_status) {
1702 if (state->config->tuner_get_status(fe, &reg) < 0) 1803 if (state->config->tuner_get_status(fe, &reg) < 0)
1703 goto err; 1804 goto err_gateoff;
1704 } 1805 }
1705 1806
1706 if (reg) 1807 if (reg)
@@ -1716,9 +1817,12 @@ static u32 stv090x_srate_srch_coarse(struct stv090x_state *state)
1716 if (!tmg_lock) 1817 if (!tmg_lock)
1717 srate_coarse = 0; 1818 srate_coarse = 0;
1718 else 1819 else
1719 srate_coarse = stv090x_get_srate(state, state->mclk); 1820 srate_coarse = stv090x_get_srate(state, state->internal->mclk);
1720 1821
1721 return srate_coarse; 1822 return srate_coarse;
1823
1824err_gateoff:
1825 stv090x_i2c_gate_ctrl(fe, 0);
1722err: 1826err:
1723 dprintk(FE_ERROR, 1, "I/O error"); 1827 dprintk(FE_ERROR, 1, "I/O error");
1724 return -1; 1828 return -1;
@@ -1728,7 +1832,7 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state)
1728{ 1832{
1729 u32 srate_coarse, freq_coarse, sym, reg; 1833 u32 srate_coarse, freq_coarse, sym, reg;
1730 1834
1731 srate_coarse = stv090x_get_srate(state, state->mclk); 1835 srate_coarse = stv090x_get_srate(state, state->internal->mclk);
1732 freq_coarse = STV090x_READ_DEMOD(state, CFR2) << 8; 1836 freq_coarse = STV090x_READ_DEMOD(state, CFR2) << 8;
1733 freq_coarse |= STV090x_READ_DEMOD(state, CFR1); 1837 freq_coarse |= STV090x_READ_DEMOD(state, CFR1);
1734 sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ 1838 sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */
@@ -1738,7 +1842,7 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state)
1738 else { 1842 else {
1739 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) /* Demod RESET */ 1843 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1f) < 0) /* Demod RESET */
1740 goto err; 1844 goto err;
1741 if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0x01) < 0) 1845 if (STV090x_WRITE_DEMOD(state, TMGCFG2, 0xc1) < 0)
1742 goto err; 1846 goto err;
1743 if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0x20) < 0) 1847 if (STV090x_WRITE_DEMOD(state, TMGTHRISE, 0x20) < 0)
1744 goto err; 1848 goto err;
@@ -1751,10 +1855,13 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state)
1751 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0) 1855 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
1752 goto err; 1856 goto err;
1753 1857
1754 if (state->dev_ver >= 0x30) { 1858 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0)
1859 goto err;
1860
1861 if (state->internal->dev_ver >= 0x30) {
1755 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x79) < 0) 1862 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x79) < 0)
1756 goto err; 1863 goto err;
1757 } else if (state->dev_ver >= 0x20) { 1864 } else if (state->internal->dev_ver >= 0x20) {
1758 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) 1865 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0)
1759 goto err; 1866 goto err;
1760 } 1867 }
@@ -1762,20 +1869,20 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state)
1762 if (srate_coarse > 3000000) { 1869 if (srate_coarse > 3000000) {
1763 sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ 1870 sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */
1764 sym = (sym / 1000) * 65536; 1871 sym = (sym / 1000) * 65536;
1765 sym /= (state->mclk / 1000); 1872 sym /= (state->internal->mclk / 1000);
1766 if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) 1873 if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0)
1767 goto err; 1874 goto err;
1768 if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) 1875 if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0)
1769 goto err; 1876 goto err;
1770 sym = 10 * (srate_coarse / 13); /* SFRLOW = SFR - 30% */ 1877 sym = 10 * (srate_coarse / 13); /* SFRLOW = SFR - 30% */
1771 sym = (sym / 1000) * 65536; 1878 sym = (sym / 1000) * 65536;
1772 sym /= (state->mclk / 1000); 1879 sym /= (state->internal->mclk / 1000);
1773 if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) 1880 if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0)
1774 goto err; 1881 goto err;
1775 if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) 1882 if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0)
1776 goto err; 1883 goto err;
1777 sym = (srate_coarse / 1000) * 65536; 1884 sym = (srate_coarse / 1000) * 65536;
1778 sym /= (state->mclk / 1000); 1885 sym /= (state->internal->mclk / 1000);
1779 if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) 1886 if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0)
1780 goto err; 1887 goto err;
1781 if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) 1888 if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0)
@@ -1783,20 +1890,20 @@ static u32 stv090x_srate_srch_fine(struct stv090x_state *state)
1783 } else { 1890 } else {
1784 sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */ 1891 sym = 13 * (srate_coarse / 10); /* SFRUP = SFR + 30% */
1785 sym = (sym / 100) * 65536; 1892 sym = (sym / 100) * 65536;
1786 sym /= (state->mclk / 100); 1893 sym /= (state->internal->mclk / 100);
1787 if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0) 1894 if (STV090x_WRITE_DEMOD(state, SFRUP1, (sym >> 8) & 0x7f) < 0)
1788 goto err; 1895 goto err;
1789 if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0) 1896 if (STV090x_WRITE_DEMOD(state, SFRUP0, sym & 0xff) < 0)
1790 goto err; 1897 goto err;
1791 sym = 10 * (srate_coarse / 14); /* SFRLOW = SFR - 30% */ 1898 sym = 10 * (srate_coarse / 14); /* SFRLOW = SFR - 30% */
1792 sym = (sym / 100) * 65536; 1899 sym = (sym / 100) * 65536;
1793 sym /= (state->mclk / 100); 1900 sym /= (state->internal->mclk / 100);
1794 if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0) 1901 if (STV090x_WRITE_DEMOD(state, SFRLOW1, (sym >> 8) & 0x7f) < 0)
1795 goto err; 1902 goto err;
1796 if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0) 1903 if (STV090x_WRITE_DEMOD(state, SFRLOW0, sym & 0xff) < 0)
1797 goto err; 1904 goto err;
1798 sym = (srate_coarse / 100) * 65536; 1905 sym = (srate_coarse / 100) * 65536;
1799 sym /= (state->mclk / 100); 1906 sym /= (state->internal->mclk / 100);
1800 if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0) 1907 if (STV090x_WRITE_DEMOD(state, SFRINIT1, (sym >> 8) & 0xff) < 0)
1801 goto err; 1908 goto err;
1802 if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0) 1909 if (STV090x_WRITE_DEMOD(state, SFRINIT0, sym & 0xff) < 0)
@@ -1856,20 +1963,21 @@ static int stv090x_get_dmdlock(struct stv090x_state *state, s32 timeout)
1856static int stv090x_blind_search(struct stv090x_state *state) 1963static int stv090x_blind_search(struct stv090x_state *state)
1857{ 1964{
1858 u32 agc2, reg, srate_coarse; 1965 u32 agc2, reg, srate_coarse;
1859 s32 timeout_dmd = 500, cpt_fail, agc2_ovflw, i; 1966 s32 cpt_fail, agc2_ovflw, i;
1860 u8 k_ref, k_max, k_min; 1967 u8 k_ref, k_max, k_min;
1861 int coarse_fail, lock; 1968 int coarse_fail = 0;
1969 int lock;
1862 1970
1863 k_max = 120; 1971 k_max = 110;
1864 k_min = 30; 1972 k_min = 10;
1865 1973
1866 agc2 = stv090x_get_agc2_min_level(state); 1974 agc2 = stv090x_get_agc2_min_level(state);
1867 1975
1868 if (agc2 > STV090x_SEARCH_AGC2_TH(state->dev_ver)) { 1976 if (agc2 > STV090x_SEARCH_AGC2_TH(state->internal->dev_ver)) {
1869 lock = 0; 1977 lock = 0;
1870 } else { 1978 } else {
1871 1979
1872 if (state->dev_ver <= 0x20) { 1980 if (state->internal->dev_ver <= 0x20) {
1873 if (STV090x_WRITE_DEMOD(state, CARCFG, 0xc4) < 0) 1981 if (STV090x_WRITE_DEMOD(state, CARCFG, 0xc4) < 0)
1874 goto err; 1982 goto err;
1875 } else { 1983 } else {
@@ -1881,7 +1989,7 @@ static int stv090x_blind_search(struct stv090x_state *state)
1881 if (STV090x_WRITE_DEMOD(state, RTCS2, 0x44) < 0) 1989 if (STV090x_WRITE_DEMOD(state, RTCS2, 0x44) < 0)
1882 goto err; 1990 goto err;
1883 1991
1884 if (state->dev_ver >= 0x20) { 1992 if (state->internal->dev_ver >= 0x20) {
1885 if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0) 1993 if (STV090x_WRITE_DEMOD(state, EQUALCFG, 0x41) < 0)
1886 goto err; 1994 goto err;
1887 if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) 1995 if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0)
@@ -1900,7 +2008,8 @@ static int stv090x_blind_search(struct stv090x_state *state)
1900 srate_coarse = stv090x_srate_srch_fine(state); 2008 srate_coarse = stv090x_srate_srch_fine(state);
1901 if (srate_coarse != 0) { 2009 if (srate_coarse != 0) {
1902 stv090x_get_lock_tmg(state); 2010 stv090x_get_lock_tmg(state);
1903 lock = stv090x_get_dmdlock(state, timeout_dmd); 2011 lock = stv090x_get_dmdlock(state,
2012 state->DemodTimeout);
1904 } else { 2013 } else {
1905 lock = 0; 2014 lock = 0;
1906 } 2015 }
@@ -1908,8 +2017,8 @@ static int stv090x_blind_search(struct stv090x_state *state)
1908 cpt_fail = 0; 2017 cpt_fail = 0;
1909 agc2_ovflw = 0; 2018 agc2_ovflw = 0;
1910 for (i = 0; i < 10; i++) { 2019 for (i = 0; i < 10; i++) {
1911 agc2 = STV090x_READ_DEMOD(state, AGC2I1) << 8; 2020 agc2 += (STV090x_READ_DEMOD(state, AGC2I1) << 8) |
1912 agc2 |= STV090x_READ_DEMOD(state, AGC2I0); 2021 STV090x_READ_DEMOD(state, AGC2I0);
1913 if (agc2 >= 0xff00) 2022 if (agc2 >= 0xff00)
1914 agc2_ovflw++; 2023 agc2_ovflw++;
1915 reg = STV090x_READ_DEMOD(state, DSTATUS2); 2024 reg = STV090x_READ_DEMOD(state, DSTATUS2);
@@ -1923,7 +2032,7 @@ static int stv090x_blind_search(struct stv090x_state *state)
1923 2032
1924 lock = 0; 2033 lock = 0;
1925 } 2034 }
1926 k_ref -= 30; 2035 k_ref -= 20;
1927 } while ((k_ref >= k_min) && (!lock) && (!coarse_fail)); 2036 } while ((k_ref >= k_min) && (!lock) && (!coarse_fail));
1928 } 2037 }
1929 2038
@@ -1939,7 +2048,7 @@ static int stv090x_chk_tmg(struct stv090x_state *state)
1939 u32 reg; 2048 u32 reg;
1940 s32 tmg_cpt = 0, i; 2049 s32 tmg_cpt = 0, i;
1941 u8 freq, tmg_thh, tmg_thl; 2050 u8 freq, tmg_thh, tmg_thl;
1942 int tmg_lock; 2051 int tmg_lock = 0;
1943 2052
1944 freq = STV090x_READ_DEMOD(state, CARFREQ); 2053 freq = STV090x_READ_DEMOD(state, CARFREQ);
1945 tmg_thh = STV090x_READ_DEMOD(state, TMGTHRISE); 2054 tmg_thh = STV090x_READ_DEMOD(state, TMGTHRISE);
@@ -2062,13 +2171,13 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
2062 goto err; 2171 goto err;
2063 2172
2064 if (state->config->tuner_set_frequency) { 2173 if (state->config->tuner_set_frequency) {
2065 if (state->config->tuner_set_frequency(fe, state->frequency) < 0) 2174 if (state->config->tuner_set_frequency(fe, freq) < 0)
2066 goto err; 2175 goto err_gateoff;
2067 } 2176 }
2068 2177
2069 if (state->config->tuner_set_bandwidth) { 2178 if (state->config->tuner_set_bandwidth) {
2070 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) 2179 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0)
2071 goto err; 2180 goto err_gateoff;
2072 } 2181 }
2073 2182
2074 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 2183 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
@@ -2081,7 +2190,7 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
2081 2190
2082 if (state->config->tuner_get_status) { 2191 if (state->config->tuner_get_status) {
2083 if (state->config->tuner_get_status(fe, &reg) < 0) 2192 if (state->config->tuner_get_status(fe, &reg) < 0)
2084 goto err; 2193 goto err_gateoff;
2085 } 2194 }
2086 2195
2087 if (reg) 2196 if (reg)
@@ -2093,17 +2202,6 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
2093 goto err; 2202 goto err;
2094 2203
2095 STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c); 2204 STV090x_WRITE_DEMOD(state, DMDISTATE, 0x1c);
2096 if (state->delsys == STV090x_DVBS2) {
2097 reg = STV090x_READ_DEMOD(state, DMDCFGMD);
2098 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 0);
2099 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0);
2100 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
2101 goto err;
2102 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1);
2103 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 1);
2104 if (STV090x_WRITE_DEMOD(state, DMDCFGMD, reg) < 0)
2105 goto err;
2106 }
2107 if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0) 2205 if (STV090x_WRITE_DEMOD(state, CFRINIT1, 0x00) < 0)
2108 goto err; 2206 goto err;
2109 if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0) 2207 if (STV090x_WRITE_DEMOD(state, CFRINIT0, 0x00) < 0)
@@ -2123,6 +2221,8 @@ static int stv090x_get_coldlock(struct stv090x_state *state, s32 timeout_dmd)
2123 2221
2124 return lock; 2222 return lock;
2125 2223
2224err_gateoff:
2225 stv090x_i2c_gate_ctrl(fe, 0);
2126err: 2226err:
2127 dprintk(FE_ERROR, 1, "I/O error"); 2227 dprintk(FE_ERROR, 1, "I/O error");
2128 return -1; 2228 return -1;
@@ -2136,13 +2236,13 @@ static int stv090x_get_loop_params(struct stv090x_state *state, s32 *freq_inc, s
2136 car_max = state->search_range / 1000; 2236 car_max = state->search_range / 1000;
2137 car_max += car_max / 10; 2237 car_max += car_max / 10;
2138 car_max = 65536 * (car_max / 2); 2238 car_max = 65536 * (car_max / 2);
2139 car_max /= (state->mclk / 1000); 2239 car_max /= (state->internal->mclk / 1000);
2140 2240
2141 if (car_max > 0x4000) 2241 if (car_max > 0x4000)
2142 car_max = 0x4000 ; /* maxcarrier should be<= +-1/4 Mclk */ 2242 car_max = 0x4000 ; /* maxcarrier should be<= +-1/4 Mclk */
2143 2243
2144 inc = srate; 2244 inc = srate;
2145 inc /= state->mclk / 1000; 2245 inc /= state->internal->mclk / 1000;
2146 inc *= 256; 2246 inc *= 256;
2147 inc *= 256; 2247 inc *= 256;
2148 inc /= 1000; 2248 inc /= 1000;
@@ -2203,7 +2303,7 @@ static int stv090x_chk_signal(struct stv090x_state *state)
2203 2303
2204 car_max += (car_max / 10); /* 10% margin */ 2304 car_max += (car_max / 10); /* 10% margin */
2205 car_max = (65536 * car_max / 2); 2305 car_max = (65536 * car_max / 2);
2206 car_max /= state->mclk / 1000; 2306 car_max /= state->internal->mclk / 1000;
2207 2307
2208 if (car_max > 0x4000) 2308 if (car_max > 0x4000)
2209 car_max = 0x4000; 2309 car_max = 0x4000;
@@ -2228,7 +2328,7 @@ static int stv090x_search_car_loop(struct stv090x_state *state, s32 inc, s32 tim
2228 car_max = state->search_range / 1000; 2328 car_max = state->search_range / 1000;
2229 car_max += (car_max / 10); 2329 car_max += (car_max / 10);
2230 car_max = (65536 * car_max / 2); 2330 car_max = (65536 * car_max / 2);
2231 car_max /= (state->mclk / 1000); 2331 car_max /= (state->internal->mclk / 1000);
2232 if (car_max > 0x4000) 2332 if (car_max > 0x4000)
2233 car_max = 0x4000; 2333 car_max = 0x4000;
2234 2334
@@ -2298,7 +2398,7 @@ static int stv090x_sw_algo(struct stv090x_state *state)
2298 case STV090x_SEARCH_DVBS1: 2398 case STV090x_SEARCH_DVBS1:
2299 case STV090x_SEARCH_DSS: 2399 case STV090x_SEARCH_DSS:
2300 /* accelerate the frequency detector */ 2400 /* accelerate the frequency detector */
2301 if (state->dev_ver >= 0x20) { 2401 if (state->internal->dev_ver >= 0x20) {
2302 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3B) < 0) 2402 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3B) < 0)
2303 goto err; 2403 goto err;
2304 } 2404 }
@@ -2309,7 +2409,7 @@ static int stv090x_sw_algo(struct stv090x_state *state)
2309 break; 2409 break;
2310 2410
2311 case STV090x_SEARCH_DVBS2: 2411 case STV090x_SEARCH_DVBS2:
2312 if (state->dev_ver >= 0x20) { 2412 if (state->internal->dev_ver >= 0x20) {
2313 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) 2413 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0)
2314 goto err; 2414 goto err;
2315 } 2415 }
@@ -2322,7 +2422,7 @@ static int stv090x_sw_algo(struct stv090x_state *state)
2322 case STV090x_SEARCH_AUTO: 2422 case STV090x_SEARCH_AUTO:
2323 default: 2423 default:
2324 /* accelerate the frequency detector */ 2424 /* accelerate the frequency detector */
2325 if (state->dev_ver >= 0x20) { 2425 if (state->internal->dev_ver >= 0x20) {
2326 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3b) < 0) 2426 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x3b) < 0)
2327 goto err; 2427 goto err;
2328 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) 2428 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0)
@@ -2344,7 +2444,7 @@ static int stv090x_sw_algo(struct stv090x_state *state)
2344 /*run the SW search 2 times maximum*/ 2444 /*run the SW search 2 times maximum*/
2345 if (lock || no_signal || (trials == 2)) { 2445 if (lock || no_signal || (trials == 2)) {
2346 /*Check if the demod is not losing lock in DVBS2*/ 2446 /*Check if the demod is not losing lock in DVBS2*/
2347 if (state->dev_ver >= 0x20) { 2447 if (state->internal->dev_ver >= 0x20) {
2348 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) 2448 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0)
2349 goto err; 2449 goto err;
2350 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) 2450 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0)
@@ -2366,7 +2466,7 @@ static int stv090x_sw_algo(struct stv090x_state *state)
2366 /*FALSE lock, The demod is loosing lock */ 2466 /*FALSE lock, The demod is loosing lock */
2367 lock = 0; 2467 lock = 0;
2368 if (trials < 2) { 2468 if (trials < 2) {
2369 if (state->dev_ver >= 0x20) { 2469 if (state->internal->dev_ver >= 0x20) {
2370 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0) 2470 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x79) < 0)
2371 goto err; 2471 goto err;
2372 } 2472 }
@@ -2416,16 +2516,16 @@ static s32 stv090x_get_car_freq(struct stv090x_state *state, u32 mclk)
2416 derot |= STV090x_READ_DEMOD(state, CFR0); 2516 derot |= STV090x_READ_DEMOD(state, CFR0);
2417 2517
2418 derot = comp2(derot, 24); 2518 derot = comp2(derot, 24);
2419 int_1 = state->mclk >> 12; 2519 int_1 = mclk >> 12;
2420 int_2 = derot >> 12; 2520 int_2 = derot >> 12;
2421 2521
2422 /* carrier_frequency = MasterClock * Reg / 2^24 */ 2522 /* carrier_frequency = MasterClock * Reg / 2^24 */
2423 tmp_1 = state->mclk % 0x1000; 2523 tmp_1 = mclk % 0x1000;
2424 tmp_2 = derot % 0x1000; 2524 tmp_2 = derot % 0x1000;
2425 2525
2426 derot = (int_1 * int_2) + 2526 derot = (int_1 * int_2) +
2427 ((int_1 * tmp_2) >> 12) + 2527 ((int_1 * tmp_2) >> 12) +
2428 ((int_1 * tmp_1) >> 12); 2528 ((int_2 * tmp_1) >> 12);
2429 2529
2430 return derot; 2530 return derot;
2431} 2531}
@@ -2496,13 +2596,13 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st
2496 2596
2497 if (state->config->tuner_get_frequency) { 2597 if (state->config->tuner_get_frequency) {
2498 if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) 2598 if (state->config->tuner_get_frequency(fe, &state->frequency) < 0)
2499 goto err; 2599 goto err_gateoff;
2500 } 2600 }
2501 2601
2502 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 2602 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
2503 goto err; 2603 goto err;
2504 2604
2505 offst_freq = stv090x_get_car_freq(state, state->mclk) / 1000; 2605 offst_freq = stv090x_get_car_freq(state, state->internal->mclk) / 1000;
2506 state->frequency += offst_freq; 2606 state->frequency += offst_freq;
2507 2607
2508 if (stv090x_get_viterbi(state) < 0) 2608 if (stv090x_get_viterbi(state) < 0)
@@ -2524,7 +2624,7 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st
2524 2624
2525 if (state->config->tuner_get_frequency) { 2625 if (state->config->tuner_get_frequency) {
2526 if (state->config->tuner_get_frequency(fe, &state->frequency) < 0) 2626 if (state->config->tuner_get_frequency(fe, &state->frequency) < 0)
2527 goto err; 2627 goto err_gateoff;
2528 } 2628 }
2529 2629
2530 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 2630 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
@@ -2544,6 +2644,9 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st
2544 } 2644 }
2545 2645
2546 return STV090x_OUTOFRANGE; 2646 return STV090x_OUTOFRANGE;
2647
2648err_gateoff:
2649 stv090x_i2c_gate_ctrl(fe, 0);
2547err: 2650err:
2548 dprintk(FE_ERROR, 1, "I/O error"); 2651 dprintk(FE_ERROR, 1, "I/O error");
2549 return -1; 2652 return -1;
@@ -2573,7 +2676,7 @@ static u8 stv090x_optimize_carloop(struct stv090x_state *state, enum stv090x_mod
2573 s32 i; 2676 s32 i;
2574 struct stv090x_long_frame_crloop *car_loop, *car_loop_qpsk_low, *car_loop_apsk_low; 2677 struct stv090x_long_frame_crloop *car_loop, *car_loop_qpsk_low, *car_loop_apsk_low;
2575 2678
2576 if (state->dev_ver == 0x20) { 2679 if (state->internal->dev_ver == 0x20) {
2577 car_loop = stv090x_s2_crl_cut20; 2680 car_loop = stv090x_s2_crl_cut20;
2578 car_loop_qpsk_low = stv090x_s2_lowqpsk_crl_cut20; 2681 car_loop_qpsk_low = stv090x_s2_lowqpsk_crl_cut20;
2579 car_loop_apsk_low = stv090x_s2_apsk_crl_cut20; 2682 car_loop_apsk_low = stv090x_s2_apsk_crl_cut20;
@@ -2694,7 +2797,7 @@ static u8 stv090x_optimize_carloop_short(struct stv090x_state *state)
2694 break; 2797 break;
2695 } 2798 }
2696 2799
2697 if (state->dev_ver >= 0x30) { 2800 if (state->internal->dev_ver >= 0x30) {
2698 /* Cut 3.0 and up */ 2801 /* Cut 3.0 and up */
2699 short_crl = stv090x_s2_short_crl_cut30; 2802 short_crl = stv090x_s2_short_crl_cut30;
2700 } else { 2803 } else {
@@ -2726,13 +2829,13 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2726 s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0; 2829 s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0;
2727 u32 reg; 2830 u32 reg;
2728 2831
2729 srate = stv090x_get_srate(state, state->mclk); 2832 srate = stv090x_get_srate(state, state->internal->mclk);
2730 srate += stv090x_get_tmgoffst(state, srate); 2833 srate += stv090x_get_tmgoffst(state, srate);
2731 2834
2732 switch (state->delsys) { 2835 switch (state->delsys) {
2733 case STV090x_DVBS1: 2836 case STV090x_DVBS1:
2734 case STV090x_DSS: 2837 case STV090x_DSS:
2735 if (state->algo == STV090x_SEARCH_AUTO) { 2838 if (state->search_mode == STV090x_SEARCH_AUTO) {
2736 reg = STV090x_READ_DEMOD(state, DMDCFGMD); 2839 reg = STV090x_READ_DEMOD(state, DMDCFGMD);
2737 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); 2840 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1);
2738 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0); 2841 STV090x_SETFIELD_Px(reg, DVBS2_ENABLE_FIELD, 0);
@@ -2745,7 +2848,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2745 if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0) 2848 if (STV090x_WRITE_DEMOD(state, DEMOD, reg) < 0)
2746 goto err; 2849 goto err;
2747 2850
2748 if (state->dev_ver >= 0x30) { 2851 if (state->internal->dev_ver >= 0x30) {
2749 if (stv090x_get_viterbi(state) < 0) 2852 if (stv090x_get_viterbi(state) < 0)
2750 goto err; 2853 goto err;
2751 2854
@@ -2857,9 +2960,12 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2857 if (stv090x_set_srate(state, srate) < 0) 2960 if (stv090x_set_srate(state, srate) < 0)
2858 goto err; 2961 goto err;
2859 blind_tune = 1; 2962 blind_tune = 1;
2963
2964 if (stv090x_dvbs_track_crl(state) < 0)
2965 goto err;
2860 } 2966 }
2861 2967
2862 if (state->dev_ver >= 0x20) { 2968 if (state->internal->dev_ver >= 0x20) {
2863 if ((state->search_mode == STV090x_SEARCH_DVBS1) || 2969 if ((state->search_mode == STV090x_SEARCH_DVBS1) ||
2864 (state->search_mode == STV090x_SEARCH_DSS) || 2970 (state->search_mode == STV090x_SEARCH_DSS) ||
2865 (state->search_mode == STV090x_SEARCH_AUTO)) { 2971 (state->search_mode == STV090x_SEARCH_AUTO)) {
@@ -2881,7 +2987,8 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2881 if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x80) < 0) 2987 if (STV090x_WRITE_DEMOD(state, SFRLOW1, 0x80) < 0)
2882 goto err; 2988 goto err;
2883 2989
2884 if ((state->dev_ver >= 0x20) || (blind_tune == 1) || (state->srate < 10000000)) { 2990 if ((state->internal->dev_ver >= 0x20) || (blind_tune == 1) ||
2991 (state->srate < 10000000)) {
2885 /* update initial carrier freq with the found freq offset */ 2992 /* update initial carrier freq with the found freq offset */
2886 if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0) 2993 if (STV090x_WRITE_DEMOD(state, CFRINIT1, f_1) < 0)
2887 goto err; 2994 goto err;
@@ -2889,7 +2996,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2889 goto err; 2996 goto err;
2890 state->tuner_bw = stv090x_car_width(srate, state->rolloff) + 10000000; 2997 state->tuner_bw = stv090x_car_width(srate, state->rolloff) + 10000000;
2891 2998
2892 if ((state->dev_ver >= 0x20) || (blind_tune == 1)) { 2999 if ((state->internal->dev_ver >= 0x20) || (blind_tune == 1)) {
2893 3000
2894 if (state->algo != STV090x_WARM_SEARCH) { 3001 if (state->algo != STV090x_WARM_SEARCH) {
2895 3002
@@ -2898,7 +3005,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2898 3005
2899 if (state->config->tuner_set_bandwidth) { 3006 if (state->config->tuner_set_bandwidth) {
2900 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) 3007 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0)
2901 goto err; 3008 goto err_gateoff;
2902 } 3009 }
2903 3010
2904 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 3011 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
@@ -2941,7 +3048,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2941 3048
2942 } 3049 }
2943 3050
2944 if (state->dev_ver >= 0x20) { 3051 if (state->internal->dev_ver >= 0x20) {
2945 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0) 3052 if (STV090x_WRITE_DEMOD(state, CARFREQ, 0x49) < 0)
2946 goto err; 3053 goto err;
2947 } 3054 }
@@ -2950,6 +3057,9 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2950 stv090x_set_vit_thtracq(state); 3057 stv090x_set_vit_thtracq(state);
2951 3058
2952 return 0; 3059 return 0;
3060
3061err_gateoff:
3062 stv090x_i2c_gate_ctrl(fe, 0);
2953err: 3063err:
2954 dprintk(FE_ERROR, 1, "I/O error"); 3064 dprintk(FE_ERROR, 1, "I/O error");
2955 return -1; 3065 return -1;
@@ -3017,7 +3127,7 @@ static int stv090x_set_s2rolloff(struct stv090x_state *state)
3017{ 3127{
3018 u32 reg; 3128 u32 reg;
3019 3129
3020 if (state->dev_ver <= 0x20) { 3130 if (state->internal->dev_ver <= 0x20) {
3021 /* rolloff to auto mode if DVBS2 */ 3131 /* rolloff to auto mode if DVBS2 */
3022 reg = STV090x_READ_DEMOD(state, DEMOD); 3132 reg = STV090x_READ_DEMOD(state, DEMOD);
3023 STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 0x00); 3133 STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 0x00);
@@ -3042,7 +3152,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3042 struct dvb_frontend *fe = &state->frontend; 3152 struct dvb_frontend *fe = &state->frontend;
3043 enum stv090x_signal_state signal_state = STV090x_NOCARRIER; 3153 enum stv090x_signal_state signal_state = STV090x_NOCARRIER;
3044 u32 reg; 3154 u32 reg;
3045 s32 timeout_dmd = 500, timeout_fec = 50, agc1_power, power_iq = 0, i; 3155 s32 agc1_power, power_iq = 0, i;
3046 int lock = 0, low_sr = 0, no_signal = 0; 3156 int lock = 0, low_sr = 0, no_signal = 0;
3047 3157
3048 reg = STV090x_READ_DEMOD(state, TSCFGH); 3158 reg = STV090x_READ_DEMOD(state, TSCFGH);
@@ -3053,9 +3163,14 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3053 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod stop */ 3163 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Demod stop */
3054 goto err; 3164 goto err;
3055 3165
3056 if (state->dev_ver >= 0x20) { 3166 if (state->internal->dev_ver >= 0x20) {
3057 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0) /* cut 2.0 */ 3167 if (state->srate > 5000000) {
3058 goto err; 3168 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x9e) < 0)
3169 goto err;
3170 } else {
3171 if (STV090x_WRITE_DEMOD(state, CORRELABS, 0x82) < 0)
3172 goto err;
3173 }
3059 } 3174 }
3060 3175
3061 stv090x_get_lock_tmg(state); 3176 stv090x_get_lock_tmg(state);
@@ -3088,7 +3203,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3088 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0) 3203 if (STV090x_WRITE_DEMOD(state, AGC2REF, 0x38) < 0)
3089 goto err; 3204 goto err;
3090 3205
3091 if (state->dev_ver >= 0x20) { 3206 if (state->internal->dev_ver >= 0x20) {
3092 if (STV090x_WRITE_DEMOD(state, KREFTMG, 0x5a) < 0) 3207 if (STV090x_WRITE_DEMOD(state, KREFTMG, 0x5a) < 0)
3093 goto err; 3208 goto err;
3094 if (state->algo == STV090x_COLD_SEARCH) 3209 if (state->algo == STV090x_COLD_SEARCH)
@@ -3106,9 +3221,11 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3106 if (stv090x_set_srate(state, state->srate) < 0) 3221 if (stv090x_set_srate(state, state->srate) < 0)
3107 goto err; 3222 goto err;
3108 3223
3109 if (stv090x_set_max_srate(state, state->mclk, state->srate) < 0) 3224 if (stv090x_set_max_srate(state, state->internal->mclk,
3225 state->srate) < 0)
3110 goto err; 3226 goto err;
3111 if (stv090x_set_min_srate(state, state->mclk, state->srate) < 0) 3227 if (stv090x_set_min_srate(state, state->internal->mclk,
3228 state->srate) < 0)
3112 goto err; 3229 goto err;
3113 3230
3114 if (state->srate >= 10000000) 3231 if (state->srate >= 10000000)
@@ -3122,18 +3239,21 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3122 goto err; 3239 goto err;
3123 3240
3124 if (state->config->tuner_set_bbgain) { 3241 if (state->config->tuner_set_bbgain) {
3125 if (state->config->tuner_set_bbgain(fe, 10) < 0) /* 10dB */ 3242 reg = state->config->tuner_bbgain;
3126 goto err; 3243 if (reg == 0)
3244 reg = 10; /* default: 10dB */
3245 if (state->config->tuner_set_bbgain(fe, reg) < 0)
3246 goto err_gateoff;
3127 } 3247 }
3128 3248
3129 if (state->config->tuner_set_frequency) { 3249 if (state->config->tuner_set_frequency) {
3130 if (state->config->tuner_set_frequency(fe, state->frequency) < 0) 3250 if (state->config->tuner_set_frequency(fe, state->frequency) < 0)
3131 goto err; 3251 goto err_gateoff;
3132 } 3252 }
3133 3253
3134 if (state->config->tuner_set_bandwidth) { 3254 if (state->config->tuner_set_bandwidth) {
3135 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0) 3255 if (state->config->tuner_set_bandwidth(fe, state->tuner_bw) < 0)
3136 goto err; 3256 goto err_gateoff;
3137 } 3257 }
3138 3258
3139 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 3259 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
@@ -3141,21 +3261,21 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3141 3261
3142 msleep(50); 3262 msleep(50);
3143 3263
3144 if (stv090x_i2c_gate_ctrl(fe, 1) < 0)
3145 goto err;
3146
3147 if (state->config->tuner_get_status) { 3264 if (state->config->tuner_get_status) {
3265 if (stv090x_i2c_gate_ctrl(fe, 1) < 0)
3266 goto err;
3148 if (state->config->tuner_get_status(fe, &reg) < 0) 3267 if (state->config->tuner_get_status(fe, &reg) < 0)
3268 goto err_gateoff;
3269 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
3149 goto err; 3270 goto err;
3150 }
3151 3271
3152 if (reg) 3272 if (reg)
3153 dprintk(FE_DEBUG, 1, "Tuner phase locked"); 3273 dprintk(FE_DEBUG, 1, "Tuner phase locked");
3154 else 3274 else {
3155 dprintk(FE_DEBUG, 1, "Tuner unlocked"); 3275 dprintk(FE_DEBUG, 1, "Tuner unlocked");
3156 3276 return STV090x_NOCARRIER;
3157 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 3277 }
3158 goto err; 3278 }
3159 3279
3160 msleep(10); 3280 msleep(10);
3161 agc1_power = MAKEWORD16(STV090x_READ_DEMOD(state, AGCIQIN1), 3281 agc1_power = MAKEWORD16(STV090x_READ_DEMOD(state, AGCIQIN1),
@@ -3175,12 +3295,12 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3175 if ((agc1_power == 0) && (power_iq < STV090x_IQPOWER_THRESHOLD)) { 3295 if ((agc1_power == 0) && (power_iq < STV090x_IQPOWER_THRESHOLD)) {
3176 dprintk(FE_ERROR, 1, "No Signal: POWER_IQ=0x%02x", power_iq); 3296 dprintk(FE_ERROR, 1, "No Signal: POWER_IQ=0x%02x", power_iq);
3177 lock = 0; 3297 lock = 0;
3178 3298 signal_state = STV090x_NOAGC1;
3179 } else { 3299 } else {
3180 reg = STV090x_READ_DEMOD(state, DEMOD); 3300 reg = STV090x_READ_DEMOD(state, DEMOD);
3181 STV090x_SETFIELD_Px(reg, SPECINV_CONTROL_FIELD, state->inversion); 3301 STV090x_SETFIELD_Px(reg, SPECINV_CONTROL_FIELD, state->inversion);
3182 3302
3183 if (state->dev_ver <= 0x20) { 3303 if (state->internal->dev_ver <= 0x20) {
3184 /* rolloff to auto mode if DVBS2 */ 3304 /* rolloff to auto mode if DVBS2 */
3185 STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 1); 3305 STV090x_SETFIELD_Px(reg, MANUAL_SXROLLOFF_FIELD, 1);
3186 } else { 3306 } else {
@@ -3199,18 +3319,17 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3199 } 3319 }
3200 } 3320 }
3201 3321
3202 /* need to check for AGC1 state */ 3322 if (signal_state == STV090x_NOAGC1)
3203 3323 return signal_state;
3204
3205 3324
3206 if (state->algo == STV090x_BLIND_SEARCH) 3325 if (state->algo == STV090x_BLIND_SEARCH)
3207 lock = stv090x_blind_search(state); 3326 lock = stv090x_blind_search(state);
3208 3327
3209 else if (state->algo == STV090x_COLD_SEARCH) 3328 else if (state->algo == STV090x_COLD_SEARCH)
3210 lock = stv090x_get_coldlock(state, timeout_dmd); 3329 lock = stv090x_get_coldlock(state, state->DemodTimeout);
3211 3330
3212 else if (state->algo == STV090x_WARM_SEARCH) 3331 else if (state->algo == STV090x_WARM_SEARCH)
3213 lock = stv090x_get_dmdlock(state, timeout_dmd); 3332 lock = stv090x_get_dmdlock(state, state->DemodTimeout);
3214 3333
3215 if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) { 3334 if ((!lock) && (state->algo == STV090x_COLD_SEARCH)) {
3216 if (!low_sr) { 3335 if (!low_sr) {
@@ -3225,7 +3344,7 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3225 if ((lock) && (signal_state == STV090x_RANGEOK)) { /* signal within Range */ 3344 if ((lock) && (signal_state == STV090x_RANGEOK)) { /* signal within Range */
3226 stv090x_optimize_track(state); 3345 stv090x_optimize_track(state);
3227 3346
3228 if (state->dev_ver >= 0x20) { 3347 if (state->internal->dev_ver >= 0x20) {
3229 /* >= Cut 2.0 :release TS reset after 3348 /* >= Cut 2.0 :release TS reset after
3230 * demod lock and optimized Tracking 3349 * demod lock and optimized Tracking
3231 */ 3350 */
@@ -3245,8 +3364,9 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3245 goto err; 3364 goto err;
3246 } 3365 }
3247 3366
3248 if (stv090x_get_lock(state, timeout_fec, timeout_fec)) { 3367 lock = stv090x_get_lock(state, state->FecTimeout,
3249 lock = 1; 3368 state->FecTimeout);
3369 if (lock) {
3250 if (state->delsys == STV090x_DVBS2) { 3370 if (state->delsys == STV090x_DVBS2) {
3251 stv090x_set_s2rolloff(state); 3371 stv090x_set_s2rolloff(state);
3252 3372
@@ -3273,13 +3393,14 @@ static enum stv090x_signal_state stv090x_algo(struct stv090x_state *state)
3273 if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0) 3393 if (STV090x_WRITE_DEMOD(state, ERRCTRL2, 0xc1) < 0)
3274 goto err; 3394 goto err;
3275 } else { 3395 } else {
3276 lock = 0;
3277 signal_state = STV090x_NODATA; 3396 signal_state = STV090x_NODATA;
3278 no_signal = stv090x_chk_signal(state); 3397 no_signal = stv090x_chk_signal(state);
3279 } 3398 }
3280 } 3399 }
3281 return signal_state; 3400 return signal_state;
3282 3401
3402err_gateoff:
3403 stv090x_i2c_gate_ctrl(fe, 0);
3283err: 3404err:
3284 dprintk(FE_ERROR, 1, "I/O error"); 3405 dprintk(FE_ERROR, 1, "I/O error");
3285 return -1; 3406 return -1;
@@ -3290,13 +3411,22 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe, struct dvb_fron
3290 struct stv090x_state *state = fe->demodulator_priv; 3411 struct stv090x_state *state = fe->demodulator_priv;
3291 struct dtv_frontend_properties *props = &fe->dtv_property_cache; 3412 struct dtv_frontend_properties *props = &fe->dtv_property_cache;
3292 3413
3414 if (p->frequency == 0)
3415 return DVBFE_ALGO_SEARCH_INVALID;
3416
3293 state->delsys = props->delivery_system; 3417 state->delsys = props->delivery_system;
3294 state->frequency = p->frequency; 3418 state->frequency = p->frequency;
3295 state->srate = p->u.qpsk.symbol_rate; 3419 state->srate = p->u.qpsk.symbol_rate;
3296 state->search_mode = STV090x_SEARCH_AUTO; 3420 state->search_mode = STV090x_SEARCH_AUTO;
3297 state->algo = STV090x_COLD_SEARCH; 3421 state->algo = STV090x_COLD_SEARCH;
3298 state->fec = STV090x_PRERR; 3422 state->fec = STV090x_PRERR;
3299 state->search_range = 2000000; 3423 if (state->srate > 10000000) {
3424 dprintk(FE_DEBUG, 1, "Search range: 10 MHz");
3425 state->search_range = 10000000;
3426 } else {
3427 dprintk(FE_DEBUG, 1, "Search range: 5 MHz");
3428 state->search_range = 5000000;
3429 }
3300 3430
3301 if (stv090x_algo(state) == STV090x_RANGEOK) { 3431 if (stv090x_algo(state) == STV090x_RANGEOK) {
3302 dprintk(FE_DEBUG, 1, "Search success!"); 3432 dprintk(FE_DEBUG, 1, "Search success!");
@@ -3309,7 +3439,6 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe, struct dvb_fron
3309 return DVBFE_ALGO_SEARCH_ERROR; 3439 return DVBFE_ALGO_SEARCH_ERROR;
3310} 3440}
3311 3441
3312/* FIXME! */
3313static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status) 3442static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
3314{ 3443{
3315 struct stv090x_state *state = fe->demodulator_priv; 3444 struct stv090x_state *state = fe->demodulator_priv;
@@ -3331,9 +3460,16 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
3331 dprintk(FE_DEBUG, 1, "Delivery system: DVB-S2"); 3460 dprintk(FE_DEBUG, 1, "Delivery system: DVB-S2");
3332 reg = STV090x_READ_DEMOD(state, DSTATUS); 3461 reg = STV090x_READ_DEMOD(state, DSTATUS);
3333 if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) { 3462 if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) {
3334 reg = STV090x_READ_DEMOD(state, TSSTATUS); 3463 reg = STV090x_READ_DEMOD(state, PDELSTATUS1);
3335 if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { 3464 if (STV090x_GETFIELD_Px(reg, PKTDELIN_LOCK_FIELD)) {
3336 *status = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; 3465 reg = STV090x_READ_DEMOD(state, TSSTATUS);
3466 if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) {
3467 *status = FE_HAS_SIGNAL |
3468 FE_HAS_CARRIER |
3469 FE_HAS_VITERBI |
3470 FE_HAS_SYNC |
3471 FE_HAS_LOCK;
3472 }
3337 } 3473 }
3338 } 3474 }
3339 break; 3475 break;
@@ -3346,7 +3482,11 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
3346 if (STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD)) { 3482 if (STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD)) {
3347 reg = STV090x_READ_DEMOD(state, TSSTATUS); 3483 reg = STV090x_READ_DEMOD(state, TSSTATUS);
3348 if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) { 3484 if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) {
3349 *status = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; 3485 *status = FE_HAS_SIGNAL |
3486 FE_HAS_CARRIER |
3487 FE_HAS_VITERBI |
3488 FE_HAS_SYNC |
3489 FE_HAS_LOCK;
3350 } 3490 }
3351 } 3491 }
3352 } 3492 }
@@ -3412,14 +3552,12 @@ static int stv090x_table_lookup(const struct stv090x_tab *tab, int max, int val)
3412 int res = 0; 3552 int res = 0;
3413 int min = 0, med; 3553 int min = 0, med;
3414 3554
3415 if (val < tab[min].read) 3555 if ((val >= tab[min].read && val < tab[max].read) ||
3416 res = tab[min].real; 3556 (val >= tab[max].read && val < tab[min].read)) {
3417 else if (val >= tab[max].read)
3418 res = tab[max].real;
3419 else {
3420 while ((max - min) > 1) { 3557 while ((max - min) > 1) {
3421 med = (max + min) / 2; 3558 med = (max + min) / 2;
3422 if (val >= tab[min].read && val < tab[med].read) 3559 if ((val >= tab[min].read && val < tab[med].read) ||
3560 (val >= tab[med].read && val < tab[min].read))
3423 max = med; 3561 max = med;
3424 else 3562 else
3425 min = med; 3563 min = med;
@@ -3428,6 +3566,18 @@ static int stv090x_table_lookup(const struct stv090x_tab *tab, int max, int val)
3428 (tab[max].real - tab[min].real) / 3566 (tab[max].real - tab[min].real) /
3429 (tab[max].read - tab[min].read)) + 3567 (tab[max].read - tab[min].read)) +
3430 tab[min].real; 3568 tab[min].real;
3569 } else {
3570 if (tab[min].read < tab[max].read) {
3571 if (val < tab[min].read)
3572 res = tab[min].real;
3573 else if (val >= tab[max].read)
3574 res = tab[max].real;
3575 } else {
3576 if (val >= tab[min].read)
3577 res = tab[min].real;
3578 else if (val < tab[max].read)
3579 res = tab[max].real;
3580 }
3431 } 3581 }
3432 3582
3433 return res; 3583 return res;
@@ -3437,16 +3587,22 @@ static int stv090x_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
3437{ 3587{
3438 struct stv090x_state *state = fe->demodulator_priv; 3588 struct stv090x_state *state = fe->demodulator_priv;
3439 u32 reg; 3589 u32 reg;
3440 s32 agc; 3590 s32 agc_0, agc_1, agc;
3591 s32 str;
3441 3592
3442 reg = STV090x_READ_DEMOD(state, AGCIQIN1); 3593 reg = STV090x_READ_DEMOD(state, AGCIQIN1);
3443 agc = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD); 3594 agc_1 = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD);
3595 reg = STV090x_READ_DEMOD(state, AGCIQIN0);
3596 agc_0 = STV090x_GETFIELD_Px(reg, AGCIQ_VALUE_FIELD);
3597 agc = MAKEWORD16(agc_1, agc_0);
3444 3598
3445 *strength = stv090x_table_lookup(stv090x_rf_tab, ARRAY_SIZE(stv090x_rf_tab) - 1, agc); 3599 str = stv090x_table_lookup(stv090x_rf_tab,
3600 ARRAY_SIZE(stv090x_rf_tab) - 1, agc);
3446 if (agc > stv090x_rf_tab[0].read) 3601 if (agc > stv090x_rf_tab[0].read)
3447 *strength = 5; 3602 str = 0;
3448 else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read) 3603 else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read)
3449 *strength = -100; 3604 str = -100;
3605 *strength = (str + 100) * 0xFFFF / 100;
3450 3606
3451 return 0; 3607 return 0;
3452} 3608}
@@ -3457,6 +3613,8 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
3457 u32 reg_0, reg_1, reg, i; 3613 u32 reg_0, reg_1, reg, i;
3458 s32 val_0, val_1, val = 0; 3614 s32 val_0, val_1, val = 0;
3459 u8 lock_f; 3615 u8 lock_f;
3616 s32 div;
3617 u32 last;
3460 3618
3461 switch (state->delsys) { 3619 switch (state->delsys) {
3462 case STV090x_DVBS2: 3620 case STV090x_DVBS2:
@@ -3468,14 +3626,15 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
3468 reg_1 = STV090x_READ_DEMOD(state, NNOSPLHT1); 3626 reg_1 = STV090x_READ_DEMOD(state, NNOSPLHT1);
3469 val_1 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); 3627 val_1 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD);
3470 reg_0 = STV090x_READ_DEMOD(state, NNOSPLHT0); 3628 reg_0 = STV090x_READ_DEMOD(state, NNOSPLHT0);
3471 val_0 = STV090x_GETFIELD_Px(reg_1, NOSPLHT_NORMED_FIELD); 3629 val_0 = STV090x_GETFIELD_Px(reg_0, NOSPLHT_NORMED_FIELD);
3472 val += MAKEWORD16(val_1, val_0); 3630 val += MAKEWORD16(val_1, val_0);
3473 msleep(1); 3631 msleep(1);
3474 } 3632 }
3475 val /= 16; 3633 val /= 16;
3476 *cnr = stv090x_table_lookup(stv090x_s2cn_tab, ARRAY_SIZE(stv090x_s2cn_tab) - 1, val); 3634 last = ARRAY_SIZE(stv090x_s2cn_tab) - 1;
3477 if (val < stv090x_s2cn_tab[ARRAY_SIZE(stv090x_s2cn_tab) - 1].read) 3635 div = stv090x_s2cn_tab[0].read -
3478 *cnr = 1000; 3636 stv090x_s2cn_tab[last].read;
3637 *cnr = 0xFFFF - ((val * 0xFFFF) / div);
3479 } 3638 }
3480 break; 3639 break;
3481 3640
@@ -3489,14 +3648,15 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
3489 reg_1 = STV090x_READ_DEMOD(state, NOSDATAT1); 3648 reg_1 = STV090x_READ_DEMOD(state, NOSDATAT1);
3490 val_1 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); 3649 val_1 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD);
3491 reg_0 = STV090x_READ_DEMOD(state, NOSDATAT0); 3650 reg_0 = STV090x_READ_DEMOD(state, NOSDATAT0);
3492 val_0 = STV090x_GETFIELD_Px(reg_1, NOSDATAT_UNNORMED_FIELD); 3651 val_0 = STV090x_GETFIELD_Px(reg_0, NOSDATAT_UNNORMED_FIELD);
3493 val += MAKEWORD16(val_1, val_0); 3652 val += MAKEWORD16(val_1, val_0);
3494 msleep(1); 3653 msleep(1);
3495 } 3654 }
3496 val /= 16; 3655 val /= 16;
3497 *cnr = stv090x_table_lookup(stv090x_s1cn_tab, ARRAY_SIZE(stv090x_s1cn_tab) - 1, val); 3656 last = ARRAY_SIZE(stv090x_s1cn_tab) - 1;
3498 if (val < stv090x_s2cn_tab[ARRAY_SIZE(stv090x_s1cn_tab) - 1].read) 3657 div = stv090x_s1cn_tab[0].read -
3499 *cnr = 1000; 3658 stv090x_s1cn_tab[last].read;
3659 *cnr = 0xFFFF - ((val * 0xFFFF) / div);
3500 } 3660 }
3501 break; 3661 break;
3502 default: 3662 default:
@@ -3553,7 +3713,8 @@ static int stv090x_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_ma
3553 3713
3554 reg = STV090x_READ_DEMOD(state, DISTXCTL); 3714 reg = STV090x_READ_DEMOD(state, DISTXCTL);
3555 3715
3556 STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD, 2); 3716 STV090x_SETFIELD_Px(reg, DISTX_MODE_FIELD,
3717 (state->config->diseqc_envelope_mode) ? 4 : 2);
3557 STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1); 3718 STV090x_SETFIELD_Px(reg, DISEQC_RESET_FIELD, 1);
3558 if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0) 3719 if (STV090x_WRITE_DEMOD(state, DISTXCTL, reg) < 0)
3559 goto err; 3720 goto err;
@@ -3605,10 +3766,10 @@ static int stv090x_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t
3605 reg = STV090x_READ_DEMOD(state, DISTXCTL); 3766 reg = STV090x_READ_DEMOD(state, DISTXCTL);
3606 3767
3607 if (burst == SEC_MINI_A) { 3768 if (burst == SEC_MINI_A) {
3608 mode = 3; 3769 mode = (state->config->diseqc_envelope_mode) ? 5 : 3;
3609 value = 0x00; 3770 value = 0x00;
3610 } else { 3771 } else {
3611 mode = 2; 3772 mode = (state->config->diseqc_envelope_mode) ? 4 : 2;
3612 value = 0xFF; 3773 value = 0xFF;
3613 } 3774 }
3614 3775
@@ -3725,6 +3886,15 @@ static void stv090x_release(struct dvb_frontend *fe)
3725{ 3886{
3726 struct stv090x_state *state = fe->demodulator_priv; 3887 struct stv090x_state *state = fe->demodulator_priv;
3727 3888
3889 state->internal->num_used--;
3890 if (state->internal->num_used <= 0) {
3891
3892 dprintk(FE_ERROR, 1, "Actually removing");
3893
3894 remove_dev(state->internal);
3895 kfree(state->internal);
3896 }
3897
3728 kfree(state); 3898 kfree(state);
3729} 3899}
3730 3900
@@ -3732,6 +3902,8 @@ static int stv090x_ldpc_mode(struct stv090x_state *state, enum stv090x_mode ldpc
3732{ 3902{
3733 u32 reg = 0; 3903 u32 reg = 0;
3734 3904
3905 reg = stv090x_read_reg(state, STV090x_GENCFG);
3906
3735 switch (ldpc_mode) { 3907 switch (ldpc_mode) {
3736 case STV090x_DUAL: 3908 case STV090x_DUAL:
3737 default: 3909 default:
@@ -3854,10 +4026,10 @@ static int stv090x_set_mclk(struct stv090x_state *state, u32 mclk, u32 clk)
3854 if (stv090x_write_reg(state, STV090x_NCOARSE, reg) < 0) 4026 if (stv090x_write_reg(state, STV090x_NCOARSE, reg) < 0)
3855 goto err; 4027 goto err;
3856 4028
3857 state->mclk = stv090x_get_mclk(state); 4029 state->internal->mclk = stv090x_get_mclk(state);
3858 4030
3859 /*Set the DiseqC frequency to 22KHz */ 4031 /*Set the DiseqC frequency to 22KHz */
3860 div = state->mclk / 704000; 4032 div = state->internal->mclk / 704000;
3861 if (STV090x_WRITE_DEMOD(state, F22TX, div) < 0) 4033 if (STV090x_WRITE_DEMOD(state, F22TX, div) < 0)
3862 goto err; 4034 goto err;
3863 if (STV090x_WRITE_DEMOD(state, F22RX, div) < 0) 4035 if (STV090x_WRITE_DEMOD(state, F22RX, div) < 0)
@@ -3873,7 +4045,7 @@ static int stv090x_set_tspath(struct stv090x_state *state)
3873{ 4045{
3874 u32 reg; 4046 u32 reg;
3875 4047
3876 if (state->dev_ver >= 0x20) { 4048 if (state->internal->dev_ver >= 0x20) {
3877 switch (state->config->ts1_mode) { 4049 switch (state->config->ts1_mode) {
3878 case STV090x_TSMODE_PARALLEL_PUNCTURED: 4050 case STV090x_TSMODE_PARALLEL_PUNCTURED:
3879 case STV090x_TSMODE_DVBCI: 4051 case STV090x_TSMODE_DVBCI:
@@ -4045,6 +4217,71 @@ static int stv090x_set_tspath(struct stv090x_state *state)
4045 default: 4217 default:
4046 break; 4218 break;
4047 } 4219 }
4220
4221 if (state->config->ts1_clk > 0) {
4222 u32 speed;
4223
4224 switch (state->config->ts1_mode) {
4225 case STV090x_TSMODE_PARALLEL_PUNCTURED:
4226 case STV090x_TSMODE_DVBCI:
4227 default:
4228 speed = state->internal->mclk /
4229 (state->config->ts1_clk / 4);
4230 if (speed < 0x08)
4231 speed = 0x08;
4232 if (speed > 0xFF)
4233 speed = 0xFF;
4234 break;
4235 case STV090x_TSMODE_SERIAL_PUNCTURED:
4236 case STV090x_TSMODE_SERIAL_CONTINUOUS:
4237 speed = state->internal->mclk /
4238 (state->config->ts1_clk / 32);
4239 if (speed < 0x20)
4240 speed = 0x20;
4241 if (speed > 0xFF)
4242 speed = 0xFF;
4243 break;
4244 }
4245 reg = stv090x_read_reg(state, STV090x_P1_TSCFGM);
4246 STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3);
4247 if (stv090x_write_reg(state, STV090x_P1_TSCFGM, reg) < 0)
4248 goto err;
4249 if (stv090x_write_reg(state, STV090x_P1_TSSPEED, speed) < 0)
4250 goto err;
4251 }
4252
4253 if (state->config->ts2_clk > 0) {
4254 u32 speed;
4255
4256 switch (state->config->ts2_mode) {
4257 case STV090x_TSMODE_PARALLEL_PUNCTURED:
4258 case STV090x_TSMODE_DVBCI:
4259 default:
4260 speed = state->internal->mclk /
4261 (state->config->ts2_clk / 4);
4262 if (speed < 0x08)
4263 speed = 0x08;
4264 if (speed > 0xFF)
4265 speed = 0xFF;
4266 break;
4267 case STV090x_TSMODE_SERIAL_PUNCTURED:
4268 case STV090x_TSMODE_SERIAL_CONTINUOUS:
4269 speed = state->internal->mclk /
4270 (state->config->ts2_clk / 32);
4271 if (speed < 0x20)
4272 speed = 0x20;
4273 if (speed > 0xFF)
4274 speed = 0xFF;
4275 break;
4276 }
4277 reg = stv090x_read_reg(state, STV090x_P2_TSCFGM);
4278 STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3);
4279 if (stv090x_write_reg(state, STV090x_P2_TSCFGM, reg) < 0)
4280 goto err;
4281 if (stv090x_write_reg(state, STV090x_P2_TSSPEED, speed) < 0)
4282 goto err;
4283 }
4284
4048 reg = stv090x_read_reg(state, STV090x_P2_TSCFGH); 4285 reg = stv090x_read_reg(state, STV090x_P2_TSCFGH);
4049 STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x01); 4286 STV090x_SETFIELD_Px(reg, RST_HWARE_FIELD, 0x01);
4050 if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0) 4287 if (stv090x_write_reg(state, STV090x_P2_TSCFGH, reg) < 0)
@@ -4073,6 +4310,15 @@ static int stv090x_init(struct dvb_frontend *fe)
4073 const struct stv090x_config *config = state->config; 4310 const struct stv090x_config *config = state->config;
4074 u32 reg; 4311 u32 reg;
4075 4312
4313 if (state->internal->mclk == 0) {
4314 stv090x_set_mclk(state, 135000000, config->xtal); /* 135 Mhz */
4315 msleep(5);
4316 if (stv090x_write_reg(state, STV090x_SYNTCTRL,
4317 0x20 | config->clk_mode) < 0)
4318 goto err;
4319 stv090x_get_mclk(state);
4320 }
4321
4076 if (stv090x_wakeup(fe) < 0) { 4322 if (stv090x_wakeup(fe) < 0) {
4077 dprintk(FE_ERROR, 1, "Error waking device"); 4323 dprintk(FE_ERROR, 1, "Error waking device");
4078 goto err; 4324 goto err;
@@ -4095,12 +4341,12 @@ static int stv090x_init(struct dvb_frontend *fe)
4095 4341
4096 if (config->tuner_set_mode) { 4342 if (config->tuner_set_mode) {
4097 if (config->tuner_set_mode(fe, TUNER_WAKE) < 0) 4343 if (config->tuner_set_mode(fe, TUNER_WAKE) < 0)
4098 goto err; 4344 goto err_gateoff;
4099 } 4345 }
4100 4346
4101 if (config->tuner_init) { 4347 if (config->tuner_init) {
4102 if (config->tuner_init(fe) < 0) 4348 if (config->tuner_init(fe) < 0)
4103 goto err; 4349 goto err_gateoff;
4104 } 4350 }
4105 4351
4106 if (stv090x_i2c_gate_ctrl(fe, 0) < 0) 4352 if (stv090x_i2c_gate_ctrl(fe, 0) < 0)
@@ -4110,6 +4356,9 @@ static int stv090x_init(struct dvb_frontend *fe)
4110 goto err; 4356 goto err;
4111 4357
4112 return 0; 4358 return 0;
4359
4360err_gateoff:
4361 stv090x_i2c_gate_ctrl(fe, 0);
4113err: 4362err:
4114 dprintk(FE_ERROR, 1, "I/O error"); 4363 dprintk(FE_ERROR, 1, "I/O error");
4115 return -1; 4364 return -1;
@@ -4141,16 +4390,26 @@ static int stv090x_setup(struct dvb_frontend *fe)
4141 } 4390 }
4142 4391
4143 /* STV090x init */ 4392 /* STV090x init */
4144 if (STV090x_WRITE_DEMOD(state, DMDISTATE, 0x5c) < 0) /* Stop Demod */ 4393
4394 /* Stop Demod */
4395 if (stv090x_write_reg(state, STV090x_P1_DMDISTATE, 0x5c) < 0)
4396 goto err;
4397 if (stv090x_write_reg(state, STV090x_P2_DMDISTATE, 0x5c) < 0)
4145 goto err; 4398 goto err;
4146 4399
4147 msleep(5); 4400 msleep(5);
4148 4401
4149 if (STV090x_WRITE_DEMOD(state, TNRCFG, 0x6c) < 0) /* check register ! (No Tuner Mode) */ 4402 /* Set No Tuner Mode */
4403 if (stv090x_write_reg(state, STV090x_P1_TNRCFG, 0x6c) < 0)
4404 goto err;
4405 if (stv090x_write_reg(state, STV090x_P2_TNRCFG, 0x6c) < 0)
4150 goto err; 4406 goto err;
4151 4407
4408 /* I2C repeater OFF */
4152 STV090x_SETFIELD_Px(reg, ENARPT_LEVEL_FIELD, config->repeater_level); 4409 STV090x_SETFIELD_Px(reg, ENARPT_LEVEL_FIELD, config->repeater_level);
4153 if (STV090x_WRITE_DEMOD(state, I2CRPT, reg) < 0) /* repeater OFF */ 4410 if (stv090x_write_reg(state, STV090x_P1_I2CRPT, reg) < 0)
4411 goto err;
4412 if (stv090x_write_reg(state, STV090x_P2_I2CRPT, reg) < 0)
4154 goto err; 4413 goto err;
4155 4414
4156 if (stv090x_write_reg(state, STV090x_NCOARSE, 0x13) < 0) /* set PLL divider */ 4415 if (stv090x_write_reg(state, STV090x_NCOARSE, 0x13) < 0) /* set PLL divider */
@@ -4169,8 +4428,8 @@ static int stv090x_setup(struct dvb_frontend *fe)
4169 goto err; 4428 goto err;
4170 } 4429 }
4171 4430
4172 state->dev_ver = stv090x_read_reg(state, STV090x_MID); 4431 state->internal->dev_ver = stv090x_read_reg(state, STV090x_MID);
4173 if (state->dev_ver >= 0x20) { 4432 if (state->internal->dev_ver >= 0x20) {
4174 if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0c) < 0) 4433 if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x0c) < 0)
4175 goto err; 4434 goto err;
4176 4435
@@ -4181,27 +4440,39 @@ static int stv090x_setup(struct dvb_frontend *fe)
4181 goto err; 4440 goto err;
4182 } 4441 }
4183 4442
4184 } else if (state->dev_ver < 0x20) { 4443 } else if (state->internal->dev_ver < 0x20) {
4185 dprintk(FE_ERROR, 1, "ERROR: Unsupported Cut: 0x%02x!", 4444 dprintk(FE_ERROR, 1, "ERROR: Unsupported Cut: 0x%02x!",
4186 state->dev_ver); 4445 state->internal->dev_ver);
4187 4446
4188 goto err; 4447 goto err;
4189 } else if (state->dev_ver > 0x30) { 4448 } else if (state->internal->dev_ver > 0x30) {
4190 /* we shouldn't bail out from here */ 4449 /* we shouldn't bail out from here */
4191 dprintk(FE_ERROR, 1, "INFO: Cut: 0x%02x probably incomplete support!", 4450 dprintk(FE_ERROR, 1, "INFO: Cut: 0x%02x probably incomplete support!",
4192 state->dev_ver); 4451 state->internal->dev_ver);
4193 } 4452 }
4194 4453
4454 /* ADC1 range */
4455 reg = stv090x_read_reg(state, STV090x_TSTTNR1);
4456 STV090x_SETFIELD(reg, ADC1_INMODE_FIELD,
4457 (config->adc1_range == STV090x_ADC_1Vpp) ? 0 : 1);
4458 if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0)
4459 goto err;
4460
4461 /* ADC2 range */
4462 reg = stv090x_read_reg(state, STV090x_TSTTNR3);
4463 STV090x_SETFIELD(reg, ADC2_INMODE_FIELD,
4464 (config->adc2_range == STV090x_ADC_1Vpp) ? 0 : 1);
4465 if (stv090x_write_reg(state, STV090x_TSTTNR3, reg) < 0)
4466 goto err;
4467
4195 if (stv090x_write_reg(state, STV090x_TSTRES0, 0x80) < 0) 4468 if (stv090x_write_reg(state, STV090x_TSTRES0, 0x80) < 0)
4196 goto err; 4469 goto err;
4197 if (stv090x_write_reg(state, STV090x_TSTRES0, 0x00) < 0) 4470 if (stv090x_write_reg(state, STV090x_TSTRES0, 0x00) < 0)
4198 goto err; 4471 goto err;
4199 4472
4200 stv090x_set_mclk(state, 135000000, config->xtal); /* 135 Mhz */ 4473 /* workaround for stuck DiSEqC output */
4201 msleep(5); 4474 if (config->diseqc_envelope_mode)
4202 if (stv090x_write_reg(state, STV090x_SYNTCTRL, 0x20 | config->clk_mode) < 0) 4475 stv090x_send_diseqc_burst(fe, SEC_MINI_A);
4203 goto err;
4204 stv090x_get_mclk(state);
4205 4476
4206 return 0; 4477 return 0;
4207err: 4478err:
@@ -4252,6 +4523,7 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
4252 enum stv090x_demodulator demod) 4523 enum stv090x_demodulator demod)
4253{ 4524{
4254 struct stv090x_state *state = NULL; 4525 struct stv090x_state *state = NULL;
4526 struct stv090x_dev *temp_int;
4255 4527
4256 state = kzalloc(sizeof (struct stv090x_state), GFP_KERNEL); 4528 state = kzalloc(sizeof (struct stv090x_state), GFP_KERNEL);
4257 if (state == NULL) 4529 if (state == NULL)
@@ -4267,8 +4539,32 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
4267 state->device = config->device; 4539 state->device = config->device;
4268 state->rolloff = STV090x_RO_35; /* default */ 4540 state->rolloff = STV090x_RO_35; /* default */
4269 4541
4270 if (state->demod == STV090x_DEMODULATOR_0) 4542 temp_int = find_dev(state->i2c,
4271 mutex_init(&demod_lock); 4543 state->config->address);
4544
4545 if ((temp_int != NULL) && (state->demod_mode == STV090x_DUAL)) {
4546 state->internal = temp_int->internal;
4547 state->internal->num_used++;
4548 dprintk(FE_INFO, 1, "Found Internal Structure!");
4549 dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x",
4550 state->device == STV0900 ? "STV0900" : "STV0903",
4551 demod,
4552 state->internal->dev_ver);
4553 return &state->frontend;
4554 } else {
4555 state->internal = kmalloc(sizeof(struct stv090x_internal),
4556 GFP_KERNEL);
4557 temp_int = append_internal(state->internal);
4558 state->internal->num_used = 1;
4559 state->internal->mclk = 0;
4560 state->internal->dev_ver = 0;
4561 state->internal->i2c_adap = state->i2c;
4562 state->internal->i2c_addr = state->config->address;
4563 dprintk(FE_INFO, 1, "Create New Internal Structure!");
4564 }
4565
4566 mutex_init(&state->internal->demod_lock);
4567 mutex_init(&state->internal->tuner_lock);
4272 4568
4273 if (stv090x_sleep(&state->frontend) < 0) { 4569 if (stv090x_sleep(&state->frontend) < 0) {
4274 dprintk(FE_ERROR, 1, "Error putting device to sleep"); 4570 dprintk(FE_ERROR, 1, "Error putting device to sleep");
@@ -4284,10 +4580,10 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
4284 goto error; 4580 goto error;
4285 } 4581 }
4286 4582
4287 dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x\n", 4583 dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x",
4288 state->device == STV0900 ? "STV0900" : "STV0903", 4584 state->device == STV0900 ? "STV0900" : "STV0903",
4289 demod, 4585 demod,
4290 state->dev_ver); 4586 state->internal->dev_ver);
4291 4587
4292 return &state->frontend; 4588 return &state->frontend;
4293 4589
diff --git a/drivers/media/dvb/frontends/stv090x.h b/drivers/media/dvb/frontends/stv090x.h
index e968c98bb70f..30f01a6902ac 100644
--- a/drivers/media/dvb/frontends/stv090x.h
+++ b/drivers/media/dvb/frontends/stv090x.h
@@ -60,6 +60,11 @@ enum stv090x_i2crpt {
60 STV090x_RPTLEVEL_2 = 7, 60 STV090x_RPTLEVEL_2 = 7,
61}; 61};
62 62
63enum stv090x_adc_range {
64 STV090x_ADC_2Vpp = 0,
65 STV090x_ADC_1Vpp = 1
66};
67
63struct stv090x_config { 68struct stv090x_config {
64 enum stv090x_device device; 69 enum stv090x_device device;
65 enum stv090x_mode demod_mode; 70 enum stv090x_mode demod_mode;
@@ -68,13 +73,19 @@ struct stv090x_config {
68 u32 xtal; /* default: 8000000 */ 73 u32 xtal; /* default: 8000000 */
69 u8 address; /* default: 0x68 */ 74 u8 address; /* default: 0x68 */
70 75
71 u32 ref_clk; /* default: 16000000 FIXME to tuner config */
72
73 u8 ts1_mode; 76 u8 ts1_mode;
74 u8 ts2_mode; 77 u8 ts2_mode;
78 u32 ts1_clk;
79 u32 ts2_clk;
75 80
76 enum stv090x_i2crpt repeater_level; 81 enum stv090x_i2crpt repeater_level;
77 82
83 u8 tuner_bbgain; /* default: 10db */
84 enum stv090x_adc_range adc1_range; /* default: 2Vpp */
85 enum stv090x_adc_range adc2_range; /* default: 2Vpp */
86
87 bool diseqc_envelope_mode;
88
78 int (*tuner_init) (struct dvb_frontend *fe); 89 int (*tuner_init) (struct dvb_frontend *fe);
79 int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode); 90 int (*tuner_set_mode) (struct dvb_frontend *fe, enum tuner_mode mode);
80 int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency); 91 int (*tuner_set_frequency) (struct dvb_frontend *fe, u32 frequency);
diff --git a/drivers/media/dvb/frontends/stv090x_priv.h b/drivers/media/dvb/frontends/stv090x_priv.h
index 5a4a01740d88..5b780c80d496 100644
--- a/drivers/media/dvb/frontends/stv090x_priv.h
+++ b/drivers/media/dvb/frontends/stv090x_priv.h
@@ -83,7 +83,7 @@
83 83
84#define STV090x_IQPOWER_THRESHOLD 30 84#define STV090x_IQPOWER_THRESHOLD 30
85#define STV090x_SEARCH_AGC2_TH_CUT20 700 85#define STV090x_SEARCH_AGC2_TH_CUT20 700
86#define STV090x_SEARCH_AGC2_TH_CUT30 1200 86#define STV090x_SEARCH_AGC2_TH_CUT30 1400
87 87
88#define STV090x_SEARCH_AGC2_TH(__ver) \ 88#define STV090x_SEARCH_AGC2_TH(__ver) \
89 ((__ver <= 0x20) ? \ 89 ((__ver <= 0x20) ? \
@@ -91,6 +91,7 @@
91 STV090x_SEARCH_AGC2_TH_CUT30) 91 STV090x_SEARCH_AGC2_TH_CUT30)
92 92
93enum stv090x_signal_state { 93enum stv090x_signal_state {
94 STV090x_NOAGC1,
94 STV090x_NOCARRIER, 95 STV090x_NOCARRIER,
95 STV090x_NODATA, 96 STV090x_NODATA,
96 STV090x_DATAOK, 97 STV090x_DATAOK,
@@ -229,11 +230,23 @@ struct stv090x_tab {
229 s32 read; 230 s32 read;
230}; 231};
231 232
233struct stv090x_internal {
234 struct i2c_adapter *i2c_adap;
235 u8 i2c_addr;
236
237 struct mutex demod_lock; /* Lock access to shared register */
238 struct mutex tuner_lock; /* Lock access to tuners */
239 s32 mclk; /* Masterclock Divider factor */
240 u32 dev_ver;
241
242 int num_used;
243};
244
232struct stv090x_state { 245struct stv090x_state {
233 enum stv090x_device device; 246 enum stv090x_device device;
234 enum stv090x_demodulator demod; 247 enum stv090x_demodulator demod;
235 enum stv090x_mode demod_mode; 248 enum stv090x_mode demod_mode;
236 u32 dev_ver; 249 struct stv090x_internal *internal;
237 250
238 struct i2c_adapter *i2c; 251 struct i2c_adapter *i2c;
239 const struct stv090x_config *config; 252 const struct stv090x_config *config;
@@ -255,11 +268,8 @@ struct stv090x_state {
255 u32 frequency; 268 u32 frequency;
256 u32 srate; 269 u32 srate;
257 270
258 s32 mclk; /* Masterclock Divider factor */
259 s32 tuner_bw; 271 s32 tuner_bw;
260 272
261 u32 tuner_refclk;
262
263 s32 search_range; 273 s32 search_range;
264 274
265 s32 DemodTimeout; 275 s32 DemodTimeout;
diff --git a/drivers/media/dvb/frontends/stv090x_reg.h b/drivers/media/dvb/frontends/stv090x_reg.h
index 57b6abbbd32d..2502855dd784 100644
--- a/drivers/media/dvb/frontends/stv090x_reg.h
+++ b/drivers/media/dvb/frontends/stv090x_reg.h
@@ -44,7 +44,7 @@
44#define STV090x_OFFST_OUTSERRS2_HZ_FIELD 5 44#define STV090x_OFFST_OUTSERRS2_HZ_FIELD 5
45#define STV090x_WIDTH_OUTSERRS2_HZ_FIELD 1 45#define STV090x_WIDTH_OUTSERRS2_HZ_FIELD 1
46#define STV090x_OFFST_OUTSERRS3_HZ_FIELD 4 46#define STV090x_OFFST_OUTSERRS3_HZ_FIELD 4
47#define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 47#define STV090x_WIDTH_OUTSERRS3_HZ_FIELD 1
48#define STV090x_OFFST_OUTPARRS3_HZ_FIELD 3 48#define STV090x_OFFST_OUTPARRS3_HZ_FIELD 3
49#define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1 49#define STV090x_WIDTH_OUTPARRS3_HZ_FIELD 1
50 50
@@ -113,24 +113,24 @@
113#define STV090x_IRQMASK3 0xf124 113#define STV090x_IRQMASK3 0xf124
114#define STV090x_OFFST_MPLL_LOCK_FIELD 5 114#define STV090x_OFFST_MPLL_LOCK_FIELD 5
115#define STV090x_WIDTH_MPLL_LOCK_FIELD 1 115#define STV090x_WIDTH_MPLL_LOCK_FIELD 1
116#define STV090x_OFFST_MSTREAM_LCK_3_FIELD 2 116#define STV090x_OFFST_MSTREAM_LCK_3_FIELD 4
117#define STV090x_WIDTH_MSTREAM_LCK_3_FIELD 3 117#define STV090x_WIDTH_MSTREAM_LCK_3_FIELD 1
118#define STV090x_OFFST_MSTREAM_LCK_2_FIELD 2 118#define STV090x_OFFST_MSTREAM_LCK_2_FIELD 3
119#define STV090x_WIDTH_MSTREAM_LCK_2_FIELD 3 119#define STV090x_WIDTH_MSTREAM_LCK_2_FIELD 1
120#define STV090x_OFFST_MSTREAM_LCK_1_FIELD 2 120#define STV090x_OFFST_MSTREAM_LCK_1_FIELD 2
121#define STV090x_WIDTH_MSTREAM_LCK_1_FIELD 3 121#define STV090x_WIDTH_MSTREAM_LCK_1_FIELD 1
122#define STV090x_OFFST_MDVBS1_PRF_2_FIELD 1 122#define STV090x_OFFST_MDVBS1_PRF_2_FIELD 1
123#define STV090x_WIDTH_MDVBS1_PRF_2_FIELD 1 123#define STV090x_WIDTH_MDVBS1_PRF_2_FIELD 1
124#define STV090x_OFFST_MDVBS1_PRF_1_FIELD 0 124#define STV090x_OFFST_MDVBS1_PRF_1_FIELD 0
125#define STV090x_WIDTH_MDVBS1_PRF_1_FIELD 1 125#define STV090x_WIDTH_MDVBS1_PRF_1_FIELD 1
126 126
127#define STV090x_IRQMASK2 0xf125 127#define STV090x_IRQMASK2 0xf125
128#define STV090x_OFFST_MSPY_ENDSIM_3_FIELD 5 128#define STV090x_OFFST_MSPY_ENDSIM_3_FIELD 7
129#define STV090x_WIDTH_MSPY_ENDSIM_3_FIELD 3 129#define STV090x_WIDTH_MSPY_ENDSIM_3_FIELD 1
130#define STV090x_OFFST_MSPY_ENDSIM_2_FIELD 5 130#define STV090x_OFFST_MSPY_ENDSIM_2_FIELD 6
131#define STV090x_WIDTH_MSPY_ENDSIM_2_FIELD 3 131#define STV090x_WIDTH_MSPY_ENDSIM_2_FIELD 1
132#define STV090x_OFFST_MSPY_ENDSIM_1_FIELD 5 132#define STV090x_OFFST_MSPY_ENDSIM_1_FIELD 5
133#define STV090x_WIDTH_MSPY_ENDSIM_1_FIELD 3 133#define STV090x_WIDTH_MSPY_ENDSIM_1_FIELD 1
134#define STV090x_OFFST_MPKTDEL_ERROR_2_FIELD 4 134#define STV090x_OFFST_MPKTDEL_ERROR_2_FIELD 4
135#define STV090x_WIDTH_MPKTDEL_ERROR_2_FIELD 1 135#define STV090x_WIDTH_MPKTDEL_ERROR_2_FIELD 1
136#define STV090x_OFFST_MPKTDEL_LOCKB_2_FIELD 3 136#define STV090x_OFFST_MPKTDEL_LOCKB_2_FIELD 3
@@ -370,7 +370,7 @@
370#define STV090x_OFFST_SELX1RATIO_FIELD 5 370#define STV090x_OFFST_SELX1RATIO_FIELD 5
371#define STV090x_WIDTH_SELX1RATIO_FIELD 1 371#define STV090x_WIDTH_SELX1RATIO_FIELD 1
372#define STV090x_OFFST_STOP_PLL_FIELD 3 372#define STV090x_OFFST_STOP_PLL_FIELD 3
373#define STV090x_WIDTH_SELX1RATIO_FIELD 1 373#define STV090x_WIDTH_STOP_PLL_FIELD 1
374#define STV090x_OFFST_BYPASSPLLFSK_FIELD 2 374#define STV090x_OFFST_BYPASSPLLFSK_FIELD 2
375#define STV090x_WIDTH_BYPASSPLLFSK_FIELD 1 375#define STV090x_WIDTH_BYPASSPLLFSK_FIELD 1
376#define STV090x_OFFST_SELOSCI_FIELD 1 376#define STV090x_OFFST_SELOSCI_FIELD 1
@@ -616,7 +616,7 @@
616#define STV090x_OFFST_Px_CONT_TONE_FIELD 4 616#define STV090x_OFFST_Px_CONT_TONE_FIELD 4
617#define STV090x_WIDTH_Px_CONT_TONE_FIELD 1 617#define STV090x_WIDTH_Px_CONT_TONE_FIELD 1
618#define STV090x_OFFST_Px_FIFO_4BREADY_FIELD 3 618#define STV090x_OFFST_Px_FIFO_4BREADY_FIELD 3
619#define STV090x_WIDTH_Px_FIFO_4BREADY_FIELD 2 619#define STV090x_WIDTH_Px_FIFO_4BREADY_FIELD 1
620#define STV090x_OFFST_Px_FIFO_EMPTY_FIELD 2 620#define STV090x_OFFST_Px_FIFO_EMPTY_FIELD 2
621#define STV090x_WIDTH_Px_FIFO_EMPTY_FIELD 1 621#define STV090x_WIDTH_Px_FIFO_EMPTY_FIELD 1
622#define STV090x_OFFST_Px_ABORT_DISRX_FIELD 0 622#define STV090x_OFFST_Px_ABORT_DISRX_FIELD 0
@@ -847,12 +847,10 @@
847#define STV090x_WIDTH_Px_DVBS2_ENABLE_FIELD 1 847#define STV090x_WIDTH_Px_DVBS2_ENABLE_FIELD 1
848#define STV090x_OFFST_Px_DVBS1_ENABLE_FIELD 6 848#define STV090x_OFFST_Px_DVBS1_ENABLE_FIELD 6
849#define STV090x_WIDTH_Px_DVBS1_ENABLE_FIELD 1 849#define STV090x_WIDTH_Px_DVBS1_ENABLE_FIELD 1
850#define STV090x_OFFST_Px_CFR_AUTOSCAN_FIELD 5 /* check */ 850#define STV090x_OFFST_Px_SCAN_ENABLE_FIELD 4
851#define STV090x_WIDTH_Px_CFR_AUTOSCAN_FIELD 1
852#define STV090x_OFFST_Px_SCAN_ENABLE_FIELD 4 /* check */
853#define STV090x_WIDTH_Px_SCAN_ENABLE_FIELD 1 851#define STV090x_WIDTH_Px_SCAN_ENABLE_FIELD 1
854#define STV090x_OFFST_Px_TUN_AUTOSCAN_FIELD 3 852#define STV090x_OFFST_Px_CFR_AUTOSCAN_FIELD 3
855#define STV090x_WIDTH_Px_TUN_AUTOSCAN_FIELD 1 853#define STV090x_WIDTH_Px_CFR_AUTOSCAN_FIELD 1
856#define STV090x_OFFST_Px_NOFORCE_RELOCK_FIELD 2 854#define STV090x_OFFST_Px_NOFORCE_RELOCK_FIELD 2
857#define STV090x_WIDTH_Px_NOFORCE_RELOCK_FIELD 1 855#define STV090x_WIDTH_Px_NOFORCE_RELOCK_FIELD 1
858#define STV090x_OFFST_Px_TUN_RNG_FIELD 0 856#define STV090x_OFFST_Px_TUN_RNG_FIELD 0
@@ -885,7 +883,7 @@
885#define STV090x_P2_DMDFLYW STV090x_Px_DMDFLYW(2) 883#define STV090x_P2_DMDFLYW STV090x_Px_DMDFLYW(2)
886#define STV090x_OFFST_Px_I2C_IRQVAL_FIELD 4 884#define STV090x_OFFST_Px_I2C_IRQVAL_FIELD 4
887#define STV090x_WIDTH_Px_I2C_IRQVAL_FIELD 4 885#define STV090x_WIDTH_Px_I2C_IRQVAL_FIELD 4
888#define STV090x_OFFST_Px_FLYWHEEL_CPT_FIELD 0 /* check */ 886#define STV090x_OFFST_Px_FLYWHEEL_CPT_FIELD 0
889#define STV090x_WIDTH_Px_FLYWHEEL_CPT_FIELD 4 887#define STV090x_WIDTH_Px_FLYWHEEL_CPT_FIELD 4
890 888
891#define STV090x_Px_DSTATUS3(__x) (0xF41D - (__x - 1) * 0x200) 889#define STV090x_Px_DSTATUS3(__x) (0xF41D - (__x - 1) * 0x200)
@@ -1048,12 +1046,12 @@
1048#define STV090x_P1_CFRINC1 STV090x_Px_CFRINC1(1) 1046#define STV090x_P1_CFRINC1 STV090x_Px_CFRINC1(1)
1049#define STV090x_P2_CFRINC1 STV090x_Px_CFRINC1(2) 1047#define STV090x_P2_CFRINC1 STV090x_Px_CFRINC1(2)
1050#define STV090x_OFFST_Px_CFR_INC1_FIELD 0 1048#define STV090x_OFFST_Px_CFR_INC1_FIELD 0
1051#define STV090x_WIDTH_Px_CFR_INC1_FIELD 7 1049#define STV090x_WIDTH_Px_CFR_INC1_FIELD 7 /* check */
1052 1050
1053#define STV090x_Px_CFRINC0(__x) (0xF44B - (__x - 1) * 0x200) 1051#define STV090x_Px_CFRINC0(__x) (0xF44B - (__x - 1) * 0x200)
1054#define STV090x_P1_CFRINC0 STV090x_Px_CFRINC0(1) 1052#define STV090x_P1_CFRINC0 STV090x_Px_CFRINC0(1)
1055#define STV090x_P2_CFRINC0 STV090x_Px_CFRINC0(2) 1053#define STV090x_P2_CFRINC0 STV090x_Px_CFRINC0(2)
1056#define STV090x_OFFST_Px_CFR_INC0_FIELD 4 1054#define STV090x_OFFST_Px_CFR_INC0_FIELD 4 /* check */
1057#define STV090x_WIDTH_Px_CFR_INC0_FIELD 4 1055#define STV090x_WIDTH_Px_CFR_INC0_FIELD 4
1058 1056
1059#define STV090x_Pn_CFRy(__x, __y) (0xF44E - (__x - 1) * 0x200 - __y * 0x1) 1057#define STV090x_Pn_CFRy(__x, __y) (0xF44E - (__x - 1) * 0x200 - __y * 0x1)
@@ -1145,14 +1143,14 @@
1145#define STV090x_Px_SFRINIT1(__x) (0xF45E - (__x - 1) * 0x200) 1143#define STV090x_Px_SFRINIT1(__x) (0xF45E - (__x - 1) * 0x200)
1146#define STV090x_P1_SFRINIT1 STV090x_Px_SFRINIT1(1) 1144#define STV090x_P1_SFRINIT1 STV090x_Px_SFRINIT1(1)
1147#define STV090x_P2_SFRINIT1 STV090x_Px_SFRINIT1(2) 1145#define STV090x_P2_SFRINIT1 STV090x_Px_SFRINIT1(2)
1148#define STV090x_OFFST_Px_SFR_INIT_FIELD 0 1146#define STV090x_OFFST_Px_SFR_INIT1_FIELD 0
1149#define STV090x_WIDTH_Px_SFR_INIT_FIELD 8 1147#define STV090x_WIDTH_Px_SFR_INIT1_FIELD 7
1150 1148
1151#define STV090x_Px_SFRINIT0(__x) (0xF45F - (__x - 1) * 0x200) 1149#define STV090x_Px_SFRINIT0(__x) (0xF45F - (__x - 1) * 0x200)
1152#define STV090x_P1_SFRINIT0 STV090x_Px_SFRINIT0(1) 1150#define STV090x_P1_SFRINIT0 STV090x_Px_SFRINIT0(1)
1153#define STV090x_P2_SFRINIT0 STV090x_Px_SFRINIT0(2) 1151#define STV090x_P2_SFRINIT0 STV090x_Px_SFRINIT0(2)
1154#define STV090x_OFFST_Px_SFR_INIT_FIELD 0 1152#define STV090x_OFFST_Px_SFR_INIT0_FIELD 0
1155#define STV090x_WIDTH_Px_SFR_INIT_FIELD 8 1153#define STV090x_WIDTH_Px_SFR_INIT0_FIELD 8
1156 1154
1157#define STV090x_Px_SFRUP1(__x) (0xF460 - (__x - 1) * 0x200) 1155#define STV090x_Px_SFRUP1(__x) (0xF460 - (__x - 1) * 0x200)
1158#define STV090x_P1_SFRUP1 STV090x_Px_SFRUP1(1) 1156#define STV090x_P1_SFRUP1 STV090x_Px_SFRUP1(1)
@@ -1178,7 +1176,7 @@
1178#define STV090x_OFFST_Px_SYMB_FREQ_LOW0_FIELD 0 1176#define STV090x_OFFST_Px_SYMB_FREQ_LOW0_FIELD 0
1179#define STV090x_WIDTH_Px_SYMB_FREQ_LOW0_FIELD 8 1177#define STV090x_WIDTH_Px_SYMB_FREQ_LOW0_FIELD 8
1180 1178
1181#define STV090x_Px_SFRy(__x, __y) (0xF464 - (__x-1) * 0x200 + (3 - __y)) 1179#define STV090x_Px_SFRy(__x, __y) (0xF467 - (__x-1) * 0x200 - __y)
1182#define STV090x_P1_SFR0 STV090x_Px_SFRy(1, 0) 1180#define STV090x_P1_SFR0 STV090x_Px_SFRy(1, 0)
1183#define STV090x_P1_SFR1 STV090x_Px_SFRy(1, 1) 1181#define STV090x_P1_SFR1 STV090x_Px_SFRy(1, 1)
1184#define STV090x_P1_SFR2 STV090x_Px_SFRy(1, 2) 1182#define STV090x_P1_SFR2 STV090x_Px_SFRy(1, 2)
@@ -1188,7 +1186,7 @@
1188#define STV090x_P2_SFR2 STV090x_Px_SFRy(2, 2) 1186#define STV090x_P2_SFR2 STV090x_Px_SFRy(2, 2)
1189#define STV090x_P2_SFR3 STV090x_Px_SFRy(2, 3) 1187#define STV090x_P2_SFR3 STV090x_Px_SFRy(2, 3)
1190#define STV090x_OFFST_Px_SYMB_FREQ_FIELD 0 1188#define STV090x_OFFST_Px_SYMB_FREQ_FIELD 0
1191#define STV090x_WIDTH_Px_SYMB_FREQ_FIELD 32 1189#define STV090x_WIDTH_Px_SYMB_FREQ_FIELD 8
1192 1190
1193#define STV090x_Px_TMGREG2(__x) (0xF468 - (__x - 1) * 0x200) 1191#define STV090x_Px_TMGREG2(__x) (0xF468 - (__x - 1) * 0x200)
1194#define STV090x_P1_TMGREG2 STV090x_Px_TMGREG2(1) 1192#define STV090x_P1_TMGREG2 STV090x_Px_TMGREG2(1)
@@ -1198,7 +1196,7 @@
1198 1196
1199#define STV090x_Px_TMGREG1(__x) (0xF469 - (__x - 1) * 0x200) 1197#define STV090x_Px_TMGREG1(__x) (0xF469 - (__x - 1) * 0x200)
1200#define STV090x_P1_TMGREG1 STV090x_Px_TMGREG1(1) 1198#define STV090x_P1_TMGREG1 STV090x_Px_TMGREG1(1)
1201#define STV090x_P2_TMGREG1 STV090x_Px_TMGREG1(2) 1199#define STV090x_P2_TMGREG1 STV090x_Px_TMGREG1(2)
1202#define STV090x_OFFST_Px_TMGREG_FIELD 0 1200#define STV090x_OFFST_Px_TMGREG_FIELD 0
1203#define STV090x_WIDTH_Px_TMGREG_FIELD 8 1201#define STV090x_WIDTH_Px_TMGREG_FIELD 8
1204 1202
@@ -1230,7 +1228,7 @@
1230#define STV090x_OFFST_Px_MU_EQUALDFE_FIELD 0 1228#define STV090x_OFFST_Px_MU_EQUALDFE_FIELD 0
1231#define STV090x_WIDTH_Px_MU_EQUALDFE_FIELD 3 1229#define STV090x_WIDTH_Px_MU_EQUALDFE_FIELD 3
1232 1230
1233#define STV090x_Px_EQUAIy(__x, __y) (0xf470 - (__x - 1) * 0x200 + (__y - 1)) 1231#define STV090x_Px_EQUAIy(__x, __y) (0xf470 - (__x-1) * 0x200 + 2 * (__y-1))
1234#define STV090x_P1_EQUAI1 STV090x_Px_EQUAIy(1, 1) 1232#define STV090x_P1_EQUAI1 STV090x_Px_EQUAIy(1, 1)
1235#define STV090x_P1_EQUAI2 STV090x_Px_EQUAIy(1, 2) 1233#define STV090x_P1_EQUAI2 STV090x_Px_EQUAIy(1, 2)
1236#define STV090x_P1_EQUAI3 STV090x_Px_EQUAIy(1, 3) 1234#define STV090x_P1_EQUAI3 STV090x_Px_EQUAIy(1, 3)
@@ -1251,7 +1249,7 @@
1251#define STV090x_OFFST_Px_EQUA_ACCIy_FIELD 0 1249#define STV090x_OFFST_Px_EQUA_ACCIy_FIELD 0
1252#define STV090x_WIDTH_Px_EQUA_ACCIy_FIELD 8 1250#define STV090x_WIDTH_Px_EQUA_ACCIy_FIELD 8
1253 1251
1254#define STV090x_Px_EQUAQy(__x, __y) (0xf471 - (__x - 1) * 0x200 + (__y - 1)) 1252#define STV090x_Px_EQUAQy(__x, __y) (0xf471 - (__x-1) * 0x200 + 2 * (__y-1))
1255#define STV090x_P1_EQUAQ1 STV090x_Px_EQUAQy(1, 1) 1253#define STV090x_P1_EQUAQ1 STV090x_Px_EQUAQy(1, 1)
1256#define STV090x_P1_EQUAQ2 STV090x_Px_EQUAQy(1, 2) 1254#define STV090x_P1_EQUAQ2 STV090x_Px_EQUAQy(1, 2)
1257#define STV090x_P1_EQUAQ3 STV090x_Px_EQUAQy(1, 3) 1255#define STV090x_P1_EQUAQ3 STV090x_Px_EQUAQy(1, 3)
@@ -1390,7 +1388,7 @@
1390#define STV090x_OFFST_Px_CAR2S2_16A_ALPH_E_FIELD 0 1388#define STV090x_OFFST_Px_CAR2S2_16A_ALPH_E_FIELD 0
1391#define STV090x_WIDTH_Px_CAR2S2_16A_ALPH_E_FIELD 4 1389#define STV090x_WIDTH_Px_CAR2S2_16A_ALPH_E_FIELD 4
1392 1390
1393#define STV090x_Px_ACLC2S232A(__x) (0xf499 - (__x - 1) * 0x200) 1391#define STV090x_Px_ACLC2S232A(__x) (0xf49A - (__x - 1) * 0x200)
1394#define STV090x_P1_ACLC2S232A STV090x_Px_ACLC2S232A(1) 1392#define STV090x_P1_ACLC2S232A STV090x_Px_ACLC2S232A(1)
1395#define STV090x_P2_ACLC2S232A STV090x_Px_ACLC2S232A(2) 1393#define STV090x_P2_ACLC2S232A STV090x_Px_ACLC2S232A(2)
1396#define STV090x_OFFST_Px_CAR2S2_32A_ALPH_M_FIELD 4 1394#define STV090x_OFFST_Px_CAR2S2_32A_ALPH_M_FIELD 4
@@ -1414,7 +1412,7 @@
1414#define STV090x_OFFST_Px_CAR2S2_8_BETA_E_FIELD 0 1412#define STV090x_OFFST_Px_CAR2S2_8_BETA_E_FIELD 0
1415#define STV090x_WIDTH_Px_CAR2S2_8_BETA_E_FIELD 4 1413#define STV090x_WIDTH_Px_CAR2S2_8_BETA_E_FIELD 4
1416 1414
1417#define STV090x_Px_BCLC2S216A(__x) (0xf49d - (__x - 1) * 0x200) 1415#define STV090x_Px_BCLC2S216A(__x) (0xf49e - (__x - 1) * 0x200)
1418#define STV090x_P1_BCLC2S216A STV090x_Px_BCLC2S216A(1) 1416#define STV090x_P1_BCLC2S216A STV090x_Px_BCLC2S216A(1)
1419#define STV090x_P2_BCLC2S216A STV090x_Px_BCLC2S216A(1) 1417#define STV090x_P2_BCLC2S216A STV090x_Px_BCLC2S216A(1)
1420#define STV090x_OFFST_Px_CAR2S2_16A_BETA_M_FIELD 4 1418#define STV090x_OFFST_Px_CAR2S2_16A_BETA_M_FIELD 4
@@ -1422,7 +1420,7 @@
1422#define STV090x_OFFST_Px_CAR2S2_16A_BETA_E_FIELD 0 1420#define STV090x_OFFST_Px_CAR2S2_16A_BETA_E_FIELD 0
1423#define STV090x_WIDTH_Px_CAR2S2_16A_BETA_E_FIELD 4 1421#define STV090x_WIDTH_Px_CAR2S2_16A_BETA_E_FIELD 4
1424 1422
1425#define STV090x_Px_BCLC2S232A(__x) (0xf49d - (__x - 1) * 0x200) 1423#define STV090x_Px_BCLC2S232A(__x) (0xf49f - (__x - 1) * 0x200)
1426#define STV090x_P1_BCLC2S232A STV090x_Px_BCLC2S232A(1) 1424#define STV090x_P1_BCLC2S232A STV090x_Px_BCLC2S232A(1)
1427#define STV090x_P2_BCLC2S232A STV090x_Px_BCLC2S232A(1) 1425#define STV090x_P2_BCLC2S232A STV090x_Px_BCLC2S232A(1)
1428#define STV090x_OFFST_Px_CAR2S2_32A_BETA_M_FIELD 4 1426#define STV090x_OFFST_Px_CAR2S2_32A_BETA_M_FIELD 4
@@ -1458,7 +1456,7 @@
1458#define STV090x_P1_MODCODLST1 STV090x_Px_MODCODLST1(1) 1456#define STV090x_P1_MODCODLST1 STV090x_Px_MODCODLST1(1)
1459#define STV090x_P2_MODCODLST1 STV090x_Px_MODCODLST1(2) 1457#define STV090x_P2_MODCODLST1 STV090x_Px_MODCODLST1(2)
1460#define STV090x_OFFST_Px_DIS_MODCOD29_FIELD 4 1458#define STV090x_OFFST_Px_DIS_MODCOD29_FIELD 4
1461#define STV090x_WIDTH_Px_DIS_MODCOD29T_FIELD 4 1459#define STV090x_WIDTH_Px_DIS_MODCOD29_FIELD 4
1462#define STV090x_OFFST_Px_DIS_32PSK_9_10_FIELD 0 1460#define STV090x_OFFST_Px_DIS_32PSK_9_10_FIELD 0
1463#define STV090x_WIDTH_Px_DIS_32PSK_9_10_FIELD 4 1461#define STV090x_WIDTH_Px_DIS_32PSK_9_10_FIELD 4
1464 1462
@@ -2180,7 +2178,7 @@
2180#define STV090x_WIDTH_Px_TSFIFOSPEED_STORE_FIELD 1 2178#define STV090x_WIDTH_Px_TSFIFOSPEED_STORE_FIELD 1
2181#define STV090x_OFFST_Px_DILXX_RESET_FIELD 5 2179#define STV090x_OFFST_Px_DILXX_RESET_FIELD 5
2182#define STV090x_WIDTH_Px_DILXX_RESET_FIELD 1 2180#define STV090x_WIDTH_Px_DILXX_RESET_FIELD 1
2183#define STV090x_OFFST_Px_TSSERIAL_IMPOS_FIELD 5 2181#define STV090x_OFFST_Px_TSSERIAL_IMPOS_FIELD 4
2184#define STV090x_WIDTH_Px_TSSERIAL_IMPOS_FIELD 1 2182#define STV090x_WIDTH_Px_TSSERIAL_IMPOS_FIELD 1
2185#define STV090x_OFFST_Px_SCRAMBDETECT_FIELD 1 2183#define STV090x_OFFST_Px_SCRAMBDETECT_FIELD 1
2186#define STV090x_WIDTH_Px_SCRAMBDETECT_FIELD 1 2184#define STV090x_WIDTH_Px_SCRAMBDETECT_FIELD 1
@@ -2190,7 +2188,7 @@
2190#define STV090x_P1_TSBITRATE1 STV090x_Px_TSBITRATEy(1, 1) 2188#define STV090x_P1_TSBITRATE1 STV090x_Px_TSBITRATEy(1, 1)
2191#define STV090x_P2_TSBITRATE0 STV090x_Px_TSBITRATEy(2, 0) 2189#define STV090x_P2_TSBITRATE0 STV090x_Px_TSBITRATEy(2, 0)
2192#define STV090x_P2_TSBITRATE1 STV090x_Px_TSBITRATEy(2, 1) 2190#define STV090x_P2_TSBITRATE1 STV090x_Px_TSBITRATEy(2, 1)
2193#define STV090x_OFFST_Px_TSFIFO_BITRATE_FIELD 7 2191#define STV090x_OFFST_Px_TSFIFO_BITRATE_FIELD 0
2194#define STV090x_WIDTH_Px_TSFIFO_BITRATE_FIELD 8 2192#define STV090x_WIDTH_Px_TSFIFO_BITRATE_FIELD 8
2195 2193
2196#define STV090x_Px_ERRCTRL1(__x) (0xF598 - (__x - 1) * 0x200) 2194#define STV090x_Px_ERRCTRL1(__x) (0xF598 - (__x - 1) * 0x200)
diff --git a/drivers/media/dvb/frontends/stv6110.c b/drivers/media/dvb/frontends/stv6110.c
index dcf1b21ea974..2dca7c8e5148 100644
--- a/drivers/media/dvb/frontends/stv6110.c
+++ b/drivers/media/dvb/frontends/stv6110.c
@@ -22,6 +22,7 @@
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */ 23 */
24 24
25#include <linux/slab.h>
25#include <linux/module.h> 26#include <linux/module.h>
26#include <linux/dvb/frontend.h> 27#include <linux/dvb/frontend.h>
27 28
@@ -37,6 +38,7 @@ struct stv6110_priv {
37 38
38 u32 mclk; 39 u32 mclk;
39 u8 clk_div; 40 u8 clk_div;
41 u8 gain;
40 u8 regs[8]; 42 u8 regs[8];
41}; 43};
42 44
@@ -255,7 +257,7 @@ static int stv6110_set_frequency(struct dvb_frontend *fe, u32 frequency)
255 u8 ret = 0x04; 257 u8 ret = 0x04;
256 u32 divider, ref, p, presc, i, result_freq, vco_freq; 258 u32 divider, ref, p, presc, i, result_freq, vco_freq;
257 s32 p_calc, p_calc_opt = 1000, r_div, r_div_opt = 0, p_val; 259 s32 p_calc, p_calc_opt = 1000, r_div, r_div_opt = 0, p_val;
258 s32 srate; u8 gain; 260 s32 srate;
259 261
260 dprintk("%s, freq=%d kHz, mclk=%d Hz\n", __func__, 262 dprintk("%s, freq=%d kHz, mclk=%d Hz\n", __func__,
261 frequency, priv->mclk); 263 frequency, priv->mclk);
@@ -273,15 +275,8 @@ static int stv6110_set_frequency(struct dvb_frontend *fe, u32 frequency)
273 } else 275 } else
274 srate = 15000000; 276 srate = 15000000;
275 277
276 if (srate >= 15000000)
277 gain = 3; /* +6 dB */
278 else if (srate >= 5000000)
279 gain = 3; /* +6 dB */
280 else
281 gain = 3; /* +6 dB */
282
283 priv->regs[RSTV6110_CTRL2] &= ~0x0f; 278 priv->regs[RSTV6110_CTRL2] &= ~0x0f;
284 priv->regs[RSTV6110_CTRL2] |= (gain & 0x0f); 279 priv->regs[RSTV6110_CTRL2] |= (priv->gain & 0x0f);
285 280
286 if (frequency <= 1023000) { 281 if (frequency <= 1023000) {
287 p = 1; 282 p = 1;
@@ -436,6 +431,7 @@ struct dvb_frontend *stv6110_attach(struct dvb_frontend *fe,
436 priv->i2c = i2c; 431 priv->i2c = i2c;
437 priv->mclk = config->mclk; 432 priv->mclk = config->mclk;
438 priv->clk_div = config->clk_div; 433 priv->clk_div = config->clk_div;
434 priv->gain = config->gain;
439 435
440 memcpy(&priv->regs, &reg0[1], 8); 436 memcpy(&priv->regs, &reg0[1], 8);
441 437
diff --git a/drivers/media/dvb/frontends/stv6110.h b/drivers/media/dvb/frontends/stv6110.h
index 9db2402410f6..fe71bba6a26e 100644
--- a/drivers/media/dvb/frontends/stv6110.h
+++ b/drivers/media/dvb/frontends/stv6110.h
@@ -41,6 +41,7 @@
41struct stv6110_config { 41struct stv6110_config {
42 u8 i2c_address; 42 u8 i2c_address;
43 u32 mclk; 43 u32 mclk;
44 u8 gain;
44 u8 clk_div; /* divisor value for the output clock */ 45 u8 clk_div; /* divisor value for the output clock */
45}; 46};
46 47
diff --git a/drivers/media/dvb/frontends/stv6110x.c b/drivers/media/dvb/frontends/stv6110x.c
index 3d8a2e01c9c4..dea4245f077c 100644
--- a/drivers/media/dvb/frontends/stv6110x.c
+++ b/drivers/media/dvb/frontends/stv6110x.c
@@ -23,6 +23,7 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/slab.h>
26#include <linux/string.h> 27#include <linux/string.h>
27 28
28#include "dvb_frontend.h" 29#include "dvb_frontend.h"
@@ -35,8 +36,6 @@ static unsigned int verbose;
35module_param(verbose, int, 0644); 36module_param(verbose, int, 0644);
36MODULE_PARM_DESC(verbose, "Set Verbosity level"); 37MODULE_PARM_DESC(verbose, "Set Verbosity level");
37 38
38static u8 stv6110x_regs[] = {0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e};
39
40static int stv6110x_read_reg(struct stv6110x_state *stv6110x, u8 reg, u8 *data) 39static int stv6110x_read_reg(struct stv6110x_state *stv6110x, u8 reg, u8 *data)
41{ 40{
42 int ret; 41 int ret;
@@ -58,12 +57,23 @@ static int stv6110x_read_reg(struct stv6110x_state *stv6110x, u8 reg, u8 *data)
58 return 0; 57 return 0;
59} 58}
60 59
61static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data) 60static int stv6110x_write_regs(struct stv6110x_state *stv6110x, int start, u8 data[], int len)
62{ 61{
63 int ret; 62 int ret;
64 const struct stv6110x_config *config = stv6110x->config; 63 const struct stv6110x_config *config = stv6110x->config;
65 u8 buf[] = { reg, data }; 64 u8 buf[len + 1];
66 struct i2c_msg msg = { .addr = config->addr, .flags = 0, . buf = buf, .len = 2 }; 65 struct i2c_msg msg = {
66 .addr = config->addr,
67 .flags = 0,
68 .buf = buf,
69 .len = len + 1
70 };
71
72 if (start + len > 8)
73 return -EINVAL;
74
75 buf[0] = start;
76 memcpy(&buf[1], data, len);
67 77
68 ret = i2c_transfer(stv6110x->i2c, &msg, 1); 78 ret = i2c_transfer(stv6110x->i2c, &msg, 1);
69 if (ret != 1) { 79 if (ret != 1) {
@@ -74,18 +84,21 @@ static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data)
74 return 0; 84 return 0;
75} 85}
76 86
87static int stv6110x_write_reg(struct stv6110x_state *stv6110x, u8 reg, u8 data)
88{
89 return stv6110x_write_regs(stv6110x, reg, &data, 1);
90}
91
77static int stv6110x_init(struct dvb_frontend *fe) 92static int stv6110x_init(struct dvb_frontend *fe)
78{ 93{
79 struct stv6110x_state *stv6110x = fe->tuner_priv; 94 struct stv6110x_state *stv6110x = fe->tuner_priv;
80 int ret; 95 int ret;
81 u8 i;
82 96
83 for (i = 0; i < ARRAY_SIZE(stv6110x_regs); i++) { 97 ret = stv6110x_write_regs(stv6110x, 0, stv6110x->regs,
84 ret = stv6110x_write_reg(stv6110x, i, stv6110x_regs[i]); 98 ARRAY_SIZE(stv6110x->regs));
85 if (ret < 0) { 99 if (ret < 0) {
86 dprintk(FE_ERROR, 1, "Initialization failed"); 100 dprintk(FE_ERROR, 1, "Initialization failed");
87 return -1; 101 return -1;
88 }
89 } 102 }
90 103
91 return 0; 104 return 0;
@@ -95,54 +108,56 @@ static int stv6110x_set_frequency(struct dvb_frontend *fe, u32 frequency)
95{ 108{
96 struct stv6110x_state *stv6110x = fe->tuner_priv; 109 struct stv6110x_state *stv6110x = fe->tuner_priv;
97 u32 rDiv, divider; 110 u32 rDiv, divider;
98 s32 pVal, pCalc, rDivOpt = 0; 111 s32 pVal, pCalc, rDivOpt = 0, pCalcOpt = 1000;
99 u8 i; 112 u8 i;
100 113
101 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_K, (REFCLOCK_MHz - 16)); 114 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_K, (REFCLOCK_MHz - 16));
102 115
103 if (frequency <= 1023000) { 116 if (frequency <= 1023000) {
104 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); 117 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 1);
105 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); 118 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0);
106 pVal = 40; 119 pVal = 40;
107 } else if (frequency <= 1300000) { 120 } else if (frequency <= 1300000) {
108 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 1); 121 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 1);
109 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); 122 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1);
110 pVal = 40; 123 pVal = 40;
111 } else if (frequency <= 2046000) { 124 } else if (frequency <= 2046000) {
112 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); 125 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 0);
113 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0); 126 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 0);
114 pVal = 20; 127 pVal = 20;
115 } else { 128 } else {
116 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_DIV4SEL, 0); 129 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_DIV4SEL, 0);
117 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1); 130 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_PRESC32_ON, 1);
118 pVal = 20; 131 pVal = 20;
119 } 132 }
120 133
121 for (rDiv = 0; rDiv <= 3; rDiv++) { 134 for (rDiv = 0; rDiv <= 3; rDiv++) {
122 pCalc = (REFCLOCK_kHz / 100) / R_DIV(rDiv); 135 pCalc = (REFCLOCK_kHz / 100) / R_DIV(rDiv);
123 136
124 if ((abs((s32)(pCalc - pVal))) < (abs((s32)(1000 - pVal)))) 137 if ((abs((s32)(pCalc - pVal))) < (abs((s32)(pCalcOpt - pVal))))
125 rDivOpt = rDiv; 138 rDivOpt = rDiv;
139
140 pCalcOpt = (REFCLOCK_kHz / 100) / R_DIV(rDivOpt);
126 } 141 }
127 142
128 divider = (frequency * R_DIV(rDivOpt) * pVal) / REFCLOCK_kHz; 143 divider = (frequency * R_DIV(rDivOpt) * pVal) / REFCLOCK_kHz;
129 divider = (divider + 5) / 10; 144 divider = (divider + 5) / 10;
130 145
131 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_R_DIV, rDivOpt); 146 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_R_DIV, rDivOpt);
132 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG1], TNG1_N_DIV_11_8, MSB(divider)); 147 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG1], TNG1_N_DIV_11_8, MSB(divider));
133 STV6110x_SETFIELD(stv6110x_regs[STV6110x_TNG0], TNG0_N_DIV_7_0, LSB(divider)); 148 STV6110x_SETFIELD(stv6110x->regs[STV6110x_TNG0], TNG0_N_DIV_7_0, LSB(divider));
134 149
135 /* VCO Auto calibration */ 150 /* VCO Auto calibration */
136 STV6110x_SETFIELD(stv6110x_regs[STV6110x_STAT1], STAT1_CALVCO_STRT, 1); 151 STV6110x_SETFIELD(stv6110x->regs[STV6110x_STAT1], STAT1_CALVCO_STRT, 1);
137 152
138 stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x_regs[STV6110x_CTRL1]); 153 stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x->regs[STV6110x_CTRL1]);
139 stv6110x_write_reg(stv6110x, STV6110x_TNG1, stv6110x_regs[STV6110x_TNG1]); 154 stv6110x_write_reg(stv6110x, STV6110x_TNG1, stv6110x->regs[STV6110x_TNG1]);
140 stv6110x_write_reg(stv6110x, STV6110x_TNG0, stv6110x_regs[STV6110x_TNG0]); 155 stv6110x_write_reg(stv6110x, STV6110x_TNG0, stv6110x->regs[STV6110x_TNG0]);
141 stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x_regs[STV6110x_STAT1]); 156 stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x->regs[STV6110x_STAT1]);
142 157
143 for (i = 0; i < TRIALS; i++) { 158 for (i = 0; i < TRIALS; i++) {
144 stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); 159 stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x->regs[STV6110x_STAT1]);
145 if (!STV6110x_GETFIELD(STAT1_CALVCO_STRT, stv6110x_regs[STV6110x_STAT1])) 160 if (!STV6110x_GETFIELD(STAT1_CALVCO_STRT, stv6110x->regs[STV6110x_STAT1]))
146 break; 161 break;
147 msleep(1); 162 msleep(1);
148 } 163 }
@@ -154,14 +169,14 @@ static int stv6110x_get_frequency(struct dvb_frontend *fe, u32 *frequency)
154{ 169{
155 struct stv6110x_state *stv6110x = fe->tuner_priv; 170 struct stv6110x_state *stv6110x = fe->tuner_priv;
156 171
157 stv6110x_read_reg(stv6110x, STV6110x_TNG1, &stv6110x_regs[STV6110x_TNG1]); 172 stv6110x_read_reg(stv6110x, STV6110x_TNG1, &stv6110x->regs[STV6110x_TNG1]);
158 stv6110x_read_reg(stv6110x, STV6110x_TNG0, &stv6110x_regs[STV6110x_TNG0]); 173 stv6110x_read_reg(stv6110x, STV6110x_TNG0, &stv6110x->regs[STV6110x_TNG0]);
159 174
160 *frequency = (MAKEWORD16(STV6110x_GETFIELD(TNG1_N_DIV_11_8, stv6110x_regs[STV6110x_TNG1]), 175 *frequency = (MAKEWORD16(STV6110x_GETFIELD(TNG1_N_DIV_11_8, stv6110x->regs[STV6110x_TNG1]),
161 STV6110x_GETFIELD(TNG0_N_DIV_7_0, stv6110x_regs[STV6110x_TNG0]))) * REFCLOCK_kHz; 176 STV6110x_GETFIELD(TNG0_N_DIV_7_0, stv6110x->regs[STV6110x_TNG0]))) * REFCLOCK_kHz;
162 177
163 *frequency /= (1 << (STV6110x_GETFIELD(TNG1_R_DIV, stv6110x_regs[STV6110x_TNG1]) + 178 *frequency /= (1 << (STV6110x_GETFIELD(TNG1_R_DIV, stv6110x->regs[STV6110x_TNG1]) +
164 STV6110x_GETFIELD(TNG1_DIV4SEL, stv6110x_regs[STV6110x_TNG1]))); 179 STV6110x_GETFIELD(TNG1_DIV4SEL, stv6110x->regs[STV6110x_TNG1])));
165 180
166 *frequency >>= 2; 181 *frequency >>= 2;
167 182
@@ -177,27 +192,27 @@ static int stv6110x_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth)
177 halfbw = bandwidth >> 1; 192 halfbw = bandwidth >> 1;
178 193
179 if (halfbw > 36000000) 194 if (halfbw > 36000000)
180 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, 31); /* LPF */ 195 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_CF, 31); /* LPF */
181 else if (halfbw < 5000000) 196 else if (halfbw < 5000000)
182 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, 0); /* LPF */ 197 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_CF, 0); /* LPF */
183 else 198 else
184 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_CF, ((halfbw / 1000000) - 5)); /* LPF */ 199 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_CF, ((halfbw / 1000000) - 5)); /* LPF */
185 200
186 201
187 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x0); /* cal. clk activated */ 202 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x0); /* cal. clk activated */
188 STV6110x_SETFIELD(stv6110x_regs[STV6110x_STAT1], STAT1_CALRC_STRT, 0x1); /* LPF auto cal */ 203 STV6110x_SETFIELD(stv6110x->regs[STV6110x_STAT1], STAT1_CALRC_STRT, 0x1); /* LPF auto cal */
189 204
190 stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x_regs[STV6110x_CTRL3]); 205 stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x->regs[STV6110x_CTRL3]);
191 stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x_regs[STV6110x_STAT1]); 206 stv6110x_write_reg(stv6110x, STV6110x_STAT1, stv6110x->regs[STV6110x_STAT1]);
192 207
193 for (i = 0; i < TRIALS; i++) { 208 for (i = 0; i < TRIALS; i++) {
194 stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); 209 stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x->regs[STV6110x_STAT1]);
195 if (!STV6110x_GETFIELD(STAT1_CALRC_STRT, stv6110x_regs[STV6110x_STAT1])) 210 if (!STV6110x_GETFIELD(STAT1_CALRC_STRT, stv6110x->regs[STV6110x_STAT1]))
196 break; 211 break;
197 msleep(1); 212 msleep(1);
198 } 213 }
199 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x1); /* cal. done */ 214 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL3], CTRL3_RCCLK_OFF, 0x1); /* cal. done */
200 stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x_regs[STV6110x_CTRL3]); 215 stv6110x_write_reg(stv6110x, STV6110x_CTRL3, stv6110x->regs[STV6110x_CTRL3]);
201 216
202 return 0; 217 return 0;
203} 218}
@@ -206,8 +221,8 @@ static int stv6110x_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
206{ 221{
207 struct stv6110x_state *stv6110x = fe->tuner_priv; 222 struct stv6110x_state *stv6110x = fe->tuner_priv;
208 223
209 stv6110x_read_reg(stv6110x, STV6110x_CTRL3, &stv6110x_regs[STV6110x_CTRL3]); 224 stv6110x_read_reg(stv6110x, STV6110x_CTRL3, &stv6110x->regs[STV6110x_CTRL3]);
210 *bandwidth = (STV6110x_GETFIELD(CTRL3_CF, stv6110x_regs[STV6110x_CTRL3]) + 5) * 2000000; 225 *bandwidth = (STV6110x_GETFIELD(CTRL3_CF, stv6110x->regs[STV6110x_CTRL3]) + 5) * 2000000;
211 226
212 return 0; 227 return 0;
213} 228}
@@ -220,20 +235,20 @@ static int stv6110x_set_refclock(struct dvb_frontend *fe, u32 refclock)
220 switch (refclock) { 235 switch (refclock) {
221 default: 236 default:
222 case 1: 237 case 1:
223 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0); 238 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0);
224 break; 239 break;
225 case 2: 240 case 2:
226 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1); 241 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1);
227 break; 242 break;
228 case 4: 243 case 4:
229 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2); 244 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2);
230 break; 245 break;
231 case 8: 246 case 8:
232 case 0: 247 case 0:
233 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3); 248 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3);
234 break; 249 break;
235 } 250 }
236 stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x_regs[STV6110x_CTRL2]); 251 stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x->regs[STV6110x_CTRL2]);
237 252
238 return 0; 253 return 0;
239} 254}
@@ -242,8 +257,8 @@ static int stv6110x_get_bbgain(struct dvb_frontend *fe, u32 *gain)
242{ 257{
243 struct stv6110x_state *stv6110x = fe->tuner_priv; 258 struct stv6110x_state *stv6110x = fe->tuner_priv;
244 259
245 stv6110x_read_reg(stv6110x, STV6110x_CTRL2, &stv6110x_regs[STV6110x_CTRL2]); 260 stv6110x_read_reg(stv6110x, STV6110x_CTRL2, &stv6110x->regs[STV6110x_CTRL2]);
246 *gain = 2 * STV6110x_GETFIELD(CTRL2_BBGAIN, stv6110x_regs[STV6110x_CTRL2]); 261 *gain = 2 * STV6110x_GETFIELD(CTRL2_BBGAIN, stv6110x->regs[STV6110x_CTRL2]);
247 262
248 return 0; 263 return 0;
249} 264}
@@ -252,8 +267,8 @@ static int stv6110x_set_bbgain(struct dvb_frontend *fe, u32 gain)
252{ 267{
253 struct stv6110x_state *stv6110x = fe->tuner_priv; 268 struct stv6110x_state *stv6110x = fe->tuner_priv;
254 269
255 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL2], CTRL2_BBGAIN, gain / 2); 270 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_BBGAIN, gain / 2);
256 stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x_regs[STV6110x_CTRL2]); 271 stv6110x_write_reg(stv6110x, STV6110x_CTRL2, stv6110x->regs[STV6110x_CTRL2]);
257 272
258 return 0; 273 return 0;
259} 274}
@@ -265,19 +280,19 @@ static int stv6110x_set_mode(struct dvb_frontend *fe, enum tuner_mode mode)
265 280
266 switch (mode) { 281 switch (mode) {
267 case TUNER_SLEEP: 282 case TUNER_SLEEP:
268 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_SYN, 0); 283 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_SYN, 0);
269 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_RX, 0); 284 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_RX, 0);
270 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_LPT, 0); 285 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_LPT, 0);
271 break; 286 break;
272 287
273 case TUNER_WAKE: 288 case TUNER_WAKE:
274 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_SYN, 1); 289 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_SYN, 1);
275 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_RX, 1); 290 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_RX, 1);
276 STV6110x_SETFIELD(stv6110x_regs[STV6110x_CTRL1], CTRL1_LPT, 1); 291 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL1], CTRL1_LPT, 1);
277 break; 292 break;
278 } 293 }
279 294
280 ret = stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x_regs[STV6110x_CTRL1]); 295 ret = stv6110x_write_reg(stv6110x, STV6110x_CTRL1, stv6110x->regs[STV6110x_CTRL1]);
281 if (ret < 0) { 296 if (ret < 0) {
282 dprintk(FE_ERROR, 1, "I/O Error"); 297 dprintk(FE_ERROR, 1, "I/O Error");
283 return -EIO; 298 return -EIO;
@@ -295,9 +310,9 @@ static int stv6110x_get_status(struct dvb_frontend *fe, u32 *status)
295{ 310{
296 struct stv6110x_state *stv6110x = fe->tuner_priv; 311 struct stv6110x_state *stv6110x = fe->tuner_priv;
297 312
298 stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x_regs[STV6110x_STAT1]); 313 stv6110x_read_reg(stv6110x, STV6110x_STAT1, &stv6110x->regs[STV6110x_STAT1]);
299 314
300 if (STV6110x_GETFIELD(STAT1_LOCK, stv6110x_regs[STV6110x_STAT1])) 315 if (STV6110x_GETFIELD(STAT1_LOCK, stv6110x->regs[STV6110x_STAT1]))
301 *status = TUNER_PHASELOCKED; 316 *status = TUNER_PHASELOCKED;
302 else 317 else
303 *status = 0; 318 *status = 0;
@@ -347,6 +362,8 @@ struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe,
347 struct i2c_adapter *i2c) 362 struct i2c_adapter *i2c)
348{ 363{
349 struct stv6110x_state *stv6110x; 364 struct stv6110x_state *stv6110x;
365 u8 default_regs[] = {0x07, 0x11, 0xdc, 0x85, 0x17, 0x01, 0xe6, 0x1e};
366 int ret;
350 367
351 stv6110x = kzalloc(sizeof (struct stv6110x_state), GFP_KERNEL); 368 stv6110x = kzalloc(sizeof (struct stv6110x_state), GFP_KERNEL);
352 if (stv6110x == NULL) 369 if (stv6110x == NULL)
@@ -355,6 +372,44 @@ struct stv6110x_devctl *stv6110x_attach(struct dvb_frontend *fe,
355 stv6110x->i2c = i2c; 372 stv6110x->i2c = i2c;
356 stv6110x->config = config; 373 stv6110x->config = config;
357 stv6110x->devctl = &stv6110x_ctl; 374 stv6110x->devctl = &stv6110x_ctl;
375 memcpy(stv6110x->regs, default_regs, 8);
376
377 /* setup divider */
378 switch (stv6110x->config->clk_div) {
379 default:
380 case 1:
381 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 0);
382 break;
383 case 2:
384 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 1);
385 break;
386 case 4:
387 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 2);
388 break;
389 case 8:
390 case 0:
391 STV6110x_SETFIELD(stv6110x->regs[STV6110x_CTRL2], CTRL2_CO_DIV, 3);
392 break;
393 }
394
395 if (fe->ops.i2c_gate_ctrl) {
396 ret = fe->ops.i2c_gate_ctrl(fe, 1);
397 if (ret < 0)
398 goto error;
399 }
400
401 ret = stv6110x_write_regs(stv6110x, 0, stv6110x->regs,
402 ARRAY_SIZE(stv6110x->regs));
403 if (ret < 0) {
404 dprintk(FE_ERROR, 1, "Initialization failed");
405 goto error;
406 }
407
408 if (fe->ops.i2c_gate_ctrl) {
409 ret = fe->ops.i2c_gate_ctrl(fe, 0);
410 if (ret < 0)
411 goto error;
412 }
358 413
359 fe->tuner_priv = stv6110x; 414 fe->tuner_priv = stv6110x;
360 fe->ops.tuner_ops = stv6110x_ops; 415 fe->ops.tuner_ops = stv6110x_ops;
diff --git a/drivers/media/dvb/frontends/stv6110x.h b/drivers/media/dvb/frontends/stv6110x.h
index a38257080e01..2429ae6d7847 100644
--- a/drivers/media/dvb/frontends/stv6110x.h
+++ b/drivers/media/dvb/frontends/stv6110x.h
@@ -26,6 +26,7 @@
26struct stv6110x_config { 26struct stv6110x_config {
27 u8 addr; 27 u8 addr;
28 u32 refclk; 28 u32 refclk;
29 u8 clk_div; /* divisor value for the output clock */
29}; 30};
30 31
31enum tuner_mode { 32enum tuner_mode {
diff --git a/drivers/media/dvb/frontends/stv6110x_priv.h b/drivers/media/dvb/frontends/stv6110x_priv.h
index 7260da633d49..0ec936a660a7 100644
--- a/drivers/media/dvb/frontends/stv6110x_priv.h
+++ b/drivers/media/dvb/frontends/stv6110x_priv.h
@@ -68,6 +68,7 @@
68struct stv6110x_state { 68struct stv6110x_state {
69 struct i2c_adapter *i2c; 69 struct i2c_adapter *i2c;
70 const struct stv6110x_config *config; 70 const struct stv6110x_config *config;
71 u8 regs[8];
71 72
72 struct stv6110x_devctl *devctl; 73 struct stv6110x_devctl *devctl;
73}; 74};
diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c
index 6c1dbf9288d8..6ca533ea0f0e 100644
--- a/drivers/media/dvb/frontends/tda10021.c
+++ b/drivers/media/dvb/frontends/tda10021.c
@@ -426,6 +426,10 @@ struct dvb_frontend* tda10021_attach(const struct tda1002x_config* config,
426 id = tda10021_readreg(state, 0x1a); 426 id = tda10021_readreg(state, 0x1a);
427 if ((id & 0xf0) != 0x70) goto error; 427 if ((id & 0xf0) != 0x70) goto error;
428 428
429 /* Don't claim TDA10023 */
430 if (id == 0x7d)
431 goto error;
432
429 printk("TDA10021: i2c-addr = 0x%02x, id = 0x%02x\n", 433 printk("TDA10021: i2c-addr = 0x%02x, id = 0x%02x\n",
430 state->config->demod_address, id); 434 state->config->demod_address, id);
431 435
diff --git a/drivers/media/dvb/frontends/tda665x.c b/drivers/media/dvb/frontends/tda665x.c
new file mode 100644
index 000000000000..2c1c759a4f42
--- /dev/null
+++ b/drivers/media/dvb/frontends/tda665x.c
@@ -0,0 +1,258 @@
1/*
2 TDA665x tuner driver
3 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20#include <linux/init.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/slab.h>
24
25#include "dvb_frontend.h"
26#include "tda665x.h"
27
28struct tda665x_state {
29 struct dvb_frontend *fe;
30 struct i2c_adapter *i2c;
31 const struct tda665x_config *config;
32
33 u32 frequency;
34 u32 bandwidth;
35};
36
37static int tda665x_read(struct tda665x_state *state, u8 *buf)
38{
39 const struct tda665x_config *config = state->config;
40 int err = 0;
41 struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD, .buf = buf, .len = 2 };
42
43 err = i2c_transfer(state->i2c, &msg, 1);
44 if (err != 1)
45 goto exit;
46
47 return err;
48exit:
49 printk(KERN_ERR "%s: I/O Error err=<%d>\n", __func__, err);
50 return err;
51}
52
53static int tda665x_write(struct tda665x_state *state, u8 *buf, u8 length)
54{
55 const struct tda665x_config *config = state->config;
56 int err = 0;
57 struct i2c_msg msg = { .addr = config->addr, .flags = 0, .buf = buf, .len = length };
58
59 err = i2c_transfer(state->i2c, &msg, 1);
60 if (err != 1)
61 goto exit;
62
63 return err;
64exit:
65 printk(KERN_ERR "%s: I/O Error err=<%d>\n", __func__, err);
66 return err;
67}
68
69static int tda665x_get_state(struct dvb_frontend *fe,
70 enum tuner_param param,
71 struct tuner_state *tstate)
72{
73 struct tda665x_state *state = fe->tuner_priv;
74 int err = 0;
75
76 switch (param) {
77 case DVBFE_TUNER_FREQUENCY:
78 tstate->frequency = state->frequency;
79 break;
80 case DVBFE_TUNER_BANDWIDTH:
81 break;
82 default:
83 printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param);
84 err = -EINVAL;
85 break;
86 }
87
88 return err;
89}
90
91static int tda665x_get_status(struct dvb_frontend *fe, u32 *status)
92{
93 struct tda665x_state *state = fe->tuner_priv;
94 u8 result = 0;
95 int err = 0;
96
97 *status = 0;
98
99 err = tda665x_read(state, &result);
100 if (err < 0)
101 goto exit;
102
103 if ((result >> 6) & 0x01) {
104 printk(KERN_DEBUG "%s: Tuner Phase Locked\n", __func__);
105 *status = 1;
106 }
107
108 return err;
109exit:
110 printk(KERN_ERR "%s: I/O Error\n", __func__);
111 return err;
112}
113
114static int tda665x_set_state(struct dvb_frontend *fe,
115 enum tuner_param param,
116 struct tuner_state *tstate)
117{
118 struct tda665x_state *state = fe->tuner_priv;
119 const struct tda665x_config *config = state->config;
120 u32 frequency, status = 0;
121 u8 buf[4];
122 int err = 0;
123
124 if (param & DVBFE_TUNER_FREQUENCY) {
125
126 frequency = tstate->frequency;
127 if ((frequency < config->frequency_max) || (frequency > config->frequency_min)) {
128 printk(KERN_ERR "%s: Frequency beyond limits, frequency=%d\n", __func__, frequency);
129 return -EINVAL;
130 }
131
132 frequency += config->frequency_offst;
133 frequency *= config->ref_multiplier;
134 frequency += config->ref_divider >> 1;
135 frequency /= config->ref_divider;
136
137 buf[0] = (u8) ((frequency & 0x7f00) >> 8);
138 buf[1] = (u8) (frequency & 0x00ff) >> 0;
139 buf[2] = 0x80 | 0x40 | 0x02;
140 buf[3] = 0x00;
141
142 /* restore frequency */
143 frequency = tstate->frequency;
144
145 if (frequency < 153000000) {
146 /* VHF-L */
147 buf[3] |= 0x01; /* fc, Low Band, 47 - 153 MHz */
148 if (frequency < 68000000)
149 buf[3] |= 0x40; /* 83uA */
150 if (frequency < 1040000000)
151 buf[3] |= 0x60; /* 122uA */
152 if (frequency < 1250000000)
153 buf[3] |= 0x80; /* 163uA */
154 else
155 buf[3] |= 0xa0; /* 254uA */
156 } else if (frequency < 438000000) {
157 /* VHF-H */
158 buf[3] |= 0x02; /* fc, Mid Band, 153 - 438 MHz */
159 if (frequency < 230000000)
160 buf[3] |= 0x40;
161 if (frequency < 300000000)
162 buf[3] |= 0x60;
163 else
164 buf[3] |= 0x80;
165 } else {
166 /* UHF */
167 buf[3] |= 0x04; /* fc, High Band, 438 - 862 MHz */
168 if (frequency < 470000000)
169 buf[3] |= 0x60;
170 if (frequency < 526000000)
171 buf[3] |= 0x80;
172 else
173 buf[3] |= 0xa0;
174 }
175
176 /* Set params */
177 err = tda665x_write(state, buf, 5);
178 if (err < 0)
179 goto exit;
180
181 /* sleep for some time */
182 printk(KERN_DEBUG "%s: Waiting to Phase LOCK\n", __func__);
183 msleep(20);
184 /* check status */
185 err = tda665x_get_status(fe, &status);
186 if (err < 0)
187 goto exit;
188
189 if (status == 1) {
190 printk(KERN_DEBUG "%s: Tuner Phase locked: status=%d\n", __func__, status);
191 state->frequency = frequency; /* cache successful state */
192 } else {
193 printk(KERN_ERR "%s: No Phase lock: status=%d\n", __func__, status);
194 }
195 } else {
196 printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param);
197 return -EINVAL;
198 }
199
200 return 0;
201exit:
202 printk(KERN_ERR "%s: I/O Error\n", __func__);
203 return err;
204}
205
206static int tda665x_release(struct dvb_frontend *fe)
207{
208 struct tda665x_state *state = fe->tuner_priv;
209
210 fe->tuner_priv = NULL;
211 kfree(state);
212 return 0;
213}
214
215static struct dvb_tuner_ops tda665x_ops = {
216
217 .set_state = tda665x_set_state,
218 .get_state = tda665x_get_state,
219 .get_status = tda665x_get_status,
220 .release = tda665x_release
221};
222
223struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
224 const struct tda665x_config *config,
225 struct i2c_adapter *i2c)
226{
227 struct tda665x_state *state = NULL;
228 struct dvb_tuner_info *info;
229
230 state = kzalloc(sizeof(struct tda665x_state), GFP_KERNEL);
231 if (state == NULL)
232 goto exit;
233
234 state->config = config;
235 state->i2c = i2c;
236 state->fe = fe;
237 fe->tuner_priv = state;
238 fe->ops.tuner_ops = tda665x_ops;
239 info = &fe->ops.tuner_ops.info;
240
241 memcpy(info->name, config->name, sizeof(config->name));
242 info->frequency_min = config->frequency_min;
243 info->frequency_max = config->frequency_max;
244 info->frequency_step = config->frequency_offst;
245
246 printk(KERN_DEBUG "%s: Attaching TDA665x (%s) tuner\n", __func__, info->name);
247
248 return fe;
249
250exit:
251 kfree(state);
252 return NULL;
253}
254EXPORT_SYMBOL(tda665x_attach);
255
256MODULE_DESCRIPTION("TDA665x driver");
257MODULE_AUTHOR("Manu Abraham");
258MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/tda665x.h b/drivers/media/dvb/frontends/tda665x.h
new file mode 100644
index 000000000000..ec7927aa75ae
--- /dev/null
+++ b/drivers/media/dvb/frontends/tda665x.h
@@ -0,0 +1,52 @@
1/*
2 TDA665x tuner driver
3 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20#ifndef __TDA665x_H
21#define __TDA665x_H
22
23struct tda665x_config {
24 char name[128];
25
26 u8 addr;
27 u32 frequency_min;
28 u32 frequency_max;
29 u32 frequency_offst;
30 u32 ref_multiplier;
31 u32 ref_divider;
32};
33
34#if defined(CONFIG_DVB_TDA665x) || (defined(CONFIG_DVB_TDA665x_MODULE) && defined(MODULE))
35
36extern struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
37 const struct tda665x_config *config,
38 struct i2c_adapter *i2c);
39
40#else
41
42static inline struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
43 const struct tda665x_config *config,
44 struct i2c_adapter *i2c)
45{
46 printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__);
47 return NULL;
48}
49
50#endif /* CONFIG_DVB_TDA665x */
51
52#endif /* __TDA665x_H */
diff --git a/drivers/media/dvb/frontends/tda8261.c b/drivers/media/dvb/frontends/tda8261.c
index 320c3c36d8b2..1742056a34e8 100644
--- a/drivers/media/dvb/frontends/tda8261.c
+++ b/drivers/media/dvb/frontends/tda8261.c
@@ -21,6 +21,7 @@
21#include <linux/init.h> 21#include <linux/init.h>
22#include <linux/kernel.h> 22#include <linux/kernel.h>
23#include <linux/module.h> 23#include <linux/module.h>
24#include <linux/slab.h>
24 25
25#include "dvb_frontend.h" 26#include "dvb_frontend.h"
26#include "tda8261.h" 27#include "tda8261.h"
@@ -39,7 +40,7 @@ static int tda8261_read(struct tda8261_state *state, u8 *buf)
39{ 40{
40 const struct tda8261_config *config = state->config; 41 const struct tda8261_config *config = state->config;
41 int err = 0; 42 int err = 0;
42 struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD,.buf = buf, .len = 2 }; 43 struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD,.buf = buf, .len = 1 };
43 44
44 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) 45 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1)
45 printk("%s: read error, err=%d\n", __func__, err); 46 printk("%s: read error, err=%d\n", __func__, err);
diff --git a/drivers/media/dvb/frontends/tda826x.c b/drivers/media/dvb/frontends/tda826x.c
index a051554b5e25..06c94800b940 100644
--- a/drivers/media/dvb/frontends/tda826x.c
+++ b/drivers/media/dvb/frontends/tda826x.c
@@ -20,6 +20,7 @@
20 20
21 */ 21 */
22 22
23#include <linux/slab.h>
23#include <linux/module.h> 24#include <linux/module.h>
24#include <linux/dvb/frontend.h> 25#include <linux/dvb/frontend.h>
25#include <asm/types.h> 26#include <asm/types.h>
diff --git a/drivers/media/dvb/frontends/tua6100.c b/drivers/media/dvb/frontends/tua6100.c
index 1790baee014c..bcb95c2ef296 100644
--- a/drivers/media/dvb/frontends/tua6100.c
+++ b/drivers/media/dvb/frontends/tua6100.c
@@ -28,6 +28,7 @@
28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 */ 29 */
30 30
31#include <linux/slab.h>
31#include <linux/module.h> 32#include <linux/module.h>
32#include <linux/dvb/frontend.h> 33#include <linux/dvb/frontend.h>
33#include <asm/types.h> 34#include <asm/types.h>
diff --git a/drivers/media/dvb/frontends/zl10036.c b/drivers/media/dvb/frontends/zl10036.c
index 4e814ff22b23..4627f491656b 100644
--- a/drivers/media/dvb/frontends/zl10036.c
+++ b/drivers/media/dvb/frontends/zl10036.c
@@ -29,6 +29,7 @@
29 29
30#include <linux/module.h> 30#include <linux/module.h>
31#include <linux/dvb/frontend.h> 31#include <linux/dvb/frontend.h>
32#include <linux/slab.h>
32#include <linux/types.h> 33#include <linux/types.h>
33 34
34#include "zl10036.h" 35#include "zl10036.h"
@@ -411,7 +412,7 @@ static int zl10036_init_regs(struct zl10036_state *state)
411 state->bf = 0xff; 412 state->bf = 0xff;
412 413
413 if (!state->config->rf_loop_enable) 414 if (!state->config->rf_loop_enable)
414 zl10036_init_tab[1][2] |= 0x01; 415 zl10036_init_tab[1][0] |= 0x01;
415 416
416 deb_info("%s\n", __func__); 417 deb_info("%s\n", __func__);
417 418
diff --git a/drivers/media/dvb/frontends/zl10039.c b/drivers/media/dvb/frontends/zl10039.c
index 11b29cb883e6..c085e58a94bf 100644
--- a/drivers/media/dvb/frontends/zl10039.c
+++ b/drivers/media/dvb/frontends/zl10039.c
@@ -287,7 +287,6 @@ struct dvb_frontend *zl10039_attach(struct dvb_frontend *fe,
287 break; 287 break;
288 default: 288 default:
289 dprintk("Chip ID=%x does not match a known type\n", state->id); 289 dprintk("Chip ID=%x does not match a known type\n", state->id);
290 break;
291 goto error; 290 goto error;
292 } 291 }
293 292
diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
new file mode 100644
index 000000000000..f7b72a32adf3
--- /dev/null
+++ b/drivers/media/dvb/mantis/Kconfig
@@ -0,0 +1,32 @@
1config MANTIS_CORE
2 tristate "Mantis/Hopper PCI bridge based devices"
3 depends on PCI && I2C && INPUT
4
5 help
6 Support for PCI cards based on the Mantis and Hopper PCi bridge.
7
8 Say Y if you own such a device and want to use it.
9
10config DVB_MANTIS
11 tristate "MANTIS based cards"
12 depends on MANTIS_CORE && DVB_CORE && PCI && I2C
13 select DVB_MB86A16
14 select DVB_ZL10353
15 select DVB_STV0299
16 select DVB_PLL
17 help
18 Support for PCI cards based on the Mantis PCI bridge.
19 Say Y when you have a Mantis based DVB card and want to use it.
20
21 If unsure say N.
22
23config DVB_HOPPER
24 tristate "HOPPER based cards"
25 depends on MANTIS_CORE && DVB_CORE && PCI && I2C
26 select DVB_ZL10353
27 select DVB_PLL
28 help
29 Support for PCI cards based on the Hopper PCI bridge.
30 Say Y when you have a Hopper based DVB card and want to use it.
31
32 If unsure say N
diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
new file mode 100644
index 000000000000..98dc5cd258ac
--- /dev/null
+++ b/drivers/media/dvb/mantis/Makefile
@@ -0,0 +1,28 @@
1mantis_core-objs := mantis_ioc.o \
2 mantis_uart.o \
3 mantis_dma.o \
4 mantis_pci.o \
5 mantis_i2c.o \
6 mantis_dvb.o \
7 mantis_evm.o \
8 mantis_hif.o \
9 mantis_ca.o \
10 mantis_pcmcia.o \
11 mantis_input.o
12
13mantis-objs := mantis_cards.o \
14 mantis_vp1033.o \
15 mantis_vp1034.o \
16 mantis_vp1041.o \
17 mantis_vp2033.o \
18 mantis_vp2040.o \
19 mantis_vp3030.o
20
21hopper-objs := hopper_cards.o \
22 hopper_vp3028.o
23
24obj-$(CONFIG_MANTIS_CORE) += mantis_core.o
25obj-$(CONFIG_DVB_MANTIS) += mantis.o
26obj-$(CONFIG_DVB_HOPPER) += hopper.o
27
28EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
new file mode 100644
index 000000000000..09e9fc785189
--- /dev/null
+++ b/drivers/media/dvb/mantis/hopper_cards.c
@@ -0,0 +1,276 @@
1/*
2 Hopper PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/module.h>
22#include <linux/moduleparam.h>
23#include <linux/kernel.h>
24#include <linux/pci.h>
25#include <linux/slab.h>
26#include <asm/irq.h>
27#include <linux/interrupt.h>
28
29#include "dmxdev.h"
30#include "dvbdev.h"
31#include "dvb_demux.h"
32#include "dvb_frontend.h"
33#include "dvb_net.h"
34
35#include "mantis_common.h"
36#include "hopper_vp3028.h"
37#include "mantis_dma.h"
38#include "mantis_dvb.h"
39#include "mantis_uart.h"
40#include "mantis_ioc.h"
41#include "mantis_pci.h"
42#include "mantis_i2c.h"
43#include "mantis_reg.h"
44
45static unsigned int verbose;
46module_param(verbose, int, 0644);
47MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
48
49#define DRIVER_NAME "Hopper"
50
51static char *label[10] = {
52 "DMA",
53 "IRQ-0",
54 "IRQ-1",
55 "OCERR",
56 "PABRT",
57 "RIPRR",
58 "PPERR",
59 "FTRGT",
60 "RISCI",
61 "RACK"
62};
63
64static int devs;
65
66static irqreturn_t hopper_irq_handler(int irq, void *dev_id)
67{
68 u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
69 u32 rst_stat = 0, rst_mask = 0;
70
71 struct mantis_pci *mantis;
72 struct mantis_ca *ca;
73
74 mantis = (struct mantis_pci *) dev_id;
75 if (unlikely(mantis == NULL)) {
76 dprintk(MANTIS_ERROR, 1, "Mantis == NULL");
77 return IRQ_NONE;
78 }
79 ca = mantis->mantis_ca;
80
81 stat = mmread(MANTIS_INT_STAT);
82 mask = mmread(MANTIS_INT_MASK);
83 mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
84 if (!(stat & mask))
85 return IRQ_NONE;
86
87 rst_mask = MANTIS_GPIF_WRACK |
88 MANTIS_GPIF_OTHERR |
89 MANTIS_SBUF_WSTO |
90 MANTIS_GPIF_EXTIRQ;
91
92 rst_stat = mmread(MANTIS_GPIF_STATUS);
93 rst_stat &= rst_mask;
94 mmwrite(rst_stat, MANTIS_GPIF_STATUS);
95
96 mantis->mantis_int_stat = stat;
97 mantis->mantis_int_mask = mask;
98 dprintk(MANTIS_DEBUG, 0, "\n-- Stat=<%02x> Mask=<%02x> --", stat, mask);
99 if (stat & MANTIS_INT_RISCEN) {
100 dprintk(MANTIS_DEBUG, 0, "<%s>", label[0]);
101 }
102 if (stat & MANTIS_INT_IRQ0) {
103 dprintk(MANTIS_DEBUG, 0, "<%s>", label[1]);
104 mantis->gpif_status = rst_stat;
105 wake_up(&ca->hif_write_wq);
106 schedule_work(&ca->hif_evm_work);
107 }
108 if (stat & MANTIS_INT_IRQ1) {
109 dprintk(MANTIS_DEBUG, 0, "<%s>", label[2]);
110 schedule_work(&mantis->uart_work);
111 }
112 if (stat & MANTIS_INT_OCERR) {
113 dprintk(MANTIS_DEBUG, 0, "<%s>", label[3]);
114 }
115 if (stat & MANTIS_INT_PABORT) {
116 dprintk(MANTIS_DEBUG, 0, "<%s>", label[4]);
117 }
118 if (stat & MANTIS_INT_RIPERR) {
119 dprintk(MANTIS_DEBUG, 0, "<%s>", label[5]);
120 }
121 if (stat & MANTIS_INT_PPERR) {
122 dprintk(MANTIS_DEBUG, 0, "<%s>", label[6]);
123 }
124 if (stat & MANTIS_INT_FTRGT) {
125 dprintk(MANTIS_DEBUG, 0, "<%s>", label[7]);
126 }
127 if (stat & MANTIS_INT_RISCI) {
128 dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]);
129 mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
130 tasklet_schedule(&mantis->tasklet);
131 }
132 if (stat & MANTIS_INT_I2CDONE) {
133 dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]);
134 wake_up(&mantis->i2c_wq);
135 }
136 mmwrite(stat, MANTIS_INT_STAT);
137 stat &= ~(MANTIS_INT_RISCEN | MANTIS_INT_I2CDONE |
138 MANTIS_INT_I2CRACK | MANTIS_INT_PCMCIA7 |
139 MANTIS_INT_PCMCIA6 | MANTIS_INT_PCMCIA5 |
140 MANTIS_INT_PCMCIA4 | MANTIS_INT_PCMCIA3 |
141 MANTIS_INT_PCMCIA2 | MANTIS_INT_PCMCIA1 |
142 MANTIS_INT_PCMCIA0 | MANTIS_INT_IRQ1 |
143 MANTIS_INT_IRQ0 | MANTIS_INT_OCERR |
144 MANTIS_INT_PABORT | MANTIS_INT_RIPERR |
145 MANTIS_INT_PPERR | MANTIS_INT_FTRGT |
146 MANTIS_INT_RISCI);
147
148 if (stat)
149 dprintk(MANTIS_DEBUG, 0, "<Unknown> Stat=<%02x> Mask=<%02x>", stat, mask);
150
151 dprintk(MANTIS_DEBUG, 0, "\n");
152 return IRQ_HANDLED;
153}
154
155static int __devinit hopper_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
156{
157 struct mantis_pci *mantis;
158 struct mantis_hwconfig *config;
159 int err = 0;
160
161 mantis = kzalloc(sizeof(struct mantis_pci), GFP_KERNEL);
162 if (mantis == NULL) {
163 printk(KERN_ERR "%s ERROR: Out of memory\n", __func__);
164 err = -ENOMEM;
165 goto fail0;
166 }
167
168 mantis->num = devs;
169 mantis->verbose = verbose;
170 mantis->pdev = pdev;
171 config = (struct mantis_hwconfig *) pci_id->driver_data;
172 config->irq_handler = &hopper_irq_handler;
173 mantis->hwconfig = config;
174
175 err = mantis_pci_init(mantis);
176 if (err) {
177 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI initialization failed <%d>", err);
178 goto fail1;
179 }
180
181 err = mantis_stream_control(mantis, STREAM_TO_HIF);
182 if (err < 0) {
183 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis stream control failed <%d>", err);
184 goto fail1;
185 }
186
187 err = mantis_i2c_init(mantis);
188 if (err < 0) {
189 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C initialization failed <%d>", err);
190 goto fail2;
191 }
192
193 err = mantis_get_mac(mantis);
194 if (err < 0) {
195 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis MAC address read failed <%d>", err);
196 goto fail2;
197 }
198
199 err = mantis_dma_init(mantis);
200 if (err < 0) {
201 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA initialization failed <%d>", err);
202 goto fail3;
203 }
204
205 err = mantis_dvb_init(mantis);
206 if (err < 0) {
207 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB initialization failed <%d>", err);
208 goto fail4;
209 }
210 devs++;
211
212 return err;
213
214fail4:
215 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
216 mantis_dma_exit(mantis);
217
218fail3:
219 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C exit! <%d>", err);
220 mantis_i2c_exit(mantis);
221
222fail2:
223 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI exit! <%d>", err);
224 mantis_pci_exit(mantis);
225
226fail1:
227 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis free! <%d>", err);
228 kfree(mantis);
229
230fail0:
231 return err;
232}
233
234static void __devexit hopper_pci_remove(struct pci_dev *pdev)
235{
236 struct mantis_pci *mantis = pci_get_drvdata(pdev);
237
238 if (mantis) {
239 mantis_dvb_exit(mantis);
240 mantis_dma_exit(mantis);
241 mantis_i2c_exit(mantis);
242 mantis_pci_exit(mantis);
243 kfree(mantis);
244 }
245 return;
246
247}
248
249static struct pci_device_id hopper_pci_table[] = {
250 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_3028_DVB_T, &vp3028_config),
251 { }
252};
253
254static struct pci_driver hopper_pci_driver = {
255 .name = DRIVER_NAME,
256 .id_table = hopper_pci_table,
257 .probe = hopper_pci_probe,
258 .remove = hopper_pci_remove,
259};
260
261static int __devinit hopper_init(void)
262{
263 return pci_register_driver(&hopper_pci_driver);
264}
265
266static void __devexit hopper_exit(void)
267{
268 return pci_unregister_driver(&hopper_pci_driver);
269}
270
271module_init(hopper_init);
272module_exit(hopper_exit);
273
274MODULE_DESCRIPTION("HOPPER driver");
275MODULE_AUTHOR("Manu Abraham");
276MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/mantis/hopper_vp3028.c b/drivers/media/dvb/mantis/hopper_vp3028.c
new file mode 100644
index 000000000000..96674c78e86b
--- /dev/null
+++ b/drivers/media/dvb/mantis/hopper_vp3028.c
@@ -0,0 +1,88 @@
1/*
2 Hopper VP-3028 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "zl10353.h"
32#include "mantis_common.h"
33#include "mantis_ioc.h"
34#include "mantis_dvb.h"
35#include "hopper_vp3028.h"
36
37struct zl10353_config hopper_vp3028_config = {
38 .demod_address = 0x0f,
39};
40
41#define MANTIS_MODEL_NAME "VP-3028"
42#define MANTIS_DEV_TYPE "DVB-T"
43
44static int vp3028_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
45{
46 struct i2c_adapter *adapter = &mantis->adapter;
47 struct mantis_hwconfig *config = mantis->hwconfig;
48 int err = 0;
49
50 gpio_set_bits(mantis, config->reset, 0);
51 msleep(100);
52 err = mantis_frontend_power(mantis, POWER_ON);
53 msleep(100);
54 gpio_set_bits(mantis, config->reset, 1);
55
56 err = mantis_frontend_power(mantis, POWER_ON);
57 if (err == 0) {
58 msleep(250);
59 dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
60 fe = zl10353_attach(&hopper_vp3028_config, adapter);
61
62 if (!fe)
63 return -1;
64 } else {
65 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
66 adapter->name,
67 err);
68
69 return -EIO;
70 }
71 dprintk(MANTIS_ERROR, 1, "Done!");
72
73 return 0;
74}
75
76struct mantis_hwconfig vp3028_config = {
77 .model_name = MANTIS_MODEL_NAME,
78 .dev_type = MANTIS_DEV_TYPE,
79 .ts_size = MANTIS_TS_188,
80
81 .baud_rate = MANTIS_BAUD_9600,
82 .parity = MANTIS_PARITY_NONE,
83 .bytes = 0,
84
85 .frontend_init = vp3028_frontend_init,
86 .power = GPIF_A00,
87 .reset = GPIF_A03,
88};
diff --git a/drivers/media/dvb/mantis/hopper_vp3028.h b/drivers/media/dvb/mantis/hopper_vp3028.h
new file mode 100644
index 000000000000..57239498bc87
--- /dev/null
+++ b/drivers/media/dvb/mantis/hopper_vp3028.h
@@ -0,0 +1,30 @@
1/*
2 Hopper VP-3028 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP3028_H
22#define __MANTIS_VP3028_H
23
24#include "mantis_common.h"
25
26#define MANTIS_VP_3028_DVB_T 0x0028
27
28extern struct mantis_hwconfig vp3028_config;
29
30#endif /* __MANTIS_VP3028_H */
diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
new file mode 100644
index 000000000000..330216febd78
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_ca.c
@@ -0,0 +1,208 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/slab.h>
23#include <linux/sched.h>
24#include <linux/interrupt.h>
25
26#include "dmxdev.h"
27#include "dvbdev.h"
28#include "dvb_demux.h"
29#include "dvb_frontend.h"
30#include "dvb_net.h"
31
32#include "mantis_common.h"
33#include "mantis_link.h"
34#include "mantis_hif.h"
35#include "mantis_reg.h"
36
37#include "mantis_ca.h"
38
39static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
40{
41 struct mantis_ca *ca = en50221->data;
42 struct mantis_pci *mantis = ca->ca_priv;
43
44 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
45
46 if (slot != 0)
47 return -EINVAL;
48
49 return mantis_hif_read_mem(ca, addr);
50}
51
52static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr, u8 data)
53{
54 struct mantis_ca *ca = en50221->data;
55 struct mantis_pci *mantis = ca->ca_priv;
56
57 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
58
59 if (slot != 0)
60 return -EINVAL;
61
62 return mantis_hif_write_mem(ca, addr, data);
63}
64
65static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
66{
67 struct mantis_ca *ca = en50221->data;
68 struct mantis_pci *mantis = ca->ca_priv;
69
70 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
71
72 if (slot != 0)
73 return -EINVAL;
74
75 return mantis_hif_read_iom(ca, addr);
76}
77
78static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr, u8 data)
79{
80 struct mantis_ca *ca = en50221->data;
81 struct mantis_pci *mantis = ca->ca_priv;
82
83 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
84
85 if (slot != 0)
86 return -EINVAL;
87
88 return mantis_hif_write_iom(ca, addr, data);
89}
90
91static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
92{
93 struct mantis_ca *ca = en50221->data;
94 struct mantis_pci *mantis = ca->ca_priv;
95
96 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Slot RESET", slot);
97 udelay(500); /* Wait.. */
98 mmwrite(0xda, MANTIS_PCMCIA_RESET); /* Leading edge assert */
99 udelay(500);
100 mmwrite(0x00, MANTIS_PCMCIA_RESET); /* Trailing edge deassert */
101 msleep(1000);
102 dvb_ca_en50221_camready_irq(&ca->en50221, 0);
103
104 return 0;
105}
106
107static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
108{
109 struct mantis_ca *ca = en50221->data;
110 struct mantis_pci *mantis = ca->ca_priv;
111
112 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Slot shutdown", slot);
113
114 return 0;
115}
116
117static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
118{
119 struct mantis_ca *ca = en50221->data;
120 struct mantis_pci *mantis = ca->ca_priv;
121
122 dprintk(MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
123/* mantis_set_direction(mantis, 1); */ /* Enable TS through CAM */
124
125 return 0;
126}
127
128static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
129{
130 struct mantis_ca *ca = en50221->data;
131 struct mantis_pci *mantis = ca->ca_priv;
132
133 dprintk(MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
134
135 if (ca->slot_state == MODULE_INSERTED) {
136 dprintk(MANTIS_DEBUG, 1, "CA Module present and ready");
137 return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
138 } else {
139 dprintk(MANTIS_DEBUG, 1, "CA Module not present or not ready");
140 }
141
142 return 0;
143}
144
145int mantis_ca_init(struct mantis_pci *mantis)
146{
147 struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
148 struct mantis_ca *ca;
149 int ca_flags = 0, result;
150
151 dprintk(MANTIS_DEBUG, 1, "Initializing Mantis CA");
152 ca = kzalloc(sizeof(struct mantis_ca), GFP_KERNEL);
153 if (!ca) {
154 dprintk(MANTIS_ERROR, 1, "Out of memory!, exiting ..");
155 result = -ENOMEM;
156 goto err;
157 }
158
159 ca->ca_priv = mantis;
160 mantis->mantis_ca = ca;
161 ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE;
162 /* register CA interface */
163 ca->en50221.owner = THIS_MODULE;
164 ca->en50221.read_attribute_mem = mantis_ca_read_attr_mem;
165 ca->en50221.write_attribute_mem = mantis_ca_write_attr_mem;
166 ca->en50221.read_cam_control = mantis_ca_read_cam_ctl;
167 ca->en50221.write_cam_control = mantis_ca_write_cam_ctl;
168 ca->en50221.slot_reset = mantis_ca_slot_reset;
169 ca->en50221.slot_shutdown = mantis_ca_slot_shutdown;
170 ca->en50221.slot_ts_enable = mantis_ts_control;
171 ca->en50221.poll_slot_status = mantis_slot_status;
172 ca->en50221.data = ca;
173
174 mutex_init(&ca->ca_lock);
175
176 init_waitqueue_head(&ca->hif_data_wq);
177 init_waitqueue_head(&ca->hif_opdone_wq);
178 init_waitqueue_head(&ca->hif_write_wq);
179
180 dprintk(MANTIS_ERROR, 1, "Registering EN50221 device");
181 result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1);
182 if (result != 0) {
183 dprintk(MANTIS_ERROR, 1, "EN50221: Initialization failed <%d>", result);
184 goto err;
185 }
186 dprintk(MANTIS_ERROR, 1, "Registered EN50221 device");
187 mantis_evmgr_init(ca);
188 return 0;
189err:
190 kfree(ca);
191 return result;
192}
193EXPORT_SYMBOL_GPL(mantis_ca_init);
194
195void mantis_ca_exit(struct mantis_pci *mantis)
196{
197 struct mantis_ca *ca = mantis->mantis_ca;
198
199 dprintk(MANTIS_DEBUG, 1, "Mantis CA exit");
200
201 mantis_evmgr_exit(ca);
202 dprintk(MANTIS_ERROR, 1, "Unregistering EN50221 device");
203 if (ca)
204 dvb_ca_en50221_release(&ca->en50221);
205
206 kfree(ca);
207}
208EXPORT_SYMBOL_GPL(mantis_ca_exit);
diff --git a/drivers/media/dvb/mantis/mantis_ca.h b/drivers/media/dvb/mantis/mantis_ca.h
new file mode 100644
index 000000000000..dc63e55f7eca
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_ca.h
@@ -0,0 +1,27 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_CA_H
22#define __MANTIS_CA_H
23
24extern int mantis_ca_init(struct mantis_pci *mantis);
25extern void mantis_ca_exit(struct mantis_pci *mantis);
26
27#endif /* __MANTIS_CA_H */
diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
new file mode 100644
index 000000000000..cf4b39ffdaad
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_cards.c
@@ -0,0 +1,306 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/module.h>
22#include <linux/moduleparam.h>
23#include <linux/kernel.h>
24#include <linux/pci.h>
25#include <linux/slab.h>
26#include <asm/irq.h>
27#include <linux/interrupt.h>
28
29#include "dmxdev.h"
30#include "dvbdev.h"
31#include "dvb_demux.h"
32#include "dvb_frontend.h"
33#include "dvb_net.h"
34
35#include "mantis_common.h"
36
37#include "mantis_vp1033.h"
38#include "mantis_vp1034.h"
39#include "mantis_vp1041.h"
40#include "mantis_vp2033.h"
41#include "mantis_vp2040.h"
42#include "mantis_vp3030.h"
43
44#include "mantis_dma.h"
45#include "mantis_ca.h"
46#include "mantis_dvb.h"
47#include "mantis_uart.h"
48#include "mantis_ioc.h"
49#include "mantis_pci.h"
50#include "mantis_i2c.h"
51#include "mantis_reg.h"
52
53static unsigned int verbose;
54module_param(verbose, int, 0644);
55MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
56
57static int devs;
58
59#define DRIVER_NAME "Mantis"
60
61static char *label[10] = {
62 "DMA",
63 "IRQ-0",
64 "IRQ-1",
65 "OCERR",
66 "PABRT",
67 "RIPRR",
68 "PPERR",
69 "FTRGT",
70 "RISCI",
71 "RACK"
72};
73
74static irqreturn_t mantis_irq_handler(int irq, void *dev_id)
75{
76 u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
77 u32 rst_stat = 0, rst_mask = 0;
78
79 struct mantis_pci *mantis;
80 struct mantis_ca *ca;
81
82 mantis = (struct mantis_pci *) dev_id;
83 if (unlikely(mantis == NULL)) {
84 dprintk(MANTIS_ERROR, 1, "Mantis == NULL");
85 return IRQ_NONE;
86 }
87 ca = mantis->mantis_ca;
88
89 stat = mmread(MANTIS_INT_STAT);
90 mask = mmread(MANTIS_INT_MASK);
91 mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
92 if (!(stat & mask))
93 return IRQ_NONE;
94
95 rst_mask = MANTIS_GPIF_WRACK |
96 MANTIS_GPIF_OTHERR |
97 MANTIS_SBUF_WSTO |
98 MANTIS_GPIF_EXTIRQ;
99
100 rst_stat = mmread(MANTIS_GPIF_STATUS);
101 rst_stat &= rst_mask;
102 mmwrite(rst_stat, MANTIS_GPIF_STATUS);
103
104 mantis->mantis_int_stat = stat;
105 mantis->mantis_int_mask = mask;
106 dprintk(MANTIS_DEBUG, 0, "\n-- Stat=<%02x> Mask=<%02x> --", stat, mask);
107 if (stat & MANTIS_INT_RISCEN) {
108 dprintk(MANTIS_DEBUG, 0, "<%s>", label[0]);
109 }
110 if (stat & MANTIS_INT_IRQ0) {
111 dprintk(MANTIS_DEBUG, 0, "<%s>", label[1]);
112 mantis->gpif_status = rst_stat;
113 wake_up(&ca->hif_write_wq);
114 schedule_work(&ca->hif_evm_work);
115 }
116 if (stat & MANTIS_INT_IRQ1) {
117 dprintk(MANTIS_DEBUG, 0, "<%s>", label[2]);
118 schedule_work(&mantis->uart_work);
119 }
120 if (stat & MANTIS_INT_OCERR) {
121 dprintk(MANTIS_DEBUG, 0, "<%s>", label[3]);
122 }
123 if (stat & MANTIS_INT_PABORT) {
124 dprintk(MANTIS_DEBUG, 0, "<%s>", label[4]);
125 }
126 if (stat & MANTIS_INT_RIPERR) {
127 dprintk(MANTIS_DEBUG, 0, "<%s>", label[5]);
128 }
129 if (stat & MANTIS_INT_PPERR) {
130 dprintk(MANTIS_DEBUG, 0, "<%s>", label[6]);
131 }
132 if (stat & MANTIS_INT_FTRGT) {
133 dprintk(MANTIS_DEBUG, 0, "<%s>", label[7]);
134 }
135 if (stat & MANTIS_INT_RISCI) {
136 dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]);
137 mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
138 tasklet_schedule(&mantis->tasklet);
139 }
140 if (stat & MANTIS_INT_I2CDONE) {
141 dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]);
142 wake_up(&mantis->i2c_wq);
143 }
144 mmwrite(stat, MANTIS_INT_STAT);
145 stat &= ~(MANTIS_INT_RISCEN | MANTIS_INT_I2CDONE |
146 MANTIS_INT_I2CRACK | MANTIS_INT_PCMCIA7 |
147 MANTIS_INT_PCMCIA6 | MANTIS_INT_PCMCIA5 |
148 MANTIS_INT_PCMCIA4 | MANTIS_INT_PCMCIA3 |
149 MANTIS_INT_PCMCIA2 | MANTIS_INT_PCMCIA1 |
150 MANTIS_INT_PCMCIA0 | MANTIS_INT_IRQ1 |
151 MANTIS_INT_IRQ0 | MANTIS_INT_OCERR |
152 MANTIS_INT_PABORT | MANTIS_INT_RIPERR |
153 MANTIS_INT_PPERR | MANTIS_INT_FTRGT |
154 MANTIS_INT_RISCI);
155
156 if (stat)
157 dprintk(MANTIS_DEBUG, 0, "<Unknown> Stat=<%02x> Mask=<%02x>", stat, mask);
158
159 dprintk(MANTIS_DEBUG, 0, "\n");
160 return IRQ_HANDLED;
161}
162
163static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
164{
165 struct mantis_pci *mantis;
166 struct mantis_hwconfig *config;
167 int err = 0;
168
169 mantis = kzalloc(sizeof(struct mantis_pci), GFP_KERNEL);
170 if (mantis == NULL) {
171 printk(KERN_ERR "%s ERROR: Out of memory\n", __func__);
172 err = -ENOMEM;
173 goto fail0;
174 }
175
176 mantis->num = devs;
177 mantis->verbose = verbose;
178 mantis->pdev = pdev;
179 config = (struct mantis_hwconfig *) pci_id->driver_data;
180 config->irq_handler = &mantis_irq_handler;
181 mantis->hwconfig = config;
182
183 err = mantis_pci_init(mantis);
184 if (err) {
185 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI initialization failed <%d>", err);
186 goto fail1;
187 }
188
189 err = mantis_stream_control(mantis, STREAM_TO_HIF);
190 if (err < 0) {
191 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis stream control failed <%d>", err);
192 goto fail1;
193 }
194
195 err = mantis_i2c_init(mantis);
196 if (err < 0) {
197 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C initialization failed <%d>", err);
198 goto fail2;
199 }
200
201 err = mantis_get_mac(mantis);
202 if (err < 0) {
203 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis MAC address read failed <%d>", err);
204 goto fail2;
205 }
206
207 err = mantis_dma_init(mantis);
208 if (err < 0) {
209 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA initialization failed <%d>", err);
210 goto fail3;
211 }
212
213 err = mantis_dvb_init(mantis);
214 if (err < 0) {
215 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB initialization failed <%d>", err);
216 goto fail4;
217 }
218 err = mantis_uart_init(mantis);
219 if (err < 0) {
220 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART initialization failed <%d>", err);
221 goto fail6;
222 }
223
224 devs++;
225
226 return err;
227
228
229 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART exit! <%d>", err);
230 mantis_uart_exit(mantis);
231
232fail6:
233fail4:
234 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
235 mantis_dma_exit(mantis);
236
237fail3:
238 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C exit! <%d>", err);
239 mantis_i2c_exit(mantis);
240
241fail2:
242 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI exit! <%d>", err);
243 mantis_pci_exit(mantis);
244
245fail1:
246 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis free! <%d>", err);
247 kfree(mantis);
248
249fail0:
250 return err;
251}
252
253static void __devexit mantis_pci_remove(struct pci_dev *pdev)
254{
255 struct mantis_pci *mantis = pci_get_drvdata(pdev);
256
257 if (mantis) {
258
259 mantis_uart_exit(mantis);
260 mantis_dvb_exit(mantis);
261 mantis_dma_exit(mantis);
262 mantis_i2c_exit(mantis);
263 mantis_pci_exit(mantis);
264 kfree(mantis);
265 }
266 return;
267}
268
269static struct pci_device_id mantis_pci_table[] = {
270 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_1033_DVB_S, &vp1033_config),
271 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_1034_DVB_S, &vp1034_config),
272 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_1041_DVB_S2, &vp1041_config),
273 MAKE_ENTRY(TECHNISAT, SKYSTAR_HD2_10, &vp1041_config),
274 MAKE_ENTRY(TECHNISAT, SKYSTAR_HD2_20, &vp1041_config),
275 MAKE_ENTRY(TERRATEC, CINERGY_S2_PCI_HD, &vp1041_config),
276 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_2033_DVB_C, &vp2033_config),
277 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_2040_DVB_C, &vp2040_config),
278 MAKE_ENTRY(TECHNISAT, CABLESTAR_HD2, &vp2040_config),
279 MAKE_ENTRY(TERRATEC, CINERGY_C, &vp2033_config),
280 MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_3030_DVB_T, &vp3030_config),
281 { }
282};
283
284static struct pci_driver mantis_pci_driver = {
285 .name = DRIVER_NAME,
286 .id_table = mantis_pci_table,
287 .probe = mantis_pci_probe,
288 .remove = mantis_pci_remove,
289};
290
291static int __devinit mantis_init(void)
292{
293 return pci_register_driver(&mantis_pci_driver);
294}
295
296static void __devexit mantis_exit(void)
297{
298 return pci_unregister_driver(&mantis_pci_driver);
299}
300
301module_init(mantis_init);
302module_exit(mantis_exit);
303
304MODULE_DESCRIPTION("MANTIS driver");
305MODULE_AUTHOR("Manu Abraham");
306MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
new file mode 100644
index 000000000000..d0b645a483c9
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_common.h
@@ -0,0 +1,179 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_COMMON_H
22#define __MANTIS_COMMON_H
23
24#include <linux/mutex.h>
25#include <linux/workqueue.h>
26
27#include "mantis_uart.h"
28
29#include "mantis_link.h"
30
31#define MANTIS_ERROR 0
32#define MANTIS_NOTICE 1
33#define MANTIS_INFO 2
34#define MANTIS_DEBUG 3
35#define MANTIS_TMG 9
36
37#define dprintk(y, z, format, arg...) do { \
38 if (z) { \
39 if ((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y)) \
40 printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
41 else if ((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y)) \
42 printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
43 else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y)) \
44 printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
45 else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y)) \
46 printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
47 else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y)) \
48 printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
49 } else { \
50 if (mantis->verbose > y) \
51 printk(format , ##arg); \
52 } \
53} while(0)
54
55#define mwrite(dat, addr) writel((dat), addr)
56#define mread(addr) readl(addr)
57
58#define mmwrite(dat, addr) mwrite((dat), (mantis->mmio + (addr)))
59#define mmread(addr) mread(mantis->mmio + (addr))
60
61#define MANTIS_TS_188 0
62#define MANTIS_TS_204 1
63
64#define TWINHAN_TECHNOLOGIES 0x1822
65#define MANTIS 0x4e35
66
67#define TECHNISAT 0x1ae4
68#define TERRATEC 0x153b
69
70#define MAKE_ENTRY(__subven, __subdev, __configptr) { \
71 .vendor = TWINHAN_TECHNOLOGIES, \
72 .device = MANTIS, \
73 .subvendor = (__subven), \
74 .subdevice = (__subdev), \
75 .driver_data = (unsigned long) (__configptr) \
76}
77
78enum mantis_i2c_mode {
79 MANTIS_PAGE_MODE = 0,
80 MANTIS_BYTE_MODE,
81};
82
83struct mantis_pci;
84
85struct mantis_hwconfig {
86 char *model_name;
87 char *dev_type;
88 u32 ts_size;
89
90 enum mantis_baud baud_rate;
91 enum mantis_parity parity;
92 u32 bytes;
93
94 irqreturn_t (*irq_handler)(int irq, void *dev_id);
95 int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe);
96
97 u8 power;
98 u8 reset;
99
100 enum mantis_i2c_mode i2c_mode;
101};
102
103struct mantis_pci {
104 unsigned int verbose;
105
106 /* PCI stuff */
107 u16 vendor_id;
108 u16 device_id;
109 u16 subsystem_vendor;
110 u16 subsystem_device;
111
112 u8 latency;
113
114 struct pci_dev *pdev;
115
116 unsigned long mantis_addr;
117 void __iomem *mmio;
118
119 u8 irq;
120 u8 revision;
121
122 unsigned int num;
123
124 /* RISC Core */
125 u32 finished_block;
126 u32 last_block;
127 u32 line_bytes;
128 u32 line_count;
129 u32 risc_pos;
130 u8 *buf_cpu;
131 dma_addr_t buf_dma;
132 u32 *risc_cpu;
133 dma_addr_t risc_dma;
134
135 struct tasklet_struct tasklet;
136
137 struct i2c_adapter adapter;
138 int i2c_rc;
139 wait_queue_head_t i2c_wq;
140 struct mutex i2c_lock;
141
142 /* DVB stuff */
143 struct dvb_adapter dvb_adapter;
144 struct dvb_frontend *fe;
145 struct dvb_demux demux;
146 struct dmxdev dmxdev;
147 struct dmx_frontend fe_hw;
148 struct dmx_frontend fe_mem;
149 struct dvb_net dvbnet;
150
151 u8 feeds;
152
153 struct mantis_hwconfig *hwconfig;
154
155 u32 mantis_int_stat;
156 u32 mantis_int_mask;
157
158 /* board specific */
159 u8 mac_address[8];
160 u32 sub_vendor_id;
161 u32 sub_device_id;
162
163 /* A12 A13 A14 */
164 u32 gpio_status;
165
166 u32 gpif_status;
167
168 struct mantis_ca *mantis_ca;
169
170 wait_queue_head_t uart_wq;
171 struct work_struct uart_work;
172 spinlock_t uart_lock;
173
174 struct input_dev *rc;
175};
176
177#define MANTIS_HIF_STATUS (mantis->gpio_status)
178
179#endif /* __MANTIS_COMMON_H */
diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
new file mode 100644
index 000000000000..8113b23ce448
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_core.c
@@ -0,0 +1,238 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "mantis_common.h"
22#include "mantis_core.h"
23#include "mantis_vp1033.h"
24#include "mantis_vp1034.h"
25#include "mantis_vp1041.h"
26#include "mantis_vp2033.h"
27#include "mantis_vp2040.h"
28#include "mantis_vp3030.h"
29
30static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
31{
32 int err;
33 struct i2c_msg msg[] = {
34 {
35 .addr = 0x50,
36 .flags = 0,
37 .buf = data,
38 .len = 1
39 }, {
40 .addr = 0x50,
41 .flags = I2C_M_RD,
42 .buf = data,
43 .len = length
44 },
45 };
46
47 err = i2c_transfer(&mantis->adapter, msg, 2);
48 if (err < 0) {
49 dprintk(verbose, MANTIS_ERROR, 1,
50 "ERROR: i2c read: < err=%i d0=0x%02x d1=0x%02x >",
51 err, data[0], data[1]);
52
53 return err;
54 }
55
56 return 0;
57}
58
59static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
60{
61 int err;
62
63 struct i2c_msg msg = {
64 .addr = 0x50,
65 .flags = 0,
66 .buf = data,
67 .len = length
68 };
69
70 err = i2c_transfer(&mantis->adapter, &msg, 1);
71 if (err < 0) {
72 dprintk(verbose, MANTIS_ERROR, 1,
73 "ERROR: i2c write: < err=%i length=0x%02x d0=0x%02x, d1=0x%02x >",
74 err, length, data[0], data[1]);
75
76 return err;
77 }
78
79 return 0;
80}
81
82static int get_mac_address(struct mantis_pci *mantis)
83{
84 int err;
85
86 mantis->mac_address[0] = 0x08;
87 err = read_eeprom_byte(mantis, &mantis->mac_address[0], 6);
88 if (err < 0) {
89 dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
90
91 return err;
92 }
93 dprintk(verbose, MANTIS_ERROR, 0,
94 " MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]\n",
95 mantis->mac_address[0], mantis->mac_address[1],
96 mantis->mac_address[2], mantis->mac_address[3],
97 mantis->mac_address[4], mantis->mac_address[5]);
98
99 return 0;
100}
101
102#define MANTIS_MODEL_UNKNOWN "UNKNOWN"
103#define MANTIS_DEV_UNKNOWN "UNKNOWN"
104
105struct mantis_hwconfig unknown_device = {
106 .model_name = MANTIS_MODEL_UNKNOWN,
107 .dev_type = MANTIS_DEV_UNKNOWN,
108};
109
110static void mantis_load_config(struct mantis_pci *mantis)
111{
112 switch (mantis->subsystem_device) {
113 case MANTIS_VP_1033_DVB_S: /* VP-1033 */
114 mantis->hwconfig = &vp1033_mantis_config;
115 break;
116 case MANTIS_VP_1034_DVB_S: /* VP-1034 */
117 mantis->hwconfig = &vp1034_mantis_config;
118 break;
119 case MANTIS_VP_1041_DVB_S2: /* VP-1041 */
120 case TECHNISAT_SKYSTAR_HD2:
121 mantis->hwconfig = &vp1041_mantis_config;
122 break;
123 case MANTIS_VP_2033_DVB_C: /* VP-2033 */
124 mantis->hwconfig = &vp2033_mantis_config;
125 break;
126 case MANTIS_VP_2040_DVB_C: /* VP-2040 */
127 case TERRATEC_CINERGY_C_PCI: /* VP-2040 clone */
128 case TECHNISAT_CABLESTAR_HD2:
129 mantis->hwconfig = &vp2040_mantis_config;
130 break;
131 case MANTIS_VP_3030_DVB_T: /* VP-3030 */
132 mantis->hwconfig = &vp3030_mantis_config;
133 break;
134 default:
135 mantis->hwconfig = &unknown_device;
136 break;
137 }
138}
139
140int mantis_core_init(struct mantis_pci *mantis)
141{
142 int err = 0;
143
144 mantis_load_config(mantis);
145 dprintk(verbose, MANTIS_ERROR, 0, "found a %s PCI %s device on (%02x:%02x.%x),\n",
146 mantis->hwconfig->model_name, mantis->hwconfig->dev_type,
147 mantis->pdev->bus->number, PCI_SLOT(mantis->pdev->devfn), PCI_FUNC(mantis->pdev->devfn));
148 dprintk(verbose, MANTIS_ERROR, 0, " Mantis Rev %d [%04x:%04x], ",
149 mantis->revision,
150 mantis->subsystem_vendor, mantis->subsystem_device);
151 dprintk(verbose, MANTIS_ERROR, 0,
152 "irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p\n",
153 mantis->pdev->irq, mantis->latency,
154 mantis->mantis_addr, mantis->mantis_mmio);
155
156 err = mantis_i2c_init(mantis);
157 if (err < 0) {
158 dprintk(verbose, MANTIS_ERROR, 1, "Mantis I2C init failed");
159 return err;
160 }
161 err = get_mac_address(mantis);
162 if (err < 0) {
163 dprintk(verbose, MANTIS_ERROR, 1, "get MAC address failed");
164 return err;
165 }
166 err = mantis_dma_init(mantis);
167 if (err < 0) {
168 dprintk(verbose, MANTIS_ERROR, 1, "Mantis DMA init failed");
169 return err;
170 }
171 err = mantis_dvb_init(mantis);
172 if (err < 0) {
173 dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB init failed");
174 return err;
175 }
176 err = mantis_uart_init(mantis);
177 if (err < 0) {
178 dprintk(verbose, MANTIS_DEBUG, 1, "Mantis UART init failed");
179 return err;
180 }
181
182 return 0;
183}
184
185int mantis_core_exit(struct mantis_pci *mantis)
186{
187 mantis_dma_stop(mantis);
188 dprintk(verbose, MANTIS_ERROR, 1, "DMA engine stopping");
189
190 mantis_uart_exit(mantis);
191 dprintk(verbose, MANTIS_ERROR, 1, "UART exit failed");
192
193 if (mantis_dma_exit(mantis) < 0)
194 dprintk(verbose, MANTIS_ERROR, 1, "DMA exit failed");
195 if (mantis_dvb_exit(mantis) < 0)
196 dprintk(verbose, MANTIS_ERROR, 1, "DVB exit failed");
197 if (mantis_i2c_exit(mantis) < 0)
198 dprintk(verbose, MANTIS_ERROR, 1, "I2C adapter delete.. failed");
199
200 return 0;
201}
202
203/* Turn the given bit on or off. */
204void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
205{
206 u32 cur;
207
208 cur = mmread(MANTIS_GPIF_ADDR);
209 if (value)
210 mantis->gpio_status = cur | (1 << bitpos);
211 else
212 mantis->gpio_status = cur & (~(1 << bitpos));
213
214 mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
215 mmwrite(0x00, MANTIS_GPIF_DOUT);
216 udelay(100);
217}
218
219/* direction = 0 , no CI passthrough ; 1 , CI passthrough */
220void mantis_set_direction(struct mantis_pci *mantis, int direction)
221{
222 u32 reg;
223
224 reg = mmread(0x28);
225 dprintk(verbose, MANTIS_DEBUG, 1, "TS direction setup");
226 if (direction == 0x01) {
227 /* to CI */
228 reg |= 0x04;
229 mmwrite(reg, 0x28);
230 reg &= 0xff - 0x04;
231 mmwrite(reg, 0x28);
232 } else {
233 reg &= 0xff - 0x04;
234 mmwrite(reg, 0x28);
235 reg |= 0x04;
236 mmwrite(reg, 0x28);
237 }
238}
diff --git a/drivers/media/dvb/mantis/mantis_core.h b/drivers/media/dvb/mantis/mantis_core.h
new file mode 100644
index 000000000000..833ee42e694e
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_core.h
@@ -0,0 +1,57 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_CORE_H
22#define __MANTIS_CORE_H
23
24#include "mantis_common.h"
25
26
27#define FE_TYPE_SAT 0
28#define FE_TYPE_CAB 1
29#define FE_TYPE_TER 2
30
31#define FE_TYPE_TS204 0
32#define FE_TYPE_TS188 1
33
34
35struct vendorname {
36 u8 *sub_vendor_name;
37 u32 sub_vendor_id;
38};
39
40struct devicetype {
41 u8 *sub_device_name;
42 u32 sub_device_id;
43 u8 device_type;
44 u32 type_flags;
45};
46
47
48extern int mantis_dma_init(struct mantis_pci *mantis);
49extern int mantis_dma_exit(struct mantis_pci *mantis);
50extern void mantis_dma_start(struct mantis_pci *mantis);
51extern void mantis_dma_stop(struct mantis_pci *mantis);
52extern int mantis_i2c_init(struct mantis_pci *mantis);
53extern int mantis_i2c_exit(struct mantis_pci *mantis);
54extern int mantis_core_init(struct mantis_pci *mantis);
55extern int mantis_core_exit(struct mantis_pci *mantis);
56
57#endif /* __MANTIS_CORE_H */
diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
new file mode 100644
index 000000000000..46202a4012aa
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_dma.c
@@ -0,0 +1,256 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/kernel.h>
22#include <asm/page.h>
23#include <linux/vmalloc.h>
24#include <linux/pci.h>
25
26#include <asm/irq.h>
27#include <linux/signal.h>
28#include <linux/sched.h>
29#include <linux/interrupt.h>
30
31#include "dmxdev.h"
32#include "dvbdev.h"
33#include "dvb_demux.h"
34#include "dvb_frontend.h"
35#include "dvb_net.h"
36
37#include "mantis_common.h"
38#include "mantis_reg.h"
39#include "mantis_dma.h"
40
41#define RISC_WRITE (0x01 << 28)
42#define RISC_JUMP (0x07 << 28)
43#define RISC_IRQ (0x01 << 24)
44
45#define RISC_STATUS(status) ((((~status) & 0x0f) << 20) | ((status & 0x0f) << 16))
46#define RISC_FLUSH() (mantis->risc_pos = 0)
47#define RISC_INSTR(opcode) (mantis->risc_cpu[mantis->risc_pos++] = cpu_to_le32(opcode))
48
49#define MANTIS_BUF_SIZE (64 * 1024)
50#define MANTIS_BLOCK_BYTES (MANTIS_BUF_SIZE >> 4)
51#define MANTIS_BLOCK_COUNT (1 << 4)
52#define MANTIS_RISC_SIZE PAGE_SIZE
53
54int mantis_dma_exit(struct mantis_pci *mantis)
55{
56 if (mantis->buf_cpu) {
57 dprintk(MANTIS_ERROR, 1,
58 "DMA=0x%lx cpu=0x%p size=%d",
59 (unsigned long) mantis->buf_dma,
60 mantis->buf_cpu,
61 MANTIS_BUF_SIZE);
62
63 pci_free_consistent(mantis->pdev, MANTIS_BUF_SIZE,
64 mantis->buf_cpu, mantis->buf_dma);
65
66 mantis->buf_cpu = NULL;
67 }
68 if (mantis->risc_cpu) {
69 dprintk(MANTIS_ERROR, 1,
70 "RISC=0x%lx cpu=0x%p size=%lx",
71 (unsigned long) mantis->risc_dma,
72 mantis->risc_cpu,
73 MANTIS_RISC_SIZE);
74
75 pci_free_consistent(mantis->pdev, MANTIS_RISC_SIZE,
76 mantis->risc_cpu, mantis->risc_dma);
77
78 mantis->risc_cpu = NULL;
79 }
80
81 return 0;
82}
83EXPORT_SYMBOL_GPL(mantis_dma_exit);
84
85static inline int mantis_alloc_buffers(struct mantis_pci *mantis)
86{
87 if (!mantis->buf_cpu) {
88 mantis->buf_cpu = pci_alloc_consistent(mantis->pdev,
89 MANTIS_BUF_SIZE,
90 &mantis->buf_dma);
91 if (!mantis->buf_cpu) {
92 dprintk(MANTIS_ERROR, 1,
93 "DMA buffer allocation failed");
94
95 goto err;
96 }
97 dprintk(MANTIS_ERROR, 1,
98 "DMA=0x%lx cpu=0x%p size=%d",
99 (unsigned long) mantis->buf_dma,
100 mantis->buf_cpu, MANTIS_BUF_SIZE);
101 }
102 if (!mantis->risc_cpu) {
103 mantis->risc_cpu = pci_alloc_consistent(mantis->pdev,
104 MANTIS_RISC_SIZE,
105 &mantis->risc_dma);
106
107 if (!mantis->risc_cpu) {
108 dprintk(MANTIS_ERROR, 1,
109 "RISC program allocation failed");
110
111 mantis_dma_exit(mantis);
112
113 goto err;
114 }
115 dprintk(MANTIS_ERROR, 1,
116 "RISC=0x%lx cpu=0x%p size=%lx",
117 (unsigned long) mantis->risc_dma,
118 mantis->risc_cpu, MANTIS_RISC_SIZE);
119 }
120
121 return 0;
122err:
123 dprintk(MANTIS_ERROR, 1, "Out of memory (?) .....");
124 return -ENOMEM;
125}
126
127static inline int mantis_calc_lines(struct mantis_pci *mantis)
128{
129 mantis->line_bytes = MANTIS_BLOCK_BYTES;
130 mantis->line_count = MANTIS_BLOCK_COUNT;
131
132 while (mantis->line_bytes > 4095) {
133 mantis->line_bytes >>= 1;
134 mantis->line_count <<= 1;
135 }
136
137 dprintk(MANTIS_DEBUG, 1, "Mantis RISC block bytes=[%d], line bytes=[%d], line count=[%d]",
138 MANTIS_BLOCK_BYTES, mantis->line_bytes, mantis->line_count);
139
140 if (mantis->line_count > 255) {
141 dprintk(MANTIS_ERROR, 1, "Buffer size error");
142 return -EINVAL;
143 }
144
145 return 0;
146}
147
148int mantis_dma_init(struct mantis_pci *mantis)
149{
150 int err = 0;
151
152 dprintk(MANTIS_DEBUG, 1, "Mantis DMA init");
153 if (mantis_alloc_buffers(mantis) < 0) {
154 dprintk(MANTIS_ERROR, 1, "Error allocating DMA buffer");
155
156 /* Stop RISC Engine */
157 mmwrite(0, MANTIS_DMA_CTL);
158
159 goto err;
160 }
161 err = mantis_calc_lines(mantis);
162 if (err < 0) {
163 dprintk(MANTIS_ERROR, 1, "Mantis calc lines failed");
164
165 goto err;
166 }
167
168 return 0;
169err:
170 return err;
171}
172EXPORT_SYMBOL_GPL(mantis_dma_init);
173
174static inline void mantis_risc_program(struct mantis_pci *mantis)
175{
176 u32 buf_pos = 0;
177 u32 line;
178
179 dprintk(MANTIS_DEBUG, 1, "Mantis create RISC program");
180 RISC_FLUSH();
181
182 dprintk(MANTIS_DEBUG, 1, "risc len lines %u, bytes per line %u",
183 mantis->line_count, mantis->line_bytes);
184
185 for (line = 0; line < mantis->line_count; line++) {
186 dprintk(MANTIS_DEBUG, 1, "RISC PROG line=[%d]", line);
187 if (!(buf_pos % MANTIS_BLOCK_BYTES)) {
188 RISC_INSTR(RISC_WRITE |
189 RISC_IRQ |
190 RISC_STATUS(((buf_pos / MANTIS_BLOCK_BYTES) +
191 (MANTIS_BLOCK_COUNT - 1)) %
192 MANTIS_BLOCK_COUNT) |
193 mantis->line_bytes);
194 } else {
195 RISC_INSTR(RISC_WRITE | mantis->line_bytes);
196 }
197 RISC_INSTR(mantis->buf_dma + buf_pos);
198 buf_pos += mantis->line_bytes;
199 }
200 RISC_INSTR(RISC_JUMP);
201 RISC_INSTR(mantis->risc_dma);
202}
203
204void mantis_dma_start(struct mantis_pci *mantis)
205{
206 dprintk(MANTIS_DEBUG, 1, "Mantis Start DMA engine");
207
208 mantis_risc_program(mantis);
209 mmwrite(mantis->risc_dma, MANTIS_RISC_START);
210 mmwrite(mmread(MANTIS_GPIF_ADDR) | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
211
212 mmwrite(0, MANTIS_DMA_CTL);
213 mantis->last_block = mantis->finished_block = 0;
214
215 mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_RISCI, MANTIS_INT_MASK);
216
217 mmwrite(MANTIS_FIFO_EN | MANTIS_DCAP_EN
218 | MANTIS_RISC_EN, MANTIS_DMA_CTL);
219
220}
221
222void mantis_dma_stop(struct mantis_pci *mantis)
223{
224 u32 stat = 0, mask = 0;
225
226 stat = mmread(MANTIS_INT_STAT);
227 mask = mmread(MANTIS_INT_MASK);
228 dprintk(MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
229
230 mmwrite((mmread(MANTIS_GPIF_ADDR) & (~(MANTIS_GPIF_HIFRDWRN))), MANTIS_GPIF_ADDR);
231
232 mmwrite((mmread(MANTIS_DMA_CTL) & ~(MANTIS_FIFO_EN |
233 MANTIS_DCAP_EN |
234 MANTIS_RISC_EN)), MANTIS_DMA_CTL);
235
236 mmwrite(mmread(MANTIS_INT_STAT), MANTIS_INT_STAT);
237
238 mmwrite(mmread(MANTIS_INT_MASK) & ~(MANTIS_INT_RISCI |
239 MANTIS_INT_RISCEN), MANTIS_INT_MASK);
240}
241
242
243void mantis_dma_xfer(unsigned long data)
244{
245 struct mantis_pci *mantis = (struct mantis_pci *) data;
246 struct mantis_hwconfig *config = mantis->hwconfig;
247
248 while (mantis->last_block != mantis->finished_block) {
249 dprintk(MANTIS_DEBUG, 1, "last block=[%d] finished block=[%d]",
250 mantis->last_block, mantis->finished_block);
251
252 (config->ts_size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)
253 (&mantis->demux, &mantis->buf_cpu[mantis->last_block * MANTIS_BLOCK_BYTES], MANTIS_BLOCK_BYTES);
254 mantis->last_block = (mantis->last_block + 1) % MANTIS_BLOCK_COUNT;
255 }
256}
diff --git a/drivers/media/dvb/mantis/mantis_dma.h b/drivers/media/dvb/mantis/mantis_dma.h
new file mode 100644
index 000000000000..6be00fa82094
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_dma.h
@@ -0,0 +1,30 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_DMA_H
22#define __MANTIS_DMA_H
23
24extern int mantis_dma_init(struct mantis_pci *mantis);
25extern int mantis_dma_exit(struct mantis_pci *mantis);
26extern void mantis_dma_start(struct mantis_pci *mantis);
27extern void mantis_dma_stop(struct mantis_pci *mantis);
28extern void mantis_dma_xfer(unsigned long data);
29
30#endif /* __MANTIS_DMA_H */
diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
new file mode 100644
index 000000000000..99d82eec3b03
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_dvb.c
@@ -0,0 +1,296 @@
1/*
2 Mantis PCI bridge driver
3 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20#include <linux/kernel.h>
21#include <linux/bitops.h>
22
23#include <linux/signal.h>
24#include <linux/sched.h>
25#include <linux/interrupt.h>
26#include <linux/pci.h>
27#include <linux/i2c.h>
28
29#include "dmxdev.h"
30#include "dvbdev.h"
31#include "dvb_demux.h"
32#include "dvb_frontend.h"
33#include "dvb_net.h"
34
35#include "mantis_common.h"
36#include "mantis_dma.h"
37#include "mantis_ca.h"
38#include "mantis_ioc.h"
39#include "mantis_dvb.h"
40
41DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
42
43int mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power)
44{
45 struct mantis_hwconfig *config = mantis->hwconfig;
46
47 switch (power) {
48 case POWER_ON:
49 dprintk(MANTIS_DEBUG, 1, "Power ON");
50 gpio_set_bits(mantis, config->power, POWER_ON);
51 msleep(100);
52 gpio_set_bits(mantis, config->power, POWER_ON);
53 msleep(100);
54 break;
55
56 case POWER_OFF:
57 dprintk(MANTIS_DEBUG, 1, "Power OFF");
58 gpio_set_bits(mantis, config->power, POWER_OFF);
59 msleep(100);
60 break;
61
62 default:
63 dprintk(MANTIS_DEBUG, 1, "Unknown state <%02x>", power);
64 return -1;
65 }
66
67 return 0;
68}
69EXPORT_SYMBOL_GPL(mantis_frontend_power);
70
71void mantis_frontend_soft_reset(struct mantis_pci *mantis)
72{
73 struct mantis_hwconfig *config = mantis->hwconfig;
74
75 dprintk(MANTIS_DEBUG, 1, "Frontend RESET");
76 gpio_set_bits(mantis, config->reset, 0);
77 msleep(100);
78 gpio_set_bits(mantis, config->reset, 0);
79 msleep(100);
80 gpio_set_bits(mantis, config->reset, 1);
81 msleep(100);
82 gpio_set_bits(mantis, config->reset, 1);
83 msleep(100);
84
85 return;
86}
87EXPORT_SYMBOL_GPL(mantis_frontend_soft_reset);
88
89static int mantis_frontend_shutdown(struct mantis_pci *mantis)
90{
91 int err;
92
93 mantis_frontend_soft_reset(mantis);
94 err = mantis_frontend_power(mantis, POWER_OFF);
95 if (err != 0) {
96 dprintk(MANTIS_ERROR, 1, "Frontend POWER OFF failed! <%d>", err);
97 return 1;
98 }
99
100 return 0;
101}
102
103static int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
104{
105 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
106 struct mantis_pci *mantis = dvbdmx->priv;
107
108 dprintk(MANTIS_DEBUG, 1, "Mantis DVB Start feed");
109 if (!dvbdmx->dmx.frontend) {
110 dprintk(MANTIS_DEBUG, 1, "no frontend ?");
111 return -EINVAL;
112 }
113
114 mantis->feeds++;
115 dprintk(MANTIS_DEBUG, 1, "mantis start feed, feeds=%d", mantis->feeds);
116
117 if (mantis->feeds == 1) {
118 dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma");
119 mantis_dma_start(mantis);
120 }
121
122 return mantis->feeds;
123}
124
125static int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
126{
127 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
128 struct mantis_pci *mantis = dvbdmx->priv;
129
130 dprintk(MANTIS_DEBUG, 1, "Mantis DVB Stop feed");
131 if (!dvbdmx->dmx.frontend) {
132 dprintk(MANTIS_DEBUG, 1, "no frontend ?");
133 return -EINVAL;
134 }
135
136 mantis->feeds--;
137 if (mantis->feeds == 0) {
138 dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma");
139 mantis_dma_stop(mantis);
140 }
141
142 return 0;
143}
144
145int __devinit mantis_dvb_init(struct mantis_pci *mantis)
146{
147 struct mantis_hwconfig *config = mantis->hwconfig;
148 int result = -1;
149
150 dprintk(MANTIS_DEBUG, 1, "dvb_register_adapter");
151
152 result = dvb_register_adapter(&mantis->dvb_adapter,
153 "Mantis DVB adapter",
154 THIS_MODULE,
155 &mantis->pdev->dev,
156 adapter_nr);
157
158 if (result < 0) {
159
160 dprintk(MANTIS_ERROR, 1, "Error registering adapter");
161 return -ENODEV;
162 }
163
164 mantis->dvb_adapter.priv = mantis;
165 mantis->demux.dmx.capabilities = DMX_TS_FILTERING |
166 DMX_SECTION_FILTERING |
167 DMX_MEMORY_BASED_FILTERING;
168
169 mantis->demux.priv = mantis;
170 mantis->demux.filternum = 256;
171 mantis->demux.feednum = 256;
172 mantis->demux.start_feed = mantis_dvb_start_feed;
173 mantis->demux.stop_feed = mantis_dvb_stop_feed;
174 mantis->demux.write_to_decoder = NULL;
175
176 dprintk(MANTIS_DEBUG, 1, "dvb_dmx_init");
177 result = dvb_dmx_init(&mantis->demux);
178 if (result < 0) {
179 dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
180
181 goto err0;
182 }
183
184 mantis->dmxdev.filternum = 256;
185 mantis->dmxdev.demux = &mantis->demux.dmx;
186 mantis->dmxdev.capabilities = 0;
187 dprintk(MANTIS_DEBUG, 1, "dvb_dmxdev_init");
188
189 result = dvb_dmxdev_init(&mantis->dmxdev, &mantis->dvb_adapter);
190 if (result < 0) {
191
192 dprintk(MANTIS_ERROR, 1, "dvb_dmxdev_init failed, ERROR=%d", result);
193 goto err1;
194 }
195
196 mantis->fe_hw.source = DMX_FRONTEND_0;
197 result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_hw);
198 if (result < 0) {
199
200 dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
201 goto err2;
202 }
203
204 mantis->fe_mem.source = DMX_MEMORY_FE;
205 result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_mem);
206 if (result < 0) {
207 dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
208 goto err3;
209 }
210
211 result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx, &mantis->fe_hw);
212 if (result < 0) {
213 dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
214 goto err4;
215 }
216
217 dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
218 tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
219 if (mantis->hwconfig) {
220 result = config->frontend_init(mantis, mantis->fe);
221 if (result < 0) {
222 dprintk(MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
223 goto err5;
224 } else {
225 if (mantis->fe == NULL) {
226 dprintk(MANTIS_ERROR, 1, "FE <NULL>");
227 goto err5;
228 }
229
230 if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) {
231 dprintk(MANTIS_ERROR, 1, "ERROR: Frontend registration failed");
232
233 if (mantis->fe->ops.release)
234 mantis->fe->ops.release(mantis->fe);
235
236 mantis->fe = NULL;
237 goto err5;
238 }
239 }
240 }
241
242 return 0;
243
244 /* Error conditions .. */
245err5:
246 tasklet_kill(&mantis->tasklet);
247 dvb_net_release(&mantis->dvbnet);
248 dvb_unregister_frontend(mantis->fe);
249 dvb_frontend_detach(mantis->fe);
250err4:
251 mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
252
253err3:
254 mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
255
256err2:
257 dvb_dmxdev_release(&mantis->dmxdev);
258
259err1:
260 dvb_dmx_release(&mantis->demux);
261
262err0:
263 dvb_unregister_adapter(&mantis->dvb_adapter);
264
265 return result;
266}
267EXPORT_SYMBOL_GPL(mantis_dvb_init);
268
269int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
270{
271 int err;
272
273 if (mantis->fe) {
274 /* mantis_ca_exit(mantis); */
275 err = mantis_frontend_shutdown(mantis);
276 if (err != 0)
277 dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
278 dvb_unregister_frontend(mantis->fe);
279 dvb_frontend_detach(mantis->fe);
280 }
281
282 tasklet_kill(&mantis->tasklet);
283 dvb_net_release(&mantis->dvbnet);
284
285 mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
286 mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
287
288 dvb_dmxdev_release(&mantis->dmxdev);
289 dvb_dmx_release(&mantis->demux);
290
291 dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter");
292 dvb_unregister_adapter(&mantis->dvb_adapter);
293
294 return 0;
295}
296EXPORT_SYMBOL_GPL(mantis_dvb_exit);
diff --git a/drivers/media/dvb/mantis/mantis_dvb.h b/drivers/media/dvb/mantis/mantis_dvb.h
new file mode 100644
index 000000000000..464199db304e
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_dvb.h
@@ -0,0 +1,35 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_DVB_H
22#define __MANTIS_DVB_H
23
24enum mantis_power {
25 POWER_OFF = 0,
26 POWER_ON = 1
27};
28
29extern int mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power);
30extern void mantis_frontend_soft_reset(struct mantis_pci *mantis);
31
32extern int mantis_dvb_init(struct mantis_pci *mantis);
33extern int mantis_dvb_exit(struct mantis_pci *mantis);
34
35#endif /* __MANTIS_DVB_H */
diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
new file mode 100644
index 000000000000..a7b369a439d6
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_evm.c
@@ -0,0 +1,117 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/kernel.h>
22
23#include <linux/signal.h>
24#include <linux/sched.h>
25#include <linux/interrupt.h>
26
27#include "dmxdev.h"
28#include "dvbdev.h"
29#include "dvb_demux.h"
30#include "dvb_frontend.h"
31#include "dvb_net.h"
32
33#include "mantis_common.h"
34#include "mantis_link.h"
35#include "mantis_hif.h"
36#include "mantis_reg.h"
37
38static void mantis_hifevm_work(struct work_struct *work)
39{
40 struct mantis_ca *ca = container_of(work, struct mantis_ca, hif_evm_work);
41 struct mantis_pci *mantis = ca->ca_priv;
42
43 u32 gpif_stat, gpif_mask;
44
45 gpif_stat = mmread(MANTIS_GPIF_STATUS);
46 gpif_mask = mmread(MANTIS_GPIF_IRQCFG);
47
48 if (gpif_stat & MANTIS_GPIF_DETSTAT) {
49 if (gpif_stat & MANTIS_CARD_PLUGIN) {
50 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
51 mmwrite(0xdada0000, MANTIS_CARD_RESET);
52 mantis_event_cam_plugin(ca);
53 dvb_ca_en50221_camchange_irq(&ca->en50221,
54 0,
55 DVB_CA_EN50221_CAMCHANGE_INSERTED);
56 }
57 } else {
58 if (gpif_stat & MANTIS_CARD_PLUGOUT) {
59 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
60 mmwrite(0xdada0000, MANTIS_CARD_RESET);
61 mantis_event_cam_unplug(ca);
62 dvb_ca_en50221_camchange_irq(&ca->en50221,
63 0,
64 DVB_CA_EN50221_CAMCHANGE_REMOVED);
65 }
66 }
67
68 if (mantis->gpif_status & MANTIS_GPIF_EXTIRQ)
69 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
70
71 if (mantis->gpif_status & MANTIS_SBUF_WSTO)
72 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
73
74 if (mantis->gpif_status & MANTIS_GPIF_OTHERR)
75 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
76
77 if (gpif_stat & MANTIS_SBUF_OVFLW)
78 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
79
80 if (gpif_stat & MANTIS_GPIF_BRRDY)
81 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
82
83 if (gpif_stat & MANTIS_GPIF_INTSTAT)
84 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
85
86 if (gpif_stat & MANTIS_SBUF_EMPTY)
87 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
88
89 if (gpif_stat & MANTIS_SBUF_OPDONE) {
90 dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
91 ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
92 ca->hif_event = MANTIS_SBUF_OPDONE;
93 wake_up(&ca->hif_opdone_wq);
94 }
95}
96
97int mantis_evmgr_init(struct mantis_ca *ca)
98{
99 struct mantis_pci *mantis = ca->ca_priv;
100
101 dprintk(MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
102 INIT_WORK(&ca->hif_evm_work, mantis_hifevm_work);
103 mantis_pcmcia_init(ca);
104 schedule_work(&ca->hif_evm_work);
105 mantis_hif_init(ca);
106 return 0;
107}
108
109void mantis_evmgr_exit(struct mantis_ca *ca)
110{
111 struct mantis_pci *mantis = ca->ca_priv;
112
113 dprintk(MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
114 flush_scheduled_work();
115 mantis_hif_exit(ca);
116 mantis_pcmcia_exit(ca);
117}
diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
new file mode 100644
index 000000000000..5772ebb3a69e
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_hif.c
@@ -0,0 +1,238 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/kernel.h>
22#include <linux/signal.h>
23#include <linux/sched.h>
24
25#include <linux/interrupt.h>
26
27#include "dmxdev.h"
28#include "dvbdev.h"
29#include "dvb_demux.h"
30#include "dvb_frontend.h"
31#include "dvb_net.h"
32
33#include "mantis_common.h"
34
35#include "mantis_hif.h"
36#include "mantis_link.h" /* temporary due to physical layer stuff */
37
38#include "mantis_reg.h"
39
40
41static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
42{
43 struct mantis_pci *mantis = ca->ca_priv;
44 int rc = 0;
45
46 if (wait_event_timeout(ca->hif_opdone_wq,
47 ca->hif_event & MANTIS_SBUF_OPDONE,
48 msecs_to_jiffies(500)) == -ERESTARTSYS) {
49
50 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Smart buffer operation timeout !", mantis->num);
51 rc = -EREMOTEIO;
52 }
53 dprintk(MANTIS_DEBUG, 1, "Smart Buffer Operation complete");
54 ca->hif_event &= ~MANTIS_SBUF_OPDONE;
55 return rc;
56}
57
58static int mantis_hif_write_wait(struct mantis_ca *ca)
59{
60 struct mantis_pci *mantis = ca->ca_priv;
61 u32 opdone = 0, timeout = 0;
62 int rc = 0;
63
64 if (wait_event_timeout(ca->hif_write_wq,
65 mantis->gpif_status & MANTIS_GPIF_WRACK,
66 msecs_to_jiffies(500)) == -ERESTARTSYS) {
67
68 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Write ACK timed out !", mantis->num);
69 rc = -EREMOTEIO;
70 }
71 dprintk(MANTIS_DEBUG, 1, "Write Acknowledged");
72 mantis->gpif_status &= ~MANTIS_GPIF_WRACK;
73 while (!opdone) {
74 opdone = (mmread(MANTIS_GPIF_STATUS) & MANTIS_SBUF_OPDONE);
75 udelay(500);
76 timeout++;
77 if (timeout > 100) {
78 dprintk(MANTIS_ERROR, 1, "Adater(%d) Slot(0): Write operation timed out!", mantis->num);
79 rc = -ETIMEDOUT;
80 break;
81 }
82 }
83 dprintk(MANTIS_DEBUG, 1, "HIF Write success");
84 return rc;
85}
86
87
88int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
89{
90 struct mantis_pci *mantis = ca->ca_priv;
91 u32 hif_addr = 0, data, count = 4;
92
93 dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Read", mantis->num);
94 mutex_lock(&ca->ca_lock);
95 hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
96 hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
97 hif_addr |= MANTIS_HIF_STATUS;
98 hif_addr |= addr;
99
100 mmwrite(hif_addr, MANTIS_GPIF_BRADDR);
101 mmwrite(count, MANTIS_GPIF_BRBYTES);
102 udelay(20);
103 mmwrite(hif_addr | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
104
105 if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
106 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
107 mutex_unlock(&ca->ca_lock);
108 return -EREMOTEIO;
109 }
110 data = mmread(MANTIS_GPIF_DIN);
111 mutex_unlock(&ca->ca_lock);
112 dprintk(MANTIS_DEBUG, 1, "Mem Read: 0x%02x", data);
113 return (data >> 24) & 0xff;
114}
115
116int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
117{
118 struct mantis_slot *slot = ca->slot;
119 struct mantis_pci *mantis = ca->ca_priv;
120 u32 hif_addr = 0;
121
122 dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Write", mantis->num);
123 mutex_lock(&ca->ca_lock);
124 hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
125 hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
126 hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
127 hif_addr |= MANTIS_HIF_STATUS;
128 hif_addr |= addr;
129
130 mmwrite(slot->slave_cfg, MANTIS_GPIF_CFGSLA); /* Slot0 alone for now */
131 mmwrite(hif_addr, MANTIS_GPIF_ADDR);
132 mmwrite(data, MANTIS_GPIF_DOUT);
133
134 if (mantis_hif_write_wait(ca) != 0) {
135 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
136 mutex_unlock(&ca->ca_lock);
137 return -EREMOTEIO;
138 }
139 dprintk(MANTIS_DEBUG, 1, "Mem Write: (0x%02x to 0x%02x)", data, addr);
140 mutex_unlock(&ca->ca_lock);
141
142 return 0;
143}
144
145int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
146{
147 struct mantis_pci *mantis = ca->ca_priv;
148 u32 data, hif_addr = 0;
149
150 dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Read", mantis->num);
151 mutex_lock(&ca->ca_lock);
152 hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
153 hif_addr |= MANTIS_GPIF_PCMCIAIOM;
154 hif_addr |= MANTIS_HIF_STATUS;
155 hif_addr |= addr;
156
157 mmwrite(hif_addr, MANTIS_GPIF_BRADDR);
158 mmwrite(1, MANTIS_GPIF_BRBYTES);
159 udelay(20);
160 mmwrite(hif_addr | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
161
162 if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
163 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
164 mutex_unlock(&ca->ca_lock);
165 return -EREMOTEIO;
166 }
167 data = mmread(MANTIS_GPIF_DIN);
168 dprintk(MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
169 udelay(50);
170 mutex_unlock(&ca->ca_lock);
171
172 return (u8) data;
173}
174
175int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
176{
177 struct mantis_pci *mantis = ca->ca_priv;
178 u32 hif_addr = 0;
179
180 dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Write", mantis->num);
181 mutex_lock(&ca->ca_lock);
182 hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
183 hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
184 hif_addr |= MANTIS_GPIF_PCMCIAIOM;
185 hif_addr |= MANTIS_HIF_STATUS;
186 hif_addr |= addr;
187
188 mmwrite(hif_addr, MANTIS_GPIF_ADDR);
189 mmwrite(data, MANTIS_GPIF_DOUT);
190
191 if (mantis_hif_write_wait(ca) != 0) {
192 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
193 mutex_unlock(&ca->ca_lock);
194 return -EREMOTEIO;
195 }
196 dprintk(MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
197 mutex_unlock(&ca->ca_lock);
198 udelay(50);
199
200 return 0;
201}
202
203int mantis_hif_init(struct mantis_ca *ca)
204{
205 struct mantis_slot *slot = ca->slot;
206 struct mantis_pci *mantis = ca->ca_priv;
207 u32 irqcfg;
208
209 slot[0].slave_cfg = 0x70773028;
210 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
211
212 mutex_lock(&ca->ca_lock);
213 irqcfg = mmread(MANTIS_GPIF_IRQCFG);
214 irqcfg = MANTIS_MASK_BRRDY |
215 MANTIS_MASK_WRACK |
216 MANTIS_MASK_EXTIRQ |
217 MANTIS_MASK_WSTO |
218 MANTIS_MASK_OTHERR |
219 MANTIS_MASK_OVFLW;
220
221 mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
222 mutex_unlock(&ca->ca_lock);
223
224 return 0;
225}
226
227void mantis_hif_exit(struct mantis_ca *ca)
228{
229 struct mantis_pci *mantis = ca->ca_priv;
230 u32 irqcfg;
231
232 dprintk(MANTIS_ERROR, 1, "Adapter(%d) Exiting Mantis Host Interface", mantis->num);
233 mutex_lock(&ca->ca_lock);
234 irqcfg = mmread(MANTIS_GPIF_IRQCFG);
235 irqcfg &= ~MANTIS_MASK_BRRDY;
236 mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
237 mutex_unlock(&ca->ca_lock);
238}
diff --git a/drivers/media/dvb/mantis/mantis_hif.h b/drivers/media/dvb/mantis/mantis_hif.h
new file mode 100644
index 000000000000..9094f9ed2362
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_hif.h
@@ -0,0 +1,29 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_HIF_H
22#define __MANTIS_HIF_H
23
24#define MANTIS_HIF_MEMRD 1
25#define MANTIS_HIF_MEMWR 2
26#define MANTIS_HIF_IOMRD 3
27#define MANTIS_HIF_IOMWR 4
28
29#endif /* __MANTIS_HIF_H */
diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
new file mode 100644
index 000000000000..7870bcf9689a
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_i2c.c
@@ -0,0 +1,267 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <asm/io.h>
22#include <linux/ioport.h>
23#include <linux/pci.h>
24#include <linux/i2c.h>
25
26#include "dmxdev.h"
27#include "dvbdev.h"
28#include "dvb_demux.h"
29#include "dvb_frontend.h"
30#include "dvb_net.h"
31
32#include "mantis_common.h"
33#include "mantis_reg.h"
34#include "mantis_i2c.h"
35
36#define TRIALS 10000
37
38static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
39{
40 u32 rxd, i, stat, trials;
41
42 dprintk(MANTIS_INFO, 0, " %s: Address=[0x%02x] <R>[ ",
43 __func__, msg->addr);
44
45 for (i = 0; i < msg->len; i++) {
46 rxd = (msg->addr << 25) | (1 << 24)
47 | MANTIS_I2C_RATE_3
48 | MANTIS_I2C_STOP
49 | MANTIS_I2C_PGMODE;
50
51 if (i == (msg->len - 1))
52 rxd &= ~MANTIS_I2C_STOP;
53
54 mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
55 mmwrite(rxd, MANTIS_I2CDATA_CTL);
56
57 /* wait for xfer completion */
58 for (trials = 0; trials < TRIALS; trials++) {
59 stat = mmread(MANTIS_INT_STAT);
60 if (stat & MANTIS_INT_I2CDONE)
61 break;
62 }
63
64 dprintk(MANTIS_TMG, 0, "I2CDONE: trials=%d\n", trials);
65
66 /* wait for xfer completion */
67 for (trials = 0; trials < TRIALS; trials++) {
68 stat = mmread(MANTIS_INT_STAT);
69 if (stat & MANTIS_INT_I2CRACK)
70 break;
71 }
72
73 dprintk(MANTIS_TMG, 0, "I2CRACK: trials=%d\n", trials);
74
75 rxd = mmread(MANTIS_I2CDATA_CTL);
76 msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
77 dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
78 }
79 dprintk(MANTIS_INFO, 0, "]\n");
80
81 return 0;
82}
83
84static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg)
85{
86 int i;
87 u32 txd = 0, stat, trials;
88
89 dprintk(MANTIS_INFO, 0, " %s: Address=[0x%02x] <W>[ ",
90 __func__, msg->addr);
91
92 for (i = 0; i < msg->len; i++) {
93 dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
94 txd = (msg->addr << 25) | (msg->buf[i] << 8)
95 | MANTIS_I2C_RATE_3
96 | MANTIS_I2C_STOP
97 | MANTIS_I2C_PGMODE;
98
99 if (i == (msg->len - 1))
100 txd &= ~MANTIS_I2C_STOP;
101
102 mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
103 mmwrite(txd, MANTIS_I2CDATA_CTL);
104
105 /* wait for xfer completion */
106 for (trials = 0; trials < TRIALS; trials++) {
107 stat = mmread(MANTIS_INT_STAT);
108 if (stat & MANTIS_INT_I2CDONE)
109 break;
110 }
111
112 dprintk(MANTIS_TMG, 0, "I2CDONE: trials=%d\n", trials);
113
114 /* wait for xfer completion */
115 for (trials = 0; trials < TRIALS; trials++) {
116 stat = mmread(MANTIS_INT_STAT);
117 if (stat & MANTIS_INT_I2CRACK)
118 break;
119 }
120
121 dprintk(MANTIS_TMG, 0, "I2CRACK: trials=%d\n", trials);
122 }
123 dprintk(MANTIS_INFO, 0, "]\n");
124
125 return 0;
126}
127
128static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
129{
130 int ret = 0, i = 0, trials;
131 u32 stat, data, txd;
132 struct mantis_pci *mantis;
133 struct mantis_hwconfig *config;
134
135 mantis = i2c_get_adapdata(adapter);
136 BUG_ON(!mantis);
137 config = mantis->hwconfig;
138 BUG_ON(!config);
139
140 dprintk(MANTIS_DEBUG, 1, "Messages:%d", num);
141 mutex_lock(&mantis->i2c_lock);
142
143 while (i < num) {
144 /* Byte MODE */
145 if ((config->i2c_mode & MANTIS_BYTE_MODE) &&
146 ((i + 1) < num) &&
147 (msgs[i].len < 2) &&
148 (msgs[i + 1].len < 2) &&
149 (msgs[i + 1].flags & I2C_M_RD)) {
150
151 dprintk(MANTIS_DEBUG, 0, " Byte MODE:\n");
152
153 /* Read operation */
154 txd = msgs[i].addr << 25 | (0x1 << 24)
155 | (msgs[i].buf[0] << 16)
156 | MANTIS_I2C_RATE_3;
157
158 mmwrite(txd, MANTIS_I2CDATA_CTL);
159 /* wait for xfer completion */
160 for (trials = 0; trials < TRIALS; trials++) {
161 stat = mmread(MANTIS_INT_STAT);
162 if (stat & MANTIS_INT_I2CDONE)
163 break;
164 }
165
166 /* check for xfer completion */
167 if (stat & MANTIS_INT_I2CDONE) {
168 /* check xfer was acknowledged */
169 if (stat & MANTIS_INT_I2CRACK) {
170 data = mmread(MANTIS_I2CDATA_CTL);
171 msgs[i + 1].buf[0] = (data >> 8) & 0xff;
172 dprintk(MANTIS_DEBUG, 0, " Byte <%d> RXD=0x%02x [%02x]\n", 0x0, data, msgs[i + 1].buf[0]);
173 } else {
174 /* I/O error */
175 dprintk(MANTIS_ERROR, 1, " I/O error, LINE:%d", __LINE__);
176 ret = -EIO;
177 break;
178 }
179 } else {
180 /* I/O error */
181 dprintk(MANTIS_ERROR, 1, " I/O error, LINE:%d", __LINE__);
182 ret = -EIO;
183 break;
184 }
185 i += 2; /* Write/Read operation in one go */
186 }
187
188 if (i < num) {
189 if (msgs[i].flags & I2C_M_RD)
190 ret = mantis_i2c_read(mantis, &msgs[i]);
191 else
192 ret = mantis_i2c_write(mantis, &msgs[i]);
193
194 i++;
195 if (ret < 0)
196 goto bail_out;
197 }
198
199 }
200
201 mutex_unlock(&mantis->i2c_lock);
202
203 return num;
204
205bail_out:
206 mutex_unlock(&mantis->i2c_lock);
207 return ret;
208}
209
210static u32 mantis_i2c_func(struct i2c_adapter *adapter)
211{
212 return I2C_FUNC_SMBUS_EMUL;
213}
214
215static struct i2c_algorithm mantis_algo = {
216 .master_xfer = mantis_i2c_xfer,
217 .functionality = mantis_i2c_func,
218};
219
220int __devinit mantis_i2c_init(struct mantis_pci *mantis)
221{
222 u32 intstat, intmask;
223 struct i2c_adapter *i2c_adapter = &mantis->adapter;
224 struct pci_dev *pdev = mantis->pdev;
225
226 init_waitqueue_head(&mantis->i2c_wq);
227 mutex_init(&mantis->i2c_lock);
228 strncpy(i2c_adapter->name, "Mantis I2C", sizeof(i2c_adapter->name));
229 i2c_set_adapdata(i2c_adapter, mantis);
230
231 i2c_adapter->owner = THIS_MODULE;
232 i2c_adapter->class = I2C_CLASS_TV_DIGITAL;
233 i2c_adapter->algo = &mantis_algo;
234 i2c_adapter->algo_data = NULL;
235 i2c_adapter->timeout = 500;
236 i2c_adapter->retries = 3;
237 i2c_adapter->dev.parent = &pdev->dev;
238
239 mantis->i2c_rc = i2c_add_adapter(i2c_adapter);
240 if (mantis->i2c_rc < 0)
241 return mantis->i2c_rc;
242
243 dprintk(MANTIS_DEBUG, 1, "Initializing I2C ..");
244
245 intstat = mmread(MANTIS_INT_STAT);
246 intmask = mmread(MANTIS_INT_MASK);
247 mmwrite(intstat, MANTIS_INT_STAT);
248 dprintk(MANTIS_DEBUG, 1, "Disabling I2C interrupt");
249 intmask = mmread(MANTIS_INT_MASK);
250 mmwrite((intmask & ~MANTIS_INT_I2CDONE), MANTIS_INT_MASK);
251
252 return 0;
253}
254EXPORT_SYMBOL_GPL(mantis_i2c_init);
255
256int mantis_i2c_exit(struct mantis_pci *mantis)
257{
258 u32 intmask;
259
260 dprintk(MANTIS_DEBUG, 1, "Disabling I2C interrupt");
261 intmask = mmread(MANTIS_INT_MASK);
262 mmwrite((intmask & ~MANTIS_INT_I2CDONE), MANTIS_INT_MASK);
263
264 dprintk(MANTIS_DEBUG, 1, "Removing I2C adapter");
265 return i2c_del_adapter(&mantis->adapter);
266}
267EXPORT_SYMBOL_GPL(mantis_i2c_exit);
diff --git a/drivers/media/dvb/mantis/mantis_i2c.h b/drivers/media/dvb/mantis/mantis_i2c.h
new file mode 100644
index 000000000000..1342df2faed8
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_i2c.h
@@ -0,0 +1,30 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_I2C_H
22#define __MANTIS_I2C_H
23
24#define I2C_STOP (1 << 0)
25#define I2C_READ (1 << 1)
26
27extern int mantis_i2c_init(struct mantis_pci *mantis);
28extern int mantis_i2c_exit(struct mantis_pci *mantis);
29
30#endif /* __MANTIS_I2C_H */
diff --git a/drivers/media/dvb/mantis/mantis_input.c b/drivers/media/dvb/mantis/mantis_input.c
new file mode 100644
index 000000000000..4675a3b53c7d
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_input.c
@@ -0,0 +1,148 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/input.h>
22#include <media/ir-common.h>
23#include <linux/pci.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "mantis_common.h"
32#include "mantis_reg.h"
33#include "mantis_uart.h"
34
35static struct ir_scancode mantis_ir_table[] = {
36 { 0x29, KEY_POWER },
37 { 0x28, KEY_FAVORITES },
38 { 0x30, KEY_TEXT },
39 { 0x17, KEY_INFO }, /* Preview */
40 { 0x23, KEY_EPG },
41 { 0x3b, KEY_F22 }, /* Record List */
42 { 0x3c, KEY_1 },
43 { 0x3e, KEY_2 },
44 { 0x39, KEY_3 },
45 { 0x36, KEY_4 },
46 { 0x22, KEY_5 },
47 { 0x20, KEY_6 },
48 { 0x32, KEY_7 },
49 { 0x26, KEY_8 },
50 { 0x24, KEY_9 },
51 { 0x2a, KEY_0 },
52
53 { 0x33, KEY_CANCEL },
54 { 0x2c, KEY_BACK },
55 { 0x15, KEY_CLEAR },
56 { 0x3f, KEY_TAB },
57 { 0x10, KEY_ENTER },
58 { 0x14, KEY_UP },
59 { 0x0d, KEY_RIGHT },
60 { 0x0e, KEY_DOWN },
61 { 0x11, KEY_LEFT },
62
63 { 0x21, KEY_VOLUMEUP },
64 { 0x35, KEY_VOLUMEDOWN },
65 { 0x3d, KEY_CHANNELDOWN },
66 { 0x3a, KEY_CHANNELUP },
67 { 0x2e, KEY_RECORD },
68 { 0x2b, KEY_PLAY },
69 { 0x13, KEY_PAUSE },
70 { 0x25, KEY_STOP },
71
72 { 0x1f, KEY_REWIND },
73 { 0x2d, KEY_FASTFORWARD },
74 { 0x1e, KEY_PREVIOUS }, /* Replay |< */
75 { 0x1d, KEY_NEXT }, /* Skip >| */
76
77 { 0x0b, KEY_CAMERA }, /* Capture */
78 { 0x0f, KEY_LANGUAGE }, /* SAP */
79 { 0x18, KEY_MODE }, /* PIP */
80 { 0x12, KEY_ZOOM }, /* Full screen */
81 { 0x1c, KEY_SUBTITLE },
82 { 0x2f, KEY_MUTE },
83 { 0x16, KEY_F20 }, /* L/R */
84 { 0x38, KEY_F21 }, /* Hibernate */
85
86 { 0x37, KEY_SWITCHVIDEOMODE }, /* A/V */
87 { 0x31, KEY_AGAIN }, /* Recall */
88 { 0x1a, KEY_KPPLUS }, /* Zoom+ */
89 { 0x19, KEY_KPMINUS }, /* Zoom- */
90 { 0x27, KEY_RED },
91 { 0x0C, KEY_GREEN },
92 { 0x01, KEY_YELLOW },
93 { 0x00, KEY_BLUE },
94};
95
96struct ir_scancode_table ir_mantis = {
97 .scan = mantis_ir_table,
98 .size = ARRAY_SIZE(mantis_ir_table),
99};
100EXPORT_SYMBOL_GPL(ir_mantis);
101
102int mantis_input_init(struct mantis_pci *mantis)
103{
104 struct input_dev *rc;
105 struct ir_input_state rc_state;
106 char name[80], dev[80];
107 int err;
108
109 rc = input_allocate_device();
110 if (!rc) {
111 dprintk(MANTIS_ERROR, 1, "Input device allocate failed");
112 return -ENOMEM;
113 }
114
115 sprintf(name, "Mantis %s IR receiver", mantis->hwconfig->model_name);
116 sprintf(dev, "pci-%s/ir0", pci_name(mantis->pdev));
117
118 rc->name = name;
119 rc->phys = dev;
120
121 ir_input_init(rc, &rc_state, IR_TYPE_OTHER);
122
123 rc->id.bustype = BUS_PCI;
124 rc->id.vendor = mantis->vendor_id;
125 rc->id.product = mantis->device_id;
126 rc->id.version = 1;
127 rc->dev = mantis->pdev->dev;
128
129 err = ir_input_register(rc, &ir_mantis, NULL);
130 if (err) {
131 dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err);
132 input_free_device(rc);
133 return -ENODEV;
134 }
135
136 mantis->rc = rc;
137
138 return 0;
139}
140
141int mantis_exit(struct mantis_pci *mantis)
142{
143 struct input_dev *rc = mantis->rc;
144
145 ir_input_unregister(rc);
146
147 return 0;
148}
diff --git a/drivers/media/dvb/mantis/mantis_ioc.c b/drivers/media/dvb/mantis/mantis_ioc.c
new file mode 100644
index 000000000000..de148ded52d8
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_ioc.c
@@ -0,0 +1,130 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/kernel.h>
22#include <linux/i2c.h>
23
24#include <linux/signal.h>
25#include <linux/sched.h>
26#include <linux/interrupt.h>
27
28#include "dmxdev.h"
29#include "dvbdev.h"
30#include "dvb_demux.h"
31#include "dvb_frontend.h"
32#include "dvb_net.h"
33
34#include "mantis_common.h"
35#include "mantis_reg.h"
36#include "mantis_ioc.h"
37
38static int read_eeprom_bytes(struct mantis_pci *mantis, u8 reg, u8 *data, u8 length)
39{
40 struct i2c_adapter *adapter = &mantis->adapter;
41 int err;
42 u8 buf = reg;
43
44 struct i2c_msg msg[] = {
45 { .addr = 0x50, .flags = 0, .buf = &buf, .len = 1 },
46 { .addr = 0x50, .flags = I2C_M_RD, .buf = data, .len = length },
47 };
48
49 err = i2c_transfer(adapter, msg, 2);
50 if (err < 0) {
51 dprintk(MANTIS_ERROR, 1, "ERROR: i2c read: < err=%i d0=0x%02x d1=0x%02x >",
52 err, data[0], data[1]);
53
54 return err;
55 }
56
57 return 0;
58}
59int mantis_get_mac(struct mantis_pci *mantis)
60{
61 int err;
62 u8 mac_addr[6] = {0};
63
64 err = read_eeprom_bytes(mantis, 0x08, mac_addr, 6);
65 if (err < 0) {
66 dprintk(MANTIS_ERROR, 1, "ERROR: Mantis EEPROM read error <%d>", err);
67
68 return err;
69 }
70
71 dprintk(MANTIS_ERROR, 0,
72 " MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]\n",
73 mac_addr[0],
74 mac_addr[1],
75 mac_addr[2],
76 mac_addr[3],
77 mac_addr[4],
78 mac_addr[5]);
79
80 return 0;
81}
82EXPORT_SYMBOL_GPL(mantis_get_mac);
83
84/* Turn the given bit on or off. */
85void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
86{
87 u32 cur;
88
89 dprintk(MANTIS_DEBUG, 1, "Set Bit <%d> to <%d>", bitpos, value);
90 cur = mmread(MANTIS_GPIF_ADDR);
91 if (value)
92 mantis->gpio_status = cur | (1 << bitpos);
93 else
94 mantis->gpio_status = cur & (~(1 << bitpos));
95
96 dprintk(MANTIS_DEBUG, 1, "GPIO Value <%02x>", mantis->gpio_status);
97 mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
98 mmwrite(0x00, MANTIS_GPIF_DOUT);
99}
100EXPORT_SYMBOL_GPL(gpio_set_bits);
101
102int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl)
103{
104 u32 reg;
105
106 reg = mmread(MANTIS_CONTROL);
107 switch (stream_ctl) {
108 case STREAM_TO_HIF:
109 dprintk(MANTIS_DEBUG, 1, "Set stream to HIF");
110 reg &= 0xff - MANTIS_BYPASS;
111 mmwrite(reg, MANTIS_CONTROL);
112 reg |= MANTIS_BYPASS;
113 mmwrite(reg, MANTIS_CONTROL);
114 break;
115
116 case STREAM_TO_CAM:
117 dprintk(MANTIS_DEBUG, 1, "Set stream to CAM");
118 reg |= MANTIS_BYPASS;
119 mmwrite(reg, MANTIS_CONTROL);
120 reg &= 0xff - MANTIS_BYPASS;
121 mmwrite(reg, MANTIS_CONTROL);
122 break;
123 default:
124 dprintk(MANTIS_ERROR, 1, "Unknown MODE <%02x>", stream_ctl);
125 return -1;
126 }
127
128 return 0;
129}
130EXPORT_SYMBOL_GPL(mantis_stream_control);
diff --git a/drivers/media/dvb/mantis/mantis_ioc.h b/drivers/media/dvb/mantis/mantis_ioc.h
new file mode 100644
index 000000000000..188fe5a81614
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_ioc.h
@@ -0,0 +1,51 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_IOC_H
22#define __MANTIS_IOC_H
23
24#define GPIF_A00 0x00
25#define GPIF_A01 0x01
26#define GPIF_A02 0x02
27#define GPIF_A03 0x03
28#define GPIF_A04 0x04
29#define GPIF_A05 0x05
30#define GPIF_A06 0x06
31#define GPIF_A07 0x07
32#define GPIF_A08 0x08
33#define GPIF_A09 0x09
34#define GPIF_A10 0x0a
35#define GPIF_A11 0x0b
36
37#define GPIF_A12 0x0c
38#define GPIF_A13 0x0d
39#define GPIF_A14 0x0e
40
41enum mantis_stream_control {
42 STREAM_TO_HIF = 0,
43 STREAM_TO_CAM
44};
45
46extern int mantis_get_mac(struct mantis_pci *mantis);
47extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
48
49extern int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl);
50
51#endif /* __MANTIS_IOC_H */
diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
new file mode 100644
index 000000000000..2a814774a001
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_link.h
@@ -0,0 +1,83 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_LINK_H
22#define __MANTIS_LINK_H
23
24#include <linux/mutex.h>
25#include <linux/workqueue.h>
26#include "dvb_ca_en50221.h"
27
28enum mantis_sbuf_status {
29 MANTIS_SBUF_DATA_AVAIL = 1,
30 MANTIS_SBUF_DATA_EMPTY = 2,
31 MANTIS_SBUF_DATA_OVFLW = 3
32};
33
34struct mantis_slot {
35 u32 timeout;
36 u32 slave_cfg;
37 u32 bar;
38};
39
40/* Physical layer */
41enum mantis_slot_state {
42 MODULE_INSERTED = 3,
43 MODULE_XTRACTED = 4
44};
45
46struct mantis_ca {
47 struct mantis_slot slot[4];
48
49 struct work_struct hif_evm_work;
50
51 u32 hif_event;
52 wait_queue_head_t hif_opdone_wq;
53 wait_queue_head_t hif_brrdyw_wq;
54 wait_queue_head_t hif_data_wq;
55 wait_queue_head_t hif_write_wq; /* HIF Write op */
56
57 enum mantis_sbuf_status sbuf_status;
58
59 enum mantis_slot_state slot_state;
60
61 void *ca_priv;
62
63 struct dvb_ca_en50221 en50221;
64 struct mutex ca_lock;
65};
66
67/* CA */
68extern void mantis_event_cam_plugin(struct mantis_ca *ca);
69extern void mantis_event_cam_unplug(struct mantis_ca *ca);
70extern int mantis_pcmcia_init(struct mantis_ca *ca);
71extern void mantis_pcmcia_exit(struct mantis_ca *ca);
72extern int mantis_evmgr_init(struct mantis_ca *ca);
73extern void mantis_evmgr_exit(struct mantis_ca *ca);
74
75/* HIF */
76extern int mantis_hif_init(struct mantis_ca *ca);
77extern void mantis_hif_exit(struct mantis_ca *ca);
78extern int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr);
79extern int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data);
80extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr);
81extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data);
82
83#endif /* __MANTIS_LINK_H */
diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
new file mode 100644
index 000000000000..59feeb84aec7
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_pci.c
@@ -0,0 +1,172 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/module.h>
22#include <linux/moduleparam.h>
23#include <linux/kernel.h>
24#include <asm/io.h>
25#include <asm/pgtable.h>
26#include <asm/page.h>
27#include <linux/kmod.h>
28#include <linux/vmalloc.h>
29#include <linux/init.h>
30#include <linux/device.h>
31#include <linux/pci.h>
32
33#include <asm/irq.h>
34#include <linux/signal.h>
35#include <linux/sched.h>
36#include <linux/interrupt.h>
37
38#include "dmxdev.h"
39#include "dvbdev.h"
40#include "dvb_demux.h"
41#include "dvb_frontend.h"
42#include "dvb_net.h"
43
44#include "mantis_common.h"
45#include "mantis_reg.h"
46#include "mantis_pci.h"
47
48#define DRIVER_NAME "Mantis Core"
49
50int __devinit mantis_pci_init(struct mantis_pci *mantis)
51{
52 u8 revision, latency;
53 struct mantis_hwconfig *config = mantis->hwconfig;
54 struct pci_dev *pdev = mantis->pdev;
55 int err, ret = 0;
56
57 dprintk(MANTIS_ERROR, 0, "found a %s PCI %s device on (%02x:%02x.%x),\n",
58 config->model_name,
59 config->dev_type,
60 mantis->pdev->bus->number,
61 PCI_SLOT(mantis->pdev->devfn),
62 PCI_FUNC(mantis->pdev->devfn));
63
64 err = pci_enable_device(pdev);
65 if (err != 0) {
66 ret = -ENODEV;
67 dprintk(MANTIS_ERROR, 1, "ERROR: PCI enable failed <%i>", err);
68 goto fail0;
69 }
70
71 err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
72 if (err != 0) {
73 dprintk(MANTIS_ERROR, 1, "ERROR: Unable to obtain 32 bit DMA <%i>", err);
74 ret = -ENOMEM;
75 goto fail1;
76 }
77
78 pci_set_master(pdev);
79
80 if (!request_mem_region(pci_resource_start(pdev, 0),
81 pci_resource_len(pdev, 0),
82 DRIVER_NAME)) {
83
84 dprintk(MANTIS_ERROR, 1, "ERROR: BAR0 Request failed !");
85 ret = -ENODEV;
86 goto fail1;
87 }
88
89 mantis->mmio = ioremap(pci_resource_start(pdev, 0),
90 pci_resource_len(pdev, 0));
91
92 if (!mantis->mmio) {
93 dprintk(MANTIS_ERROR, 1, "ERROR: BAR0 remap failed !");
94 ret = -ENODEV;
95 goto fail2;
96 }
97
98 pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency);
99 pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
100 mantis->latency = latency;
101 mantis->revision = revision;
102
103 dprintk(MANTIS_ERROR, 0, " Mantis Rev %d [%04x:%04x], ",
104 mantis->revision,
105 mantis->pdev->subsystem_vendor,
106 mantis->pdev->subsystem_device);
107
108 dprintk(MANTIS_ERROR, 0,
109 "irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p\n",
110 mantis->pdev->irq,
111 mantis->latency,
112 mantis->mantis_addr,
113 mantis->mmio);
114
115 err = request_irq(pdev->irq,
116 config->irq_handler,
117 IRQF_SHARED,
118 DRIVER_NAME,
119 mantis);
120
121 if (err != 0) {
122
123 dprintk(MANTIS_ERROR, 1, "ERROR: IRQ registration failed ! <%d>", err);
124 ret = -ENODEV;
125 goto fail3;
126 }
127
128 pci_set_drvdata(pdev, mantis);
129 return ret;
130
131 /* Error conditions */
132fail3:
133 dprintk(MANTIS_ERROR, 1, "ERROR: <%d> I/O unmap", ret);
134 if (mantis->mmio)
135 iounmap(mantis->mmio);
136
137fail2:
138 dprintk(MANTIS_ERROR, 1, "ERROR: <%d> releasing regions", ret);
139 release_mem_region(pci_resource_start(pdev, 0),
140 pci_resource_len(pdev, 0));
141
142fail1:
143 dprintk(MANTIS_ERROR, 1, "ERROR: <%d> disabling device", ret);
144 pci_disable_device(pdev);
145
146fail0:
147 dprintk(MANTIS_ERROR, 1, "ERROR: <%d> exiting", ret);
148 pci_set_drvdata(pdev, NULL);
149 return ret;
150}
151EXPORT_SYMBOL_GPL(mantis_pci_init);
152
153void mantis_pci_exit(struct mantis_pci *mantis)
154{
155 struct pci_dev *pdev = mantis->pdev;
156
157 dprintk(MANTIS_NOTICE, 1, " mem: 0x%p", mantis->mmio);
158 free_irq(pdev->irq, mantis);
159 if (mantis->mmio) {
160 iounmap(mantis->mmio);
161 release_mem_region(pci_resource_start(pdev, 0),
162 pci_resource_len(pdev, 0));
163 }
164
165 pci_disable_device(pdev);
166 pci_set_drvdata(pdev, NULL);
167}
168EXPORT_SYMBOL_GPL(mantis_pci_exit);
169
170MODULE_DESCRIPTION("Mantis PCI DTV bridge driver");
171MODULE_AUTHOR("Manu Abraham");
172MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/mantis/mantis_pci.h b/drivers/media/dvb/mantis/mantis_pci.h
new file mode 100644
index 000000000000..65f004519086
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_pci.h
@@ -0,0 +1,27 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_PCI_H
22#define __MANTIS_PCI_H
23
24extern int mantis_pci_init(struct mantis_pci *mantis);
25extern void mantis_pci_exit(struct mantis_pci *mantis);
26
27#endif /* __MANTIS_PCI_H */
diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
new file mode 100644
index 000000000000..5cb545b913f6
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
@@ -0,0 +1,120 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/kernel.h>
22
23#include <linux/signal.h>
24#include <linux/sched.h>
25#include <linux/interrupt.h>
26
27#include "dmxdev.h"
28#include "dvbdev.h"
29#include "dvb_demux.h"
30#include "dvb_frontend.h"
31#include "dvb_net.h"
32
33#include "mantis_common.h"
34#include "mantis_link.h" /* temporary due to physical layer stuff */
35#include "mantis_reg.h"
36
37/*
38 * If Slot state is already PLUG_IN event and we are called
39 * again, definitely it is jitter alone
40 */
41void mantis_event_cam_plugin(struct mantis_ca *ca)
42{
43 struct mantis_pci *mantis = ca->ca_priv;
44
45 u32 gpif_irqcfg;
46
47 if (ca->slot_state == MODULE_XTRACTED) {
48 dprintk(MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
49 udelay(50);
50 mmwrite(0xda000000, MANTIS_CARD_RESET);
51 gpif_irqcfg = mmread(MANTIS_GPIF_IRQCFG);
52 gpif_irqcfg |= MANTIS_MASK_PLUGOUT;
53 gpif_irqcfg &= ~MANTIS_MASK_PLUGIN;
54 mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
55 udelay(500);
56 ca->slot_state = MODULE_INSERTED;
57 }
58 udelay(100);
59}
60
61/*
62 * If Slot state is already UN_PLUG event and we are called
63 * again, definitely it is jitter alone
64 */
65void mantis_event_cam_unplug(struct mantis_ca *ca)
66{
67 struct mantis_pci *mantis = ca->ca_priv;
68
69 u32 gpif_irqcfg;
70
71 if (ca->slot_state == MODULE_INSERTED) {
72 dprintk(MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
73 udelay(50);
74 mmwrite(0x00da0000, MANTIS_CARD_RESET);
75 gpif_irqcfg = mmread(MANTIS_GPIF_IRQCFG);
76 gpif_irqcfg |= MANTIS_MASK_PLUGIN;
77 gpif_irqcfg &= ~MANTIS_MASK_PLUGOUT;
78 mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
79 udelay(500);
80 ca->slot_state = MODULE_XTRACTED;
81 }
82 udelay(100);
83}
84
85int mantis_pcmcia_init(struct mantis_ca *ca)
86{
87 struct mantis_pci *mantis = ca->ca_priv;
88
89 u32 gpif_stat, card_stat;
90
91 mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ0, MANTIS_INT_MASK);
92 gpif_stat = mmread(MANTIS_GPIF_STATUS);
93 card_stat = mmread(MANTIS_GPIF_IRQCFG);
94
95 if (gpif_stat & MANTIS_GPIF_DETSTAT) {
96 dprintk(MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
97 mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
98 ca->slot_state = MODULE_INSERTED;
99 dvb_ca_en50221_camchange_irq(&ca->en50221,
100 0,
101 DVB_CA_EN50221_CAMCHANGE_INSERTED);
102 } else {
103 dprintk(MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
104 mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
105 ca->slot_state = MODULE_XTRACTED;
106 dvb_ca_en50221_camchange_irq(&ca->en50221,
107 0,
108 DVB_CA_EN50221_CAMCHANGE_REMOVED);
109 }
110
111 return 0;
112}
113
114void mantis_pcmcia_exit(struct mantis_ca *ca)
115{
116 struct mantis_pci *mantis = ca->ca_priv;
117
118 mmwrite(mmread(MANTIS_GPIF_STATUS) & (~MANTIS_CARD_PLUGOUT | ~MANTIS_CARD_PLUGIN), MANTIS_GPIF_STATUS);
119 mmwrite(mmread(MANTIS_INT_MASK) & ~MANTIS_INT_IRQ0, MANTIS_INT_MASK);
120}
diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
new file mode 100644
index 000000000000..7761f9dc7fe0
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_reg.h
@@ -0,0 +1,197 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_REG_H
22#define __MANTIS_REG_H
23
24/* Interrupts */
25#define MANTIS_INT_STAT 0x00
26#define MANTIS_INT_MASK 0x04
27
28#define MANTIS_INT_RISCSTAT (0x0f << 28)
29#define MANTIS_INT_RISCEN (0x01 << 27)
30#define MANTIS_INT_I2CRACK (0x01 << 26)
31
32/* #define MANTIS_INT_GPIF (0xff << 12) */
33
34#define MANTIS_INT_PCMCIA7 (0x01 << 19)
35#define MANTIS_INT_PCMCIA6 (0x01 << 18)
36#define MANTIS_INT_PCMCIA5 (0x01 << 17)
37#define MANTIS_INT_PCMCIA4 (0x01 << 16)
38#define MANTIS_INT_PCMCIA3 (0x01 << 15)
39#define MANTIS_INT_PCMCIA2 (0x01 << 14)
40#define MANTIS_INT_PCMCIA1 (0x01 << 13)
41#define MANTIS_INT_PCMCIA0 (0x01 << 12)
42#define MANTIS_INT_IRQ1 (0x01 << 11)
43#define MANTIS_INT_IRQ0 (0x01 << 10)
44#define MANTIS_INT_OCERR (0x01 << 8)
45#define MANTIS_INT_PABORT (0x01 << 7)
46#define MANTIS_INT_RIPERR (0x01 << 6)
47#define MANTIS_INT_PPERR (0x01 << 5)
48#define MANTIS_INT_FTRGT (0x01 << 3)
49#define MANTIS_INT_RISCI (0x01 << 1)
50#define MANTIS_INT_I2CDONE (0x01 << 0)
51
52/* DMA */
53#define MANTIS_DMA_CTL 0x08
54#define MANTIS_GPIF_RD (0xff << 24)
55#define MANTIS_GPIF_WR (0xff << 16)
56#define MANTIS_CPU_DO (0x01 << 10)
57#define MANTIS_DRV_DO (0x01 << 9)
58#define MANTIS_I2C_RD (0x01 << 7)
59#define MANTIS_I2C_WR (0x01 << 6)
60#define MANTIS_DCAP_MODE (0x01 << 5)
61#define MANTIS_FIFO_TP_4 (0x00 << 3)
62#define MANTIS_FIFO_TP_8 (0x01 << 3)
63#define MANTIS_FIFO_TP_16 (0x02 << 3)
64#define MANTIS_FIFO_EN (0x01 << 2)
65#define MANTIS_DCAP_EN (0x01 << 1)
66#define MANTIS_RISC_EN (0x01 << 0)
67
68/* DEBUG */
69#define MANTIS_DEBUGREG 0x0c
70#define MANTIS_DATINV (0x0e << 7)
71#define MANTIS_TOP_DEBUGSEL (0x07 << 4)
72#define MANTIS_PCMCIA_DEBUGSEL (0x0f << 0)
73
74#define MANTIS_RISC_START 0x10
75#define MANTIS_RISC_PC 0x14
76
77/* I2C */
78#define MANTIS_I2CDATA_CTL 0x18
79#define MANTIS_I2C_RATE_1 (0x00 << 6)
80#define MANTIS_I2C_RATE_2 (0x01 << 6)
81#define MANTIS_I2C_RATE_3 (0x02 << 6)
82#define MANTIS_I2C_RATE_4 (0x03 << 6)
83#define MANTIS_I2C_STOP (0x01 << 5)
84#define MANTIS_I2C_PGMODE (0x01 << 3)
85
86/* DATA */
87#define MANTIS_CMD_DATA_R1 0x20
88#define MANTIS_CMD_DATA_3 (0xff << 24)
89#define MANTIS_CMD_DATA_2 (0xff << 16)
90#define MANTIS_CMD_DATA_1 (0xff << 8)
91#define MANTIS_CMD_DATA_0 (0xff << 0)
92
93#define MANTIS_CMD_DATA_R2 0x24
94#define MANTIS_CMD_DATA_7 (0xff << 24)
95#define MANTIS_CMD_DATA_6 (0xff << 16)
96#define MANTIS_CMD_DATA_5 (0xff << 8)
97#define MANTIS_CMD_DATA_4 (0xff << 0)
98
99#define MANTIS_CONTROL 0x28
100#define MANTIS_DET (0x01 << 7)
101#define MANTIS_DAT_CF_EN (0x01 << 6)
102#define MANTIS_ACS (0x03 << 4)
103#define MANTIS_VCCEN (0x01 << 3)
104#define MANTIS_BYPASS (0x01 << 2)
105#define MANTIS_MRST (0x01 << 1)
106#define MANTIS_CRST_INT (0x01 << 0)
107
108#define MANTIS_GPIF_CFGSLA 0x84
109#define MANTIS_GPIF_WAITSMPL (0x07 << 28)
110#define MANTIS_GPIF_BYTEADDRSUB (0x01 << 25)
111#define MANTIS_GPIF_WAITPOL (0x01 << 24)
112#define MANTIS_GPIF_NCDELAY (0x07 << 20)
113#define MANTIS_GPIF_RW2CSDELAY (0x07 << 16)
114#define MANTIS_GPIF_SLFTIMEDMODE (0x01 << 15)
115#define MANTIS_GPIF_SLFTIMEDDELY (0x7f << 8)
116#define MANTIS_GPIF_DEVTYPE (0x07 << 4)
117#define MANTIS_GPIF_BIGENDIAN (0x01 << 3)
118#define MANTIS_GPIF_FETCHCMD (0x03 << 1)
119#define MANTIS_GPIF_HWORDDEV (0x01 << 0)
120
121#define MANTIS_GPIF_WSTOPER 0x90
122#define MANTIS_GPIF_WSTOPERWREN3 (0x01 << 31)
123#define MANTIS_GPIF_PARBOOTN (0x01 << 29)
124#define MANTIS_GPIF_WSTOPERSLID3 (0x1f << 24)
125#define MANTIS_GPIF_WSTOPERWREN2 (0x01 << 23)
126#define MANTIS_GPIF_WSTOPERSLID2 (0x1f << 16)
127#define MANTIS_GPIF_WSTOPERWREN1 (0x01 << 15)
128#define MANTIS_GPIF_WSTOPERSLID1 (0x1f << 8)
129#define MANTIS_GPIF_WSTOPERWREN0 (0x01 << 7)
130#define MANTIS_GPIF_WSTOPERSLID0 (0x1f << 0)
131
132#define MANTIS_GPIF_CS2RW 0x94
133#define MANTIS_GPIF_CS2RWWREN3 (0x01 << 31)
134#define MANTIS_GPIF_CS2RWDELY3 (0x3f << 24)
135#define MANTIS_GPIF_CS2RWWREN2 (0x01 << 23)
136#define MANTIS_GPIF_CS2RWDELY2 (0x3f << 16)
137#define MANTIS_GPIF_CS2RWWREN1 (0x01 << 15)
138#define MANTIS_GPIF_CS2RWDELY1 (0x3f << 8)
139#define MANTIS_GPIF_CS2RWWREN0 (0x01 << 7)
140#define MANTIS_GPIF_CS2RWDELY0 (0x3f << 0)
141
142#define MANTIS_GPIF_IRQCFG 0x98
143#define MANTIS_GPIF_IRQPOL (0x01 << 8)
144#define MANTIS_MASK_WRACK (0x01 << 7)
145#define MANTIS_MASK_BRRDY (0x01 << 6)
146#define MANTIS_MASK_OVFLW (0x01 << 5)
147#define MANTIS_MASK_OTHERR (0x01 << 4)
148#define MANTIS_MASK_WSTO (0x01 << 3)
149#define MANTIS_MASK_EXTIRQ (0x01 << 2)
150#define MANTIS_MASK_PLUGIN (0x01 << 1)
151#define MANTIS_MASK_PLUGOUT (0x01 << 0)
152
153#define MANTIS_GPIF_STATUS 0x9c
154#define MANTIS_SBUF_KILLOP (0x01 << 15)
155#define MANTIS_SBUF_OPDONE (0x01 << 14)
156#define MANTIS_SBUF_EMPTY (0x01 << 13)
157#define MANTIS_GPIF_DETSTAT (0x01 << 9)
158#define MANTIS_GPIF_INTSTAT (0x01 << 8)
159#define MANTIS_GPIF_WRACK (0x01 << 7)
160#define MANTIS_GPIF_BRRDY (0x01 << 6)
161#define MANTIS_SBUF_OVFLW (0x01 << 5)
162#define MANTIS_GPIF_OTHERR (0x01 << 4)
163#define MANTIS_SBUF_WSTO (0x01 << 3)
164#define MANTIS_GPIF_EXTIRQ (0x01 << 2)
165#define MANTIS_CARD_PLUGIN (0x01 << 1)
166#define MANTIS_CARD_PLUGOUT (0x01 << 0)
167
168#define MANTIS_GPIF_BRADDR 0xa0
169#define MANTIS_GPIF_PCMCIAREG (0x01 << 27)
170#define MANTIS_GPIF_PCMCIAIOM (0x01 << 26)
171#define MANTIS_GPIF_BR_ADDR (0xfffffff << 0)
172
173#define MANTIS_GPIF_BRBYTES 0xa4
174#define MANTIS_GPIF_BRCNT (0xfff << 0)
175
176#define MANTIS_PCMCIA_RESET 0xa8
177#define MANTIS_PCMCIA_RSTVAL (0xff << 0)
178
179#define MANTIS_CARD_RESET 0xac
180
181#define MANTIS_GPIF_ADDR 0xb0
182#define MANTIS_GPIF_HIFRDWRN (0x01 << 31)
183#define MANTIS_GPIF_PCMCIAREG (0x01 << 27)
184#define MANTIS_GPIF_PCMCIAIOM (0x01 << 26)
185#define MANTIS_GPIF_HIFADDR (0xfffffff << 0)
186
187#define MANTIS_GPIF_DOUT 0xb4
188#define MANTIS_GPIF_HIFDOUT (0xfffffff << 0)
189
190#define MANTIS_GPIF_DIN 0xb8
191#define MANTIS_GPIF_HIFDIN (0xfffffff << 0)
192
193#define MANTIS_GPIF_SPARE 0xbc
194#define MANTIS_GPIF_LOGICRD (0xffff << 16)
195#define MANTIS_GPIF_LOGICRW (0xffff << 0)
196
197#endif /* __MANTIS_REG_H */
diff --git a/drivers/media/dvb/mantis/mantis_uart.c b/drivers/media/dvb/mantis/mantis_uart.c
new file mode 100644
index 000000000000..7d2f2398fa8b
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_uart.c
@@ -0,0 +1,186 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/kernel.h>
22#include <linux/spinlock.h>
23
24#include <linux/signal.h>
25#include <linux/sched.h>
26#include <linux/interrupt.h>
27
28#include "dmxdev.h"
29#include "dvbdev.h"
30#include "dvb_demux.h"
31#include "dvb_frontend.h"
32#include "dvb_net.h"
33
34#include "mantis_common.h"
35#include "mantis_reg.h"
36#include "mantis_uart.h"
37
38struct mantis_uart_params {
39 enum mantis_baud baud_rate;
40 enum mantis_parity parity;
41};
42
43static struct {
44 char string[7];
45} rates[5] = {
46 { "9600" },
47 { "19200" },
48 { "38400" },
49 { "57600" },
50 { "115200" }
51};
52
53static struct {
54 char string[5];
55} parity[3] = {
56 { "NONE" },
57 { "ODD" },
58 { "EVEN" }
59};
60
61#define UART_MAX_BUF 16
62
63int mantis_uart_read(struct mantis_pci *mantis, u8 *data)
64{
65 struct mantis_hwconfig *config = mantis->hwconfig;
66 u32 stat = 0, i;
67
68 /* get data */
69 for (i = 0; i < (config->bytes + 1); i++) {
70
71 stat = mmread(MANTIS_UART_STAT);
72
73 if (stat & MANTIS_UART_RXFIFO_FULL) {
74 dprintk(MANTIS_ERROR, 1, "RX Fifo FULL");
75 }
76 data[i] = mmread(MANTIS_UART_RXD) & 0x3f;
77
78 dprintk(MANTIS_DEBUG, 1, "Reading ... <%02x>", data[i] & 0x3f);
79
80 if (data[i] & (1 << 7)) {
81 dprintk(MANTIS_ERROR, 1, "UART framing error");
82 return -EINVAL;
83 }
84 if (data[i] & (1 << 6)) {
85 dprintk(MANTIS_ERROR, 1, "UART parity error");
86 return -EINVAL;
87 }
88 }
89
90 return 0;
91}
92
93static void mantis_uart_work(struct work_struct *work)
94{
95 struct mantis_pci *mantis = container_of(work, struct mantis_pci, uart_work);
96 struct mantis_hwconfig *config = mantis->hwconfig;
97 u8 buf[16];
98 int i;
99
100 mantis_uart_read(mantis, buf);
101
102 for (i = 0; i < (config->bytes + 1); i++)
103 dprintk(MANTIS_INFO, 1, "UART BUF:%d <%02x> ", i, buf[i]);
104
105 dprintk(MANTIS_DEBUG, 0, "\n");
106}
107
108static int mantis_uart_setup(struct mantis_pci *mantis,
109 struct mantis_uart_params *params)
110{
111 u32 reg;
112
113 mmwrite((mmread(MANTIS_UART_CTL) | (params->parity & 0x3)), MANTIS_UART_CTL);
114
115 reg = mmread(MANTIS_UART_BAUD);
116
117 switch (params->baud_rate) {
118 case MANTIS_BAUD_9600:
119 reg |= 0xd8;
120 break;
121 case MANTIS_BAUD_19200:
122 reg |= 0x6c;
123 break;
124 case MANTIS_BAUD_38400:
125 reg |= 0x36;
126 break;
127 case MANTIS_BAUD_57600:
128 reg |= 0x23;
129 break;
130 case MANTIS_BAUD_115200:
131 reg |= 0x11;
132 break;
133 default:
134 return -EINVAL;
135 }
136
137 mmwrite(reg, MANTIS_UART_BAUD);
138
139 return 0;
140}
141
142int mantis_uart_init(struct mantis_pci *mantis)
143{
144 struct mantis_hwconfig *config = mantis->hwconfig;
145 struct mantis_uart_params params;
146
147 /* default parity: */
148 params.baud_rate = config->baud_rate;
149 params.parity = config->parity;
150 dprintk(MANTIS_INFO, 1, "Initializing UART @ %sbps parity:%s",
151 rates[params.baud_rate].string,
152 parity[params.parity].string);
153
154 init_waitqueue_head(&mantis->uart_wq);
155 spin_lock_init(&mantis->uart_lock);
156
157 INIT_WORK(&mantis->uart_work, mantis_uart_work);
158
159 /* disable interrupt */
160 mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
161
162 mantis_uart_setup(mantis, &params);
163
164 /* default 1 byte */
165 mmwrite((mmread(MANTIS_UART_BAUD) | (config->bytes << 8)), MANTIS_UART_BAUD);
166
167 /* flush buffer */
168 mmwrite((mmread(MANTIS_UART_CTL) | MANTIS_UART_RXFLUSH), MANTIS_UART_CTL);
169
170 /* enable interrupt */
171 mmwrite(mmread(MANTIS_INT_MASK) | 0x800, MANTIS_INT_MASK);
172 mmwrite(mmread(MANTIS_UART_CTL) | MANTIS_UART_RXINT, MANTIS_UART_CTL);
173
174 schedule_work(&mantis->uart_work);
175 dprintk(MANTIS_DEBUG, 1, "UART succesfully initialized");
176
177 return 0;
178}
179EXPORT_SYMBOL_GPL(mantis_uart_init);
180
181void mantis_uart_exit(struct mantis_pci *mantis)
182{
183 /* disable interrupt */
184 mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
185}
186EXPORT_SYMBOL_GPL(mantis_uart_exit);
diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
new file mode 100644
index 000000000000..ffb62a0a5a13
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_uart.h
@@ -0,0 +1,58 @@
1/*
2 Mantis PCI bridge driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_UART_H
22#define __MANTIS_UART_H
23
24#define MANTIS_UART_CTL 0xe0
25#define MANTIS_UART_RXINT (1 << 4)
26#define MANTIS_UART_RXFLUSH (1 << 2)
27
28#define MANTIS_UART_RXD 0xe8
29#define MANTIS_UART_BAUD 0xec
30
31#define MANTIS_UART_STAT 0xf0
32#define MANTIS_UART_RXFIFO_DATA (1 << 7)
33#define MANTIS_UART_RXFIFO_EMPTY (1 << 6)
34#define MANTIS_UART_RXFIFO_FULL (1 << 3)
35#define MANTIS_UART_FRAME_ERR (1 << 2)
36#define MANTIS_UART_PARITY_ERR (1 << 1)
37#define MANTIS_UART_RXTHRESH_INT (1 << 0)
38
39enum mantis_baud {
40 MANTIS_BAUD_9600 = 0,
41 MANTIS_BAUD_19200,
42 MANTIS_BAUD_38400,
43 MANTIS_BAUD_57600,
44 MANTIS_BAUD_115200
45};
46
47enum mantis_parity {
48 MANTIS_PARITY_NONE = 0,
49 MANTIS_PARITY_EVEN,
50 MANTIS_PARITY_ODD,
51};
52
53struct mantis_pci;
54
55extern int mantis_uart_init(struct mantis_pci *mantis);
56extern void mantis_uart_exit(struct mantis_pci *mantis);
57
58#endif /* __MANTIS_UART_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
new file mode 100644
index 000000000000..4a723bda0031
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp1033.c
@@ -0,0 +1,212 @@
1/*
2 Mantis VP-1033 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "stv0299.h"
32#include "mantis_common.h"
33#include "mantis_ioc.h"
34#include "mantis_dvb.h"
35#include "mantis_vp1033.h"
36#include "mantis_reg.h"
37
38u8 lgtdqcs001f_inittab[] = {
39 0x01, 0x15,
40 0x02, 0x00,
41 0x03, 0x00,
42 0x04, 0x2a,
43 0x05, 0x85,
44 0x06, 0x02,
45 0x07, 0x00,
46 0x08, 0x00,
47 0x0c, 0x01,
48 0x0d, 0x81,
49 0x0e, 0x44,
50 0x0f, 0x94,
51 0x10, 0x3c,
52 0x11, 0x84,
53 0x12, 0xb9,
54 0x13, 0xb5,
55 0x14, 0x4f,
56 0x15, 0xc9,
57 0x16, 0x80,
58 0x17, 0x36,
59 0x18, 0xfb,
60 0x19, 0xcf,
61 0x1a, 0xbc,
62 0x1c, 0x2b,
63 0x1d, 0x27,
64 0x1e, 0x00,
65 0x1f, 0x0b,
66 0x20, 0xa1,
67 0x21, 0x60,
68 0x22, 0x00,
69 0x23, 0x00,
70 0x28, 0x00,
71 0x29, 0x28,
72 0x2a, 0x14,
73 0x2b, 0x0f,
74 0x2c, 0x09,
75 0x2d, 0x05,
76 0x31, 0x1f,
77 0x32, 0x19,
78 0x33, 0xfc,
79 0x34, 0x13,
80 0xff, 0xff,
81};
82
83#define MANTIS_MODEL_NAME "VP-1033"
84#define MANTIS_DEV_TYPE "DVB-S/DSS"
85
86int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
87 struct dvb_frontend_parameters *params)
88{
89 struct mantis_pci *mantis = fe->dvb->priv;
90 struct i2c_adapter *adapter = &mantis->adapter;
91
92 u8 buf[4];
93 u32 div;
94
95
96 struct i2c_msg msg = {.addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf)};
97
98 div = params->frequency / 250;
99
100 buf[0] = (div >> 8) & 0x7f;
101 buf[1] = div & 0xff;
102 buf[2] = 0x83;
103 buf[3] = 0xc0;
104
105 if (params->frequency < 1531000)
106 buf[3] |= 0x04;
107 else
108 buf[3] &= ~0x04;
109 if (i2c_transfer(adapter, &msg, 1) < 0) {
110 dprintk(MANTIS_ERROR, 1, "Write: I2C Transfer failed");
111 return -EIO;
112 }
113 msleep_interruptible(100);
114
115 return 0;
116}
117
118int lgtdqcs001f_set_symbol_rate(struct dvb_frontend *fe,
119 u32 srate, u32 ratio)
120{
121 u8 aclk = 0;
122 u8 bclk = 0;
123
124 if (srate < 1500000) {
125 aclk = 0xb7;
126 bclk = 0x47;
127 } else if (srate < 3000000) {
128 aclk = 0xb7;
129 bclk = 0x4b;
130 } else if (srate < 7000000) {
131 aclk = 0xb7;
132 bclk = 0x4f;
133 } else if (srate < 14000000) {
134 aclk = 0xb7;
135 bclk = 0x53;
136 } else if (srate < 30000000) {
137 aclk = 0xb6;
138 bclk = 0x53;
139 } else if (srate < 45000000) {
140 aclk = 0xb4;
141 bclk = 0x51;
142 }
143 stv0299_writereg(fe, 0x13, aclk);
144 stv0299_writereg(fe, 0x14, bclk);
145
146 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
147 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
148 stv0299_writereg(fe, 0x21, ratio & 0xf0);
149
150 return 0;
151}
152
153struct stv0299_config lgtdqcs001f_config = {
154 .demod_address = 0x68,
155 .inittab = lgtdqcs001f_inittab,
156 .mclk = 88000000UL,
157 .invert = 0,
158 .skip_reinit = 0,
159 .volt13_op0_op1 = STV0299_VOLT13_OP0,
160 .min_delay_ms = 100,
161 .set_symbol_rate = lgtdqcs001f_set_symbol_rate,
162};
163
164static int vp1033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
165{
166 struct i2c_adapter *adapter = &mantis->adapter;
167
168 int err = 0;
169
170 err = mantis_frontend_power(mantis, POWER_ON);
171 if (err == 0) {
172 mantis_frontend_soft_reset(mantis);
173 msleep(250);
174
175 dprintk(MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
176 fe = stv0299_attach(&lgtdqcs001f_config, adapter);
177
178 if (fe) {
179 fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
180 dprintk(MANTIS_ERROR, 1, "found STV0299 DVB-S frontend @ 0x%02x",
181 lgtdqcs001f_config.demod_address);
182
183 dprintk(MANTIS_ERROR, 1, "Mantis DVB-S STV0299 frontend attach success");
184 } else {
185 return -1;
186 }
187 } else {
188 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
189 adapter->name,
190 err);
191
192 return -EIO;
193 }
194 mantis->fe = fe;
195 dprintk(MANTIS_ERROR, 1, "Done!");
196
197 return 0;
198}
199
200struct mantis_hwconfig vp1033_config = {
201 .model_name = MANTIS_MODEL_NAME,
202 .dev_type = MANTIS_DEV_TYPE,
203 .ts_size = MANTIS_TS_204,
204
205 .baud_rate = MANTIS_BAUD_9600,
206 .parity = MANTIS_PARITY_NONE,
207 .bytes = 0,
208
209 .frontend_init = vp1033_frontend_init,
210 .power = GPIF_A12,
211 .reset = GPIF_A13,
212};
diff --git a/drivers/media/dvb/mantis/mantis_vp1033.h b/drivers/media/dvb/mantis/mantis_vp1033.h
new file mode 100644
index 000000000000..7daaa1bf127d
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp1033.h
@@ -0,0 +1,30 @@
1/*
2 Mantis VP-1033 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP1033_H
22#define __MANTIS_VP1033_H
23
24#include "mantis_common.h"
25
26#define MANTIS_VP_1033_DVB_S 0x0016
27
28extern struct mantis_hwconfig vp1033_config;
29
30#endif /* __MANTIS_VP1033_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
new file mode 100644
index 000000000000..8e6ae558ee57
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp1034.c
@@ -0,0 +1,119 @@
1/*
2 Mantis VP-1034 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "mb86a16.h"
32#include "mantis_common.h"
33#include "mantis_ioc.h"
34#include "mantis_dvb.h"
35#include "mantis_vp1034.h"
36#include "mantis_reg.h"
37
38struct mb86a16_config vp1034_mb86a16_config = {
39 .demod_address = 0x08,
40 .set_voltage = vp1034_set_voltage,
41};
42
43#define MANTIS_MODEL_NAME "VP-1034"
44#define MANTIS_DEV_TYPE "DVB-S/DSS"
45
46int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
47{
48 struct mantis_pci *mantis = fe->dvb->priv;
49
50 switch (voltage) {
51 case SEC_VOLTAGE_13:
52 dprintk(MANTIS_ERROR, 1, "Polarization=[13V]");
53 gpio_set_bits(mantis, 13, 1);
54 gpio_set_bits(mantis, 14, 0);
55 break;
56 case SEC_VOLTAGE_18:
57 dprintk(MANTIS_ERROR, 1, "Polarization=[18V]");
58 gpio_set_bits(mantis, 13, 1);
59 gpio_set_bits(mantis, 14, 1);
60 break;
61 case SEC_VOLTAGE_OFF:
62 dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
63 break;
64 default:
65 dprintk(MANTIS_ERROR, 1, "Invalid = (%d)", (u32) voltage);
66 return -EINVAL;
67 }
68 mmwrite(0x00, MANTIS_GPIF_DOUT);
69
70 return 0;
71}
72
73static int vp1034_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
74{
75 struct i2c_adapter *adapter = &mantis->adapter;
76
77 int err = 0;
78
79 err = mantis_frontend_power(mantis, POWER_ON);
80 if (err == 0) {
81 mantis_frontend_soft_reset(mantis);
82 msleep(250);
83
84 dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
85 fe = mb86a16_attach(&vp1034_mb86a16_config, adapter);
86 if (fe) {
87 dprintk(MANTIS_ERROR, 1,
88 "found MB86A16 DVB-S/DSS frontend @0x%02x",
89 vp1034_mb86a16_config.demod_address);
90
91 } else {
92 return -1;
93 }
94 } else {
95 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
96 adapter->name,
97 err);
98
99 return -EIO;
100 }
101 mantis->fe = fe;
102 dprintk(MANTIS_ERROR, 1, "Done!");
103
104 return 0;
105}
106
107struct mantis_hwconfig vp1034_config = {
108 .model_name = MANTIS_MODEL_NAME,
109 .dev_type = MANTIS_DEV_TYPE,
110 .ts_size = MANTIS_TS_204,
111
112 .baud_rate = MANTIS_BAUD_9600,
113 .parity = MANTIS_PARITY_NONE,
114 .bytes = 0,
115
116 .frontend_init = vp1034_frontend_init,
117 .power = GPIF_A12,
118 .reset = GPIF_A13,
119};
diff --git a/drivers/media/dvb/mantis/mantis_vp1034.h b/drivers/media/dvb/mantis/mantis_vp1034.h
new file mode 100644
index 000000000000..323f38ef8e3d
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp1034.h
@@ -0,0 +1,33 @@
1/*
2 Mantis VP-1034 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP1034_H
22#define __MANTIS_VP1034_H
23
24#include "dvb_frontend.h"
25#include "mantis_common.h"
26
27
28#define MANTIS_VP_1034_DVB_S 0x0014
29
30extern struct mantis_hwconfig vp1034_config;
31extern int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
32
33#endif /* __MANTIS_VP1034_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
new file mode 100644
index 000000000000..515346dd31d0
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp1041.c
@@ -0,0 +1,358 @@
1/*
2 Mantis VP-1041 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "mantis_common.h"
32#include "mantis_ioc.h"
33#include "mantis_dvb.h"
34#include "mantis_vp1041.h"
35#include "stb0899_reg.h"
36#include "stb0899_drv.h"
37#include "stb0899_cfg.h"
38#include "stb6100_cfg.h"
39#include "stb6100.h"
40#include "lnbp21.h"
41
42#define MANTIS_MODEL_NAME "VP-1041"
43#define MANTIS_DEV_TYPE "DSS/DVB-S/DVB-S2"
44
45static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
46
47 /* 0x0000000b, *//* SYSREG */
48 { STB0899_DEV_ID , 0x30 },
49 { STB0899_DISCNTRL1 , 0x32 },
50 { STB0899_DISCNTRL2 , 0x80 },
51 { STB0899_DISRX_ST0 , 0x04 },
52 { STB0899_DISRX_ST1 , 0x00 },
53 { STB0899_DISPARITY , 0x00 },
54 { STB0899_DISFIFO , 0x00 },
55 { STB0899_DISSTATUS , 0x20 },
56 { STB0899_DISF22 , 0x99 },
57 { STB0899_DISF22RX , 0xa8 },
58 /* SYSREG ? */
59 { STB0899_ACRPRESC , 0x11 },
60 { STB0899_ACRDIV1 , 0x0a },
61 { STB0899_ACRDIV2 , 0x05 },
62 { STB0899_DACR1 , 0x00 },
63 { STB0899_DACR2 , 0x00 },
64 { STB0899_OUTCFG , 0x00 },
65 { STB0899_MODECFG , 0x00 },
66 { STB0899_IRQSTATUS_3 , 0xfe },
67 { STB0899_IRQSTATUS_2 , 0x03 },
68 { STB0899_IRQSTATUS_1 , 0x7c },
69 { STB0899_IRQSTATUS_0 , 0xf4 },
70 { STB0899_IRQMSK_3 , 0xf3 },
71 { STB0899_IRQMSK_2 , 0xfc },
72 { STB0899_IRQMSK_1 , 0xff },
73 { STB0899_IRQMSK_0 , 0xff },
74 { STB0899_IRQCFG , 0x00 },
75 { STB0899_I2CCFG , 0x88 },
76 { STB0899_I2CRPT , 0x58 },
77 { STB0899_IOPVALUE5 , 0x00 },
78 { STB0899_IOPVALUE4 , 0x33 },
79 { STB0899_IOPVALUE3 , 0x6d },
80 { STB0899_IOPVALUE2 , 0x90 },
81 { STB0899_IOPVALUE1 , 0x60 },
82 { STB0899_IOPVALUE0 , 0x00 },
83 { STB0899_GPIO00CFG , 0x82 },
84 { STB0899_GPIO01CFG , 0x82 },
85 { STB0899_GPIO02CFG , 0x82 },
86 { STB0899_GPIO03CFG , 0x82 },
87 { STB0899_GPIO04CFG , 0x82 },
88 { STB0899_GPIO05CFG , 0x82 },
89 { STB0899_GPIO06CFG , 0x82 },
90 { STB0899_GPIO07CFG , 0x82 },
91 { STB0899_GPIO08CFG , 0x82 },
92 { STB0899_GPIO09CFG , 0x82 },
93 { STB0899_GPIO10CFG , 0x82 },
94 { STB0899_GPIO11CFG , 0x82 },
95 { STB0899_GPIO12CFG , 0x82 },
96 { STB0899_GPIO13CFG , 0x82 },
97 { STB0899_GPIO14CFG , 0x82 },
98 { STB0899_GPIO15CFG , 0x82 },
99 { STB0899_GPIO16CFG , 0x82 },
100 { STB0899_GPIO17CFG , 0x82 },
101 { STB0899_GPIO18CFG , 0x82 },
102 { STB0899_GPIO19CFG , 0x82 },
103 { STB0899_GPIO20CFG , 0x82 },
104 { STB0899_SDATCFG , 0xb8 },
105 { STB0899_SCLTCFG , 0xba },
106 { STB0899_AGCRFCFG , 0x1c }, /* 0x11 */
107 { STB0899_GPIO22 , 0x82 }, /* AGCBB2CFG */
108 { STB0899_GPIO21 , 0x91 }, /* AGCBB1CFG */
109 { STB0899_DIRCLKCFG , 0x82 },
110 { STB0899_CLKOUT27CFG , 0x7e },
111 { STB0899_STDBYCFG , 0x82 },
112 { STB0899_CS0CFG , 0x82 },
113 { STB0899_CS1CFG , 0x82 },
114 { STB0899_DISEQCOCFG , 0x20 },
115 { STB0899_GPIO32CFG , 0x82 },
116 { STB0899_GPIO33CFG , 0x82 },
117 { STB0899_GPIO34CFG , 0x82 },
118 { STB0899_GPIO35CFG , 0x82 },
119 { STB0899_GPIO36CFG , 0x82 },
120 { STB0899_GPIO37CFG , 0x82 },
121 { STB0899_GPIO38CFG , 0x82 },
122 { STB0899_GPIO39CFG , 0x82 },
123 { STB0899_NCOARSE , 0x17 }, /* 0x15 = 27 Mhz Clock, F/3 = 198MHz, F/6 = 99MHz */
124 { STB0899_SYNTCTRL , 0x02 }, /* 0x00 = CLK from CLKI, 0x02 = CLK from XTALI */
125 { STB0899_FILTCTRL , 0x00 },
126 { STB0899_SYSCTRL , 0x01 },
127 { STB0899_STOPCLK1 , 0x20 },
128 { STB0899_STOPCLK2 , 0x00 },
129 { STB0899_INTBUFSTATUS , 0x00 },
130 { STB0899_INTBUFCTRL , 0x0a },
131 { 0xffff , 0xff },
132};
133
134static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
135 { STB0899_DEMOD , 0x00 },
136 { STB0899_RCOMPC , 0xc9 },
137 { STB0899_AGC1CN , 0x01 },
138 { STB0899_AGC1REF , 0x10 },
139 { STB0899_RTC , 0x23 },
140 { STB0899_TMGCFG , 0x4e },
141 { STB0899_AGC2REF , 0x34 },
142 { STB0899_TLSR , 0x84 },
143 { STB0899_CFD , 0xf7 },
144 { STB0899_ACLC , 0x87 },
145 { STB0899_BCLC , 0x94 },
146 { STB0899_EQON , 0x41 },
147 { STB0899_LDT , 0xf1 },
148 { STB0899_LDT2 , 0xe3 },
149 { STB0899_EQUALREF , 0xb4 },
150 { STB0899_TMGRAMP , 0x10 },
151 { STB0899_TMGTHD , 0x30 },
152 { STB0899_IDCCOMP , 0xfd },
153 { STB0899_QDCCOMP , 0xff },
154 { STB0899_POWERI , 0x0c },
155 { STB0899_POWERQ , 0x0f },
156 { STB0899_RCOMP , 0x6c },
157 { STB0899_AGCIQIN , 0x80 },
158 { STB0899_AGC2I1 , 0x06 },
159 { STB0899_AGC2I2 , 0x00 },
160 { STB0899_TLIR , 0x30 },
161 { STB0899_RTF , 0x7f },
162 { STB0899_DSTATUS , 0x00 },
163 { STB0899_LDI , 0xbc },
164 { STB0899_CFRM , 0xea },
165 { STB0899_CFRL , 0x31 },
166 { STB0899_NIRM , 0x2b },
167 { STB0899_NIRL , 0x80 },
168 { STB0899_ISYMB , 0x1d },
169 { STB0899_QSYMB , 0xa6 },
170 { STB0899_SFRH , 0x2f },
171 { STB0899_SFRM , 0x68 },
172 { STB0899_SFRL , 0x40 },
173 { STB0899_SFRUPH , 0x2f },
174 { STB0899_SFRUPM , 0x68 },
175 { STB0899_SFRUPL , 0x40 },
176 { STB0899_EQUAI1 , 0x02 },
177 { STB0899_EQUAQ1 , 0xff },
178 { STB0899_EQUAI2 , 0x04 },
179 { STB0899_EQUAQ2 , 0x05 },
180 { STB0899_EQUAI3 , 0x02 },
181 { STB0899_EQUAQ3 , 0xfd },
182 { STB0899_EQUAI4 , 0x03 },
183 { STB0899_EQUAQ4 , 0x07 },
184 { STB0899_EQUAI5 , 0x08 },
185 { STB0899_EQUAQ5 , 0xf5 },
186 { STB0899_DSTATUS2 , 0x00 },
187 { STB0899_VSTATUS , 0x00 },
188 { STB0899_VERROR , 0x86 },
189 { STB0899_IQSWAP , 0x2a },
190 { STB0899_ECNT1M , 0x00 },
191 { STB0899_ECNT1L , 0x00 },
192 { STB0899_ECNT2M , 0x00 },
193 { STB0899_ECNT2L , 0x00 },
194 { STB0899_ECNT3M , 0x0a },
195 { STB0899_ECNT3L , 0xad },
196 { STB0899_FECAUTO1 , 0x06 },
197 { STB0899_FECM , 0x01 },
198 { STB0899_VTH12 , 0xb0 },
199 { STB0899_VTH23 , 0x7a },
200 { STB0899_VTH34 , 0x58 },
201 { STB0899_VTH56 , 0x38 },
202 { STB0899_VTH67 , 0x34 },
203 { STB0899_VTH78 , 0x24 },
204 { STB0899_PRVIT , 0xff },
205 { STB0899_VITSYNC , 0x19 },
206 { STB0899_RSULC , 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
207 { STB0899_TSULC , 0x42 },
208 { STB0899_RSLLC , 0x41 },
209 { STB0899_TSLPL , 0x12 },
210 { STB0899_TSCFGH , 0x0c },
211 { STB0899_TSCFGM , 0x00 },
212 { STB0899_TSCFGL , 0x00 },
213 { STB0899_TSOUT , 0x69 }, /* 0x0d for CAM */
214 { STB0899_RSSYNCDEL , 0x00 },
215 { STB0899_TSINHDELH , 0x02 },
216 { STB0899_TSINHDELM , 0x00 },
217 { STB0899_TSINHDELL , 0x00 },
218 { STB0899_TSLLSTKM , 0x1b },
219 { STB0899_TSLLSTKL , 0xb3 },
220 { STB0899_TSULSTKM , 0x00 },
221 { STB0899_TSULSTKL , 0x00 },
222 { STB0899_PCKLENUL , 0xbc },
223 { STB0899_PCKLENLL , 0xcc },
224 { STB0899_RSPCKLEN , 0xbd },
225 { STB0899_TSSTATUS , 0x90 },
226 { STB0899_ERRCTRL1 , 0xb6 },
227 { STB0899_ERRCTRL2 , 0x95 },
228 { STB0899_ERRCTRL3 , 0x8d },
229 { STB0899_DMONMSK1 , 0x27 },
230 { STB0899_DMONMSK0 , 0x03 },
231 { STB0899_DEMAPVIT , 0x5c },
232 { STB0899_PLPARM , 0x19 },
233 { STB0899_PDELCTRL , 0x48 },
234 { STB0899_PDELCTRL2 , 0x00 },
235 { STB0899_BBHCTRL1 , 0x00 },
236 { STB0899_BBHCTRL2 , 0x00 },
237 { STB0899_HYSTTHRESH , 0x77 },
238 { STB0899_MATCSTM , 0x00 },
239 { STB0899_MATCSTL , 0x00 },
240 { STB0899_UPLCSTM , 0x00 },
241 { STB0899_UPLCSTL , 0x00 },
242 { STB0899_DFLCSTM , 0x00 },
243 { STB0899_DFLCSTL , 0x00 },
244 { STB0899_SYNCCST , 0x00 },
245 { STB0899_SYNCDCSTM , 0x00 },
246 { STB0899_SYNCDCSTL , 0x00 },
247 { STB0899_ISI_ENTRY , 0x00 },
248 { STB0899_ISI_BIT_EN , 0x00 },
249 { STB0899_MATSTRM , 0xf0 },
250 { STB0899_MATSTRL , 0x02 },
251 { STB0899_UPLSTRM , 0x45 },
252 { STB0899_UPLSTRL , 0x60 },
253 { STB0899_DFLSTRM , 0xe3 },
254 { STB0899_DFLSTRL , 0x00 },
255 { STB0899_SYNCSTR , 0x47 },
256 { STB0899_SYNCDSTRM , 0x05 },
257 { STB0899_SYNCDSTRL , 0x18 },
258 { STB0899_CFGPDELSTATUS1 , 0x19 },
259 { STB0899_CFGPDELSTATUS2 , 0x2b },
260 { STB0899_BBFERRORM , 0x00 },
261 { STB0899_BBFERRORL , 0x01 },
262 { STB0899_UPKTERRORM , 0x00 },
263 { STB0899_UPKTERRORL , 0x00 },
264 { 0xffff , 0xff },
265};
266
267struct stb0899_config vp1041_stb0899_config = {
268 .init_dev = vp1041_stb0899_s1_init_1,
269 .init_s2_demod = stb0899_s2_init_2,
270 .init_s1_demod = vp1041_stb0899_s1_init_3,
271 .init_s2_fec = stb0899_s2_init_4,
272 .init_tst = stb0899_s1_init_5,
273
274 .demod_address = 0x68, /* 0xd0 >> 1 */
275
276 .xtal_freq = 27000000,
277 .inversion = IQ_SWAP_ON, /* 1 */
278
279 .lo_clk = 76500000,
280 .hi_clk = 99000000,
281
282 .esno_ave = STB0899_DVBS2_ESNO_AVE,
283 .esno_quant = STB0899_DVBS2_ESNO_QUANT,
284 .avframes_coarse = STB0899_DVBS2_AVFRAMES_COARSE,
285 .avframes_fine = STB0899_DVBS2_AVFRAMES_FINE,
286 .miss_threshold = STB0899_DVBS2_MISS_THRESHOLD,
287 .uwp_threshold_acq = STB0899_DVBS2_UWP_THRESHOLD_ACQ,
288 .uwp_threshold_track = STB0899_DVBS2_UWP_THRESHOLD_TRACK,
289 .uwp_threshold_sof = STB0899_DVBS2_UWP_THRESHOLD_SOF,
290 .sof_search_timeout = STB0899_DVBS2_SOF_SEARCH_TIMEOUT,
291
292 .btr_nco_bits = STB0899_DVBS2_BTR_NCO_BITS,
293 .btr_gain_shift_offset = STB0899_DVBS2_BTR_GAIN_SHIFT_OFFSET,
294 .crl_nco_bits = STB0899_DVBS2_CRL_NCO_BITS,
295 .ldpc_max_iter = STB0899_DVBS2_LDPC_MAX_ITER,
296
297 .tuner_get_frequency = stb6100_get_frequency,
298 .tuner_set_frequency = stb6100_set_frequency,
299 .tuner_set_bandwidth = stb6100_set_bandwidth,
300 .tuner_get_bandwidth = stb6100_get_bandwidth,
301 .tuner_set_rfsiggain = NULL,
302};
303
304struct stb6100_config vp1041_stb6100_config = {
305 .tuner_address = 0x60,
306 .refclock = 27000000,
307};
308
309static int vp1041_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
310{
311 struct i2c_adapter *adapter = &mantis->adapter;
312
313 int err = 0;
314
315 err = mantis_frontend_power(mantis, POWER_ON);
316 if (err == 0) {
317 mantis_frontend_soft_reset(mantis);
318 msleep(250);
319 mantis->fe = stb0899_attach(&vp1041_stb0899_config, adapter);
320 if (mantis->fe) {
321 dprintk(MANTIS_ERROR, 1,
322 "found STB0899 DVB-S/DVB-S2 frontend @0x%02x",
323 vp1041_stb0899_config.demod_address);
324
325 if (stb6100_attach(mantis->fe, &vp1041_stb6100_config, adapter)) {
326 if (!lnbp21_attach(mantis->fe, adapter, 0, 0))
327 dprintk(MANTIS_ERROR, 1, "No LNBP21 found!");
328 }
329 } else {
330 return -EREMOTEIO;
331 }
332 } else {
333 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
334 adapter->name,
335 err);
336
337 return -EIO;
338 }
339
340
341 dprintk(MANTIS_ERROR, 1, "Done!");
342
343 return 0;
344}
345
346struct mantis_hwconfig vp1041_config = {
347 .model_name = MANTIS_MODEL_NAME,
348 .dev_type = MANTIS_DEV_TYPE,
349 .ts_size = MANTIS_TS_188,
350
351 .baud_rate = MANTIS_BAUD_9600,
352 .parity = MANTIS_PARITY_NONE,
353 .bytes = 0,
354
355 .frontend_init = vp1041_frontend_init,
356 .power = GPIF_A12,
357 .reset = GPIF_A13,
358};
diff --git a/drivers/media/dvb/mantis/mantis_vp1041.h b/drivers/media/dvb/mantis/mantis_vp1041.h
new file mode 100644
index 000000000000..1ae5b3de8081
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp1041.h
@@ -0,0 +1,33 @@
1/*
2 Mantis VP-1041 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP1041_H
22#define __MANTIS_VP1041_H
23
24#include "mantis_common.h"
25
26#define MANTIS_VP_1041_DVB_S2 0x0031
27#define SKYSTAR_HD2_10 0x0001
28#define SKYSTAR_HD2_20 0x0003
29#define CINERGY_S2_PCI_HD 0x1179
30
31extern struct mantis_hwconfig vp1041_config;
32
33#endif /* __MANTIS_VP1041_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
new file mode 100644
index 000000000000..10ce81790a8c
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp2033.c
@@ -0,0 +1,187 @@
1/*
2 Mantis VP-2033 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "tda1002x.h"
32#include "mantis_common.h"
33#include "mantis_ioc.h"
34#include "mantis_dvb.h"
35#include "mantis_vp2033.h"
36
37#define MANTIS_MODEL_NAME "VP-2033"
38#define MANTIS_DEV_TYPE "DVB-C"
39
40struct tda1002x_config vp2033_tda1002x_cu1216_config = {
41 .demod_address = 0x18 >> 1,
42 .invert = 1,
43};
44
45struct tda10023_config vp2033_tda10023_cu1216_config = {
46 .demod_address = 0x18 >> 1,
47 .invert = 1,
48};
49
50static u8 read_pwm(struct mantis_pci *mantis)
51{
52 struct i2c_adapter *adapter = &mantis->adapter;
53
54 u8 b = 0xff;
55 u8 pwm;
56 struct i2c_msg msg[] = {
57 {.addr = 0x50, .flags = 0, .buf = &b, .len = 1},
58 {.addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1}
59 };
60
61 if ((i2c_transfer(adapter, msg, 2) != 2)
62 || (pwm == 0xff))
63 pwm = 0x48;
64
65 return pwm;
66}
67
68static int tda1002x_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
69{
70 struct mantis_pci *mantis = fe->dvb->priv;
71 struct i2c_adapter *adapter = &mantis->adapter;
72
73 u8 buf[6];
74 struct i2c_msg msg = {.addr = 0x60, .flags = 0, .buf = buf, .len = sizeof(buf)};
75 int i;
76
77#define CU1216_IF 36125000
78#define TUNER_MUL 62500
79
80 u32 div = (params->frequency + CU1216_IF + TUNER_MUL / 2) / TUNER_MUL;
81
82 buf[0] = (div >> 8) & 0x7f;
83 buf[1] = div & 0xff;
84 buf[2] = 0xce;
85 buf[3] = (params->frequency < 150000000 ? 0x01 :
86 params->frequency < 445000000 ? 0x02 : 0x04);
87 buf[4] = 0xde;
88 buf[5] = 0x20;
89
90 if (fe->ops.i2c_gate_ctrl)
91 fe->ops.i2c_gate_ctrl(fe, 1);
92
93 if (i2c_transfer(adapter, &msg, 1) != 1)
94 return -EIO;
95
96 /* wait for the pll lock */
97 msg.flags = I2C_M_RD;
98 msg.len = 1;
99 for (i = 0; i < 20; i++) {
100 if (fe->ops.i2c_gate_ctrl)
101 fe->ops.i2c_gate_ctrl(fe, 1);
102
103 if (i2c_transfer(adapter, &msg, 1) == 1 && (buf[0] & 0x40))
104 break;
105
106 msleep(10);
107 }
108
109 /* switch the charge pump to the lower current */
110 msg.flags = 0;
111 msg.len = 2;
112 msg.buf = &buf[2];
113 buf[2] &= ~0x40;
114 if (fe->ops.i2c_gate_ctrl)
115 fe->ops.i2c_gate_ctrl(fe, 1);
116
117 if (i2c_transfer(adapter, &msg, 1) != 1)
118 return -EIO;
119
120 return 0;
121}
122
123static int vp2033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
124{
125 struct i2c_adapter *adapter = &mantis->adapter;
126
127 int err = 0;
128
129 err = mantis_frontend_power(mantis, POWER_ON);
130 if (err == 0) {
131 mantis_frontend_soft_reset(mantis);
132 msleep(250);
133
134 dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
135 fe = tda10021_attach(&vp2033_tda1002x_cu1216_config,
136 adapter,
137 read_pwm(mantis));
138
139 if (fe) {
140 dprintk(MANTIS_ERROR, 1,
141 "found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
142 vp2033_tda1002x_cu1216_config.demod_address);
143 } else {
144 fe = tda10023_attach(&vp2033_tda10023_cu1216_config,
145 adapter,
146 read_pwm(mantis));
147
148 if (fe) {
149 dprintk(MANTIS_ERROR, 1,
150 "found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
151 vp2033_tda1002x_cu1216_config.demod_address);
152 }
153 }
154
155 if (fe) {
156 fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
157 dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
158 } else {
159 return -1;
160 }
161 } else {
162 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
163 adapter->name,
164 err);
165
166 return -EIO;
167 }
168
169 mantis->fe = fe;
170 dprintk(MANTIS_DEBUG, 1, "Done!");
171
172 return 0;
173}
174
175struct mantis_hwconfig vp2033_config = {
176 .model_name = MANTIS_MODEL_NAME,
177 .dev_type = MANTIS_DEV_TYPE,
178 .ts_size = MANTIS_TS_204,
179
180 .baud_rate = MANTIS_BAUD_9600,
181 .parity = MANTIS_PARITY_NONE,
182 .bytes = 0,
183
184 .frontend_init = vp2033_frontend_init,
185 .power = GPIF_A12,
186 .reset = GPIF_A13,
187};
diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
new file mode 100644
index 000000000000..c55242b79d54
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp2033.h
@@ -0,0 +1,30 @@
1/*
2 Mantis VP-2033 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP2033_H
22#define __MANTIS_VP2033_H
23
24#include "mantis_common.h"
25
26#define MANTIS_VP_2033_DVB_C 0x0008
27
28extern struct mantis_hwconfig vp2033_config;
29
30#endif /* __MANTIS_VP2033_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
new file mode 100644
index 000000000000..a7ca233e800b
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp2040.c
@@ -0,0 +1,186 @@
1/*
2 Mantis VP-2040 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "tda1002x.h"
32#include "mantis_common.h"
33#include "mantis_ioc.h"
34#include "mantis_dvb.h"
35#include "mantis_vp2040.h"
36
37#define MANTIS_MODEL_NAME "VP-2040"
38#define MANTIS_DEV_TYPE "DVB-C"
39
40struct tda1002x_config vp2040_tda1002x_cu1216_config = {
41 .demod_address = 0x18 >> 1,
42 .invert = 1,
43};
44
45struct tda10023_config vp2040_tda10023_cu1216_config = {
46 .demod_address = 0x18 >> 1,
47 .invert = 1,
48};
49
50static int tda1002x_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
51{
52 struct mantis_pci *mantis = fe->dvb->priv;
53 struct i2c_adapter *adapter = &mantis->adapter;
54
55 u8 buf[6];
56 struct i2c_msg msg = {.addr = 0x60, .flags = 0, .buf = buf, .len = sizeof(buf)};
57 int i;
58
59#define CU1216_IF 36125000
60#define TUNER_MUL 62500
61
62 u32 div = (params->frequency + CU1216_IF + TUNER_MUL / 2) / TUNER_MUL;
63
64 buf[0] = (div >> 8) & 0x7f;
65 buf[1] = div & 0xff;
66 buf[2] = 0xce;
67 buf[3] = (params->frequency < 150000000 ? 0x01 :
68 params->frequency < 445000000 ? 0x02 : 0x04);
69 buf[4] = 0xde;
70 buf[5] = 0x20;
71
72 if (fe->ops.i2c_gate_ctrl)
73 fe->ops.i2c_gate_ctrl(fe, 1);
74
75 if (i2c_transfer(adapter, &msg, 1) != 1)
76 return -EIO;
77
78 /* wait for the pll lock */
79 msg.flags = I2C_M_RD;
80 msg.len = 1;
81 for (i = 0; i < 20; i++) {
82 if (fe->ops.i2c_gate_ctrl)
83 fe->ops.i2c_gate_ctrl(fe, 1);
84
85 if (i2c_transfer(adapter, &msg, 1) == 1 && (buf[0] & 0x40))
86 break;
87
88 msleep(10);
89 }
90
91 /* switch the charge pump to the lower current */
92 msg.flags = 0;
93 msg.len = 2;
94 msg.buf = &buf[2];
95 buf[2] &= ~0x40;
96 if (fe->ops.i2c_gate_ctrl)
97 fe->ops.i2c_gate_ctrl(fe, 1);
98
99 if (i2c_transfer(adapter, &msg, 1) != 1)
100 return -EIO;
101
102 return 0;
103}
104
105static u8 read_pwm(struct mantis_pci *mantis)
106{
107 struct i2c_adapter *adapter = &mantis->adapter;
108
109 u8 b = 0xff;
110 u8 pwm;
111 struct i2c_msg msg[] = {
112 {.addr = 0x50, .flags = 0, .buf = &b, .len = 1},
113 {.addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1}
114 };
115
116 if ((i2c_transfer(adapter, msg, 2) != 2)
117 || (pwm == 0xff))
118 pwm = 0x48;
119
120 return pwm;
121}
122
123static int vp2040_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
124{
125 struct i2c_adapter *adapter = &mantis->adapter;
126
127 int err = 0;
128
129 err = mantis_frontend_power(mantis, POWER_ON);
130 if (err == 0) {
131 mantis_frontend_soft_reset(mantis);
132 msleep(250);
133
134 dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
135 fe = tda10021_attach(&vp2040_tda1002x_cu1216_config,
136 adapter,
137 read_pwm(mantis));
138
139 if (fe) {
140 dprintk(MANTIS_ERROR, 1,
141 "found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
142 vp2040_tda1002x_cu1216_config.demod_address);
143 } else {
144 fe = tda10023_attach(&vp2040_tda10023_cu1216_config,
145 adapter,
146 read_pwm(mantis));
147
148 if (fe) {
149 dprintk(MANTIS_ERROR, 1,
150 "found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
151 vp2040_tda1002x_cu1216_config.demod_address);
152 }
153 }
154
155 if (fe) {
156 fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
157 dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
158 } else {
159 return -1;
160 }
161 } else {
162 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
163 adapter->name,
164 err);
165
166 return -EIO;
167 }
168 mantis->fe = fe;
169 dprintk(MANTIS_DEBUG, 1, "Done!");
170
171 return 0;
172}
173
174struct mantis_hwconfig vp2040_config = {
175 .model_name = MANTIS_MODEL_NAME,
176 .dev_type = MANTIS_DEV_TYPE,
177 .ts_size = MANTIS_TS_204,
178
179 .baud_rate = MANTIS_BAUD_9600,
180 .parity = MANTIS_PARITY_NONE,
181 .bytes = 0,
182
183 .frontend_init = vp2040_frontend_init,
184 .power = GPIF_A12,
185 .reset = GPIF_A13,
186};
diff --git a/drivers/media/dvb/mantis/mantis_vp2040.h b/drivers/media/dvb/mantis/mantis_vp2040.h
new file mode 100644
index 000000000000..d125e219b685
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp2040.h
@@ -0,0 +1,32 @@
1/*
2 Mantis VP-2040 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP2040_H
22#define __MANTIS_VP2040_H
23
24#include "mantis_common.h"
25
26#define MANTIS_VP_2040_DVB_C 0x0043
27#define CINERGY_C 0x1178
28#define CABLESTAR_HD2 0x0002
29
30extern struct mantis_hwconfig vp2040_config;
31
32#endif /* __MANTIS_VP2040_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp3028.c b/drivers/media/dvb/mantis/mantis_vp3028.c
new file mode 100644
index 000000000000..4155c838a18a
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp3028.c
@@ -0,0 +1,38 @@
1/*
2 Mantis VP-3028 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "mantis_common.h"
22#include "mantis_vp3028.h"
23
24struct zl10353_config mantis_vp3028_config = {
25 .demod_address = 0x0f,
26};
27
28#define MANTIS_MODEL_NAME "VP-3028"
29#define MANTIS_DEV_TYPE "DVB-T"
30
31struct mantis_hwconfig vp3028_mantis_config = {
32 .model_name = MANTIS_MODEL_NAME,
33 .dev_type = MANTIS_DEV_TYPE,
34 .ts_size = MANTIS_TS_188,
35 .baud_rate = MANTIS_BAUD_9600,
36 .parity = MANTIS_PARITY_NONE,
37 .bytes = 0,
38};
diff --git a/drivers/media/dvb/mantis/mantis_vp3028.h b/drivers/media/dvb/mantis/mantis_vp3028.h
new file mode 100644
index 000000000000..b07be6adc522
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp3028.h
@@ -0,0 +1,33 @@
1/*
2 Mantis VP-3028 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP3028_H
22#define __MANTIS_VP3028_H
23
24#include "dvb_frontend.h"
25#include "mantis_common.h"
26#include "zl10353.h"
27
28#define MANTIS_VP_3028_DVB_T 0x0028
29
30extern struct zl10353_config mantis_vp3028_config;
31extern struct mantis_hwconfig vp3028_mantis_config;
32
33#endif /* __MANTIS_VP3028_H */
diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
new file mode 100644
index 000000000000..1f4334214953
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp3030.c
@@ -0,0 +1,105 @@
1/*
2 Mantis VP-3030 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <linux/signal.h>
22#include <linux/sched.h>
23#include <linux/interrupt.h>
24
25#include "dmxdev.h"
26#include "dvbdev.h"
27#include "dvb_demux.h"
28#include "dvb_frontend.h"
29#include "dvb_net.h"
30
31#include "zl10353.h"
32#include "tda665x.h"
33#include "mantis_common.h"
34#include "mantis_ioc.h"
35#include "mantis_dvb.h"
36#include "mantis_vp3030.h"
37
38struct zl10353_config mantis_vp3030_config = {
39 .demod_address = 0x0f,
40};
41
42struct tda665x_config env57h12d5_config = {
43 .name = "ENV57H12D5 (ET-50DT)",
44 .addr = 0x60,
45 .frequency_min = 47000000,
46 .frequency_max = 862000000,
47 .frequency_offst = 3616667,
48 .ref_multiplier = 6, /* 1/6 MHz */
49 .ref_divider = 100000, /* 1/6 MHz */
50};
51
52#define MANTIS_MODEL_NAME "VP-3030"
53#define MANTIS_DEV_TYPE "DVB-T"
54
55
56static int vp3030_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
57{
58 struct i2c_adapter *adapter = &mantis->adapter;
59 struct mantis_hwconfig *config = mantis->hwconfig;
60 int err = 0;
61
62 gpio_set_bits(mantis, config->reset, 0);
63 msleep(100);
64 err = mantis_frontend_power(mantis, POWER_ON);
65 msleep(100);
66 gpio_set_bits(mantis, config->reset, 1);
67
68 if (err == 0) {
69 msleep(250);
70 dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
71 fe = zl10353_attach(&mantis_vp3030_config, adapter);
72
73 if (!fe)
74 return -1;
75
76 tda665x_attach(fe, &env57h12d5_config, adapter);
77 } else {
78 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
79 adapter->name,
80 err);
81
82 return -EIO;
83
84 }
85 mantis->fe = fe;
86 dprintk(MANTIS_ERROR, 1, "Done!");
87
88 return 0;
89}
90
91struct mantis_hwconfig vp3030_config = {
92 .model_name = MANTIS_MODEL_NAME,
93 .dev_type = MANTIS_DEV_TYPE,
94 .ts_size = MANTIS_TS_188,
95
96 .baud_rate = MANTIS_BAUD_9600,
97 .parity = MANTIS_PARITY_NONE,
98 .bytes = 0,
99
100 .frontend_init = vp3030_frontend_init,
101 .power = GPIF_A12,
102 .reset = GPIF_A13,
103
104 .i2c_mode = MANTIS_BYTE_MODE
105};
diff --git a/drivers/media/dvb/mantis/mantis_vp3030.h b/drivers/media/dvb/mantis/mantis_vp3030.h
new file mode 100644
index 000000000000..5f12c4266277
--- /dev/null
+++ b/drivers/media/dvb/mantis/mantis_vp3030.h
@@ -0,0 +1,30 @@
1/*
2 Mantis VP-3030 driver
3
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#ifndef __MANTIS_VP3030_H
22#define __MANTIS_VP3030_H
23
24#include "mantis_common.h"
25
26#define MANTIS_VP_3030_DVB_T 0x0024
27
28extern struct mantis_hwconfig vp3030_config;
29
30#endif /* __MANTIS_VP3030_H */
diff --git a/drivers/media/dvb/ngene/Kconfig b/drivers/media/dvb/ngene/Kconfig
new file mode 100644
index 000000000000..3ec8e6fcbb1d
--- /dev/null
+++ b/drivers/media/dvb/ngene/Kconfig
@@ -0,0 +1,9 @@
1config DVB_NGENE
2 tristate "Micronas nGene support"
3 depends on DVB_CORE && PCI && I2C
4 select DVB_LNBP21 if !DVB_FE_CUSTOMISE
5 select DVB_STV6110x if !DVB_FE_CUSTOMISE
6 select DVB_STV090x if !DVB_FE_CUSTOMISE
7 ---help---
8 Support for Micronas PCI express cards with nGene bridge.
9
diff --git a/drivers/media/dvb/ngene/Makefile b/drivers/media/dvb/ngene/Makefile
new file mode 100644
index 000000000000..40435cad4819
--- /dev/null
+++ b/drivers/media/dvb/ngene/Makefile
@@ -0,0 +1,11 @@
1#
2# Makefile for the nGene device driver
3#
4
5ngene-objs := ngene-core.o
6
7obj-$(CONFIG_DVB_NGENE) += ngene.o
8
9EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/
10EXTRA_CFLAGS += -Idrivers/media/dvb/frontends/
11
diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c
new file mode 100644
index 000000000000..645e8b8a7137
--- /dev/null
+++ b/drivers/media/dvb/ngene/ngene-core.c
@@ -0,0 +1,2023 @@
1/*
2 * ngene.c: nGene PCIe bridge driver
3 *
4 * Copyright (C) 2005-2007 Micronas
5 *
6 * Copyright (C) 2008-2009 Ralph Metzler <rjkm@metzlerbros.de>
7 * Modifications for new nGene firmware,
8 * support for EEPROM-copying,
9 * support for new dual DVB-S2 card prototype
10 *
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * version 2 only, as published by the Free Software Foundation.
15 *
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26 * 02110-1301, USA
27 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
28 */
29
30#include <linux/module.h>
31#include <linux/init.h>
32#include <linux/delay.h>
33#include <linux/poll.h>
34#include <linux/io.h>
35#include <asm/div64.h>
36#include <linux/pci.h>
37#include <linux/pci_ids.h>
38#include <linux/smp_lock.h>
39#include <linux/timer.h>
40#include <linux/version.h>
41#include <linux/byteorder/generic.h>
42#include <linux/firmware.h>
43#include <linux/vmalloc.h>
44
45#include "ngene.h"
46
47#include "stv6110x.h"
48#include "stv090x.h"
49#include "lnbh24.h"
50
51static int one_adapter = 1;
52module_param(one_adapter, int, 0444);
53MODULE_PARM_DESC(one_adapter, "Use only one adapter.");
54
55
56static int debug;
57module_param(debug, int, 0444);
58MODULE_PARM_DESC(debug, "Print debugging information.");
59
60DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
61
62#define COMMAND_TIMEOUT_WORKAROUND
63
64#define dprintk if (debug) printk
65
66#define DEVICE_NAME "ngene"
67
68#define ngwriteb(dat, adr) writeb((dat), (char *)(dev->iomem + (adr)))
69#define ngwritel(dat, adr) writel((dat), (char *)(dev->iomem + (adr)))
70#define ngwriteb(dat, adr) writeb((dat), (char *)(dev->iomem + (adr)))
71#define ngreadl(adr) readl(dev->iomem + (adr))
72#define ngreadb(adr) readb(dev->iomem + (adr))
73#define ngcpyto(adr, src, count) memcpy_toio((char *) \
74 (dev->iomem + (adr)), (src), (count))
75#define ngcpyfrom(dst, adr, count) memcpy_fromio((dst), (char *) \
76 (dev->iomem + (adr)), (count))
77
78/****************************************************************************/
79/* nGene interrupt handler **************************************************/
80/****************************************************************************/
81
82static void event_tasklet(unsigned long data)
83{
84 struct ngene *dev = (struct ngene *)data;
85
86 while (dev->EventQueueReadIndex != dev->EventQueueWriteIndex) {
87 struct EVENT_BUFFER Event =
88 dev->EventQueue[dev->EventQueueReadIndex];
89 dev->EventQueueReadIndex =
90 (dev->EventQueueReadIndex + 1) & (EVENT_QUEUE_SIZE - 1);
91
92 if ((Event.UARTStatus & 0x01) && (dev->TxEventNotify))
93 dev->TxEventNotify(dev, Event.TimeStamp);
94 if ((Event.UARTStatus & 0x02) && (dev->RxEventNotify))
95 dev->RxEventNotify(dev, Event.TimeStamp,
96 Event.RXCharacter);
97 }
98}
99
100static void demux_tasklet(unsigned long data)
101{
102 struct ngene_channel *chan = (struct ngene_channel *)data;
103 struct SBufferHeader *Cur = chan->nextBuffer;
104
105 spin_lock_irq(&chan->state_lock);
106
107 while (Cur->ngeneBuffer.SR.Flags & 0x80) {
108 if (chan->mode & NGENE_IO_TSOUT) {
109 u32 Flags = chan->DataFormatFlags;
110 if (Cur->ngeneBuffer.SR.Flags & 0x20)
111 Flags |= BEF_OVERFLOW;
112 if (chan->pBufferExchange) {
113 if (!chan->pBufferExchange(chan,
114 Cur->Buffer1,
115 chan->Capture1Length,
116 Cur->ngeneBuffer.SR.
117 Clock, Flags)) {
118 /*
119 We didn't get data
120 Clear in service flag to make sure we
121 get called on next interrupt again.
122 leave fill/empty (0x80) flag alone
123 to avoid hardware running out of
124 buffers during startup, we hold only
125 in run state ( the source may be late
126 delivering data )
127 */
128
129 if (chan->HWState == HWSTATE_RUN) {
130 Cur->ngeneBuffer.SR.Flags &=
131 ~0x40;
132 break;
133 /* Stop proccessing stream */
134 }
135 } else {
136 /* We got a valid buffer,
137 so switch to run state */
138 chan->HWState = HWSTATE_RUN;
139 }
140 } else {
141 printk(KERN_ERR DEVICE_NAME ": OOPS\n");
142 if (chan->HWState == HWSTATE_RUN) {
143 Cur->ngeneBuffer.SR.Flags &= ~0x40;
144 break; /* Stop proccessing stream */
145 }
146 }
147 if (chan->AudioDTOUpdated) {
148 printk(KERN_INFO DEVICE_NAME
149 ": Update AudioDTO = %d\n",
150 chan->AudioDTOValue);
151 Cur->ngeneBuffer.SR.DTOUpdate =
152 chan->AudioDTOValue;
153 chan->AudioDTOUpdated = 0;
154 }
155 } else {
156 if (chan->HWState == HWSTATE_RUN) {
157 u32 Flags = 0;
158 if (Cur->ngeneBuffer.SR.Flags & 0x01)
159 Flags |= BEF_EVEN_FIELD;
160 if (Cur->ngeneBuffer.SR.Flags & 0x20)
161 Flags |= BEF_OVERFLOW;
162 if (chan->pBufferExchange)
163 chan->pBufferExchange(chan,
164 Cur->Buffer1,
165 chan->
166 Capture1Length,
167 Cur->ngeneBuffer.
168 SR.Clock, Flags);
169 if (chan->pBufferExchange2)
170 chan->pBufferExchange2(chan,
171 Cur->Buffer2,
172 chan->
173 Capture2Length,
174 Cur->ngeneBuffer.
175 SR.Clock, Flags);
176 } else if (chan->HWState != HWSTATE_STOP)
177 chan->HWState = HWSTATE_RUN;
178 }
179 Cur->ngeneBuffer.SR.Flags = 0x00;
180 Cur = Cur->Next;
181 }
182 chan->nextBuffer = Cur;
183
184 spin_unlock_irq(&chan->state_lock);
185}
186
187static irqreturn_t irq_handler(int irq, void *dev_id)
188{
189 struct ngene *dev = (struct ngene *)dev_id;
190 u32 icounts = 0;
191 irqreturn_t rc = IRQ_NONE;
192 u32 i = MAX_STREAM;
193 u8 *tmpCmdDoneByte;
194
195 if (dev->BootFirmware) {
196 icounts = ngreadl(NGENE_INT_COUNTS);
197 if (icounts != dev->icounts) {
198 ngwritel(0, FORCE_NMI);
199 dev->cmd_done = 1;
200 wake_up(&dev->cmd_wq);
201 dev->icounts = icounts;
202 rc = IRQ_HANDLED;
203 }
204 return rc;
205 }
206
207 ngwritel(0, FORCE_NMI);
208
209 spin_lock(&dev->cmd_lock);
210 tmpCmdDoneByte = dev->CmdDoneByte;
211 if (tmpCmdDoneByte &&
212 (*tmpCmdDoneByte ||
213 (dev->ngenetohost[0] == 1 && dev->ngenetohost[1] != 0))) {
214 dev->CmdDoneByte = NULL;
215 dev->cmd_done = 1;
216 wake_up(&dev->cmd_wq);
217 rc = IRQ_HANDLED;
218 }
219 spin_unlock(&dev->cmd_lock);
220
221 if (dev->EventBuffer->EventStatus & 0x80) {
222 u8 nextWriteIndex =
223 (dev->EventQueueWriteIndex + 1) &
224 (EVENT_QUEUE_SIZE - 1);
225 if (nextWriteIndex != dev->EventQueueReadIndex) {
226 dev->EventQueue[dev->EventQueueWriteIndex] =
227 *(dev->EventBuffer);
228 dev->EventQueueWriteIndex = nextWriteIndex;
229 } else {
230 printk(KERN_ERR DEVICE_NAME ": event overflow\n");
231 dev->EventQueueOverflowCount += 1;
232 dev->EventQueueOverflowFlag = 1;
233 }
234 dev->EventBuffer->EventStatus &= ~0x80;
235 tasklet_schedule(&dev->event_tasklet);
236 rc = IRQ_HANDLED;
237 }
238
239 while (i > 0) {
240 i--;
241 spin_lock(&dev->channel[i].state_lock);
242 /* if (dev->channel[i].State>=KSSTATE_RUN) { */
243 if (dev->channel[i].nextBuffer) {
244 if ((dev->channel[i].nextBuffer->
245 ngeneBuffer.SR.Flags & 0xC0) == 0x80) {
246 dev->channel[i].nextBuffer->
247 ngeneBuffer.SR.Flags |= 0x40;
248 tasklet_schedule(
249 &dev->channel[i].demux_tasklet);
250 rc = IRQ_HANDLED;
251 }
252 }
253 spin_unlock(&dev->channel[i].state_lock);
254 }
255
256 /* Request might have been processed by a previous call. */
257 return IRQ_HANDLED;
258}
259
260/****************************************************************************/
261/* nGene command interface **************************************************/
262/****************************************************************************/
263
264static void dump_command_io(struct ngene *dev)
265{
266 u8 buf[8], *b;
267
268 ngcpyfrom(buf, HOST_TO_NGENE, 8);
269 printk(KERN_ERR "host_to_ngene (%04x): %02x %02x %02x %02x %02x %02x %02x %02x\n",
270 HOST_TO_NGENE, buf[0], buf[1], buf[2], buf[3],
271 buf[4], buf[5], buf[6], buf[7]);
272
273 ngcpyfrom(buf, NGENE_TO_HOST, 8);
274 printk(KERN_ERR "ngene_to_host (%04x): %02x %02x %02x %02x %02x %02x %02x %02x\n",
275 NGENE_TO_HOST, buf[0], buf[1], buf[2], buf[3],
276 buf[4], buf[5], buf[6], buf[7]);
277
278 b = dev->hosttongene;
279 printk(KERN_ERR "dev->hosttongene (%p): %02x %02x %02x %02x %02x %02x %02x %02x\n",
280 b, b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
281
282 b = dev->ngenetohost;
283 printk(KERN_ERR "dev->ngenetohost (%p): %02x %02x %02x %02x %02x %02x %02x %02x\n",
284 b, b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
285}
286
287static int ngene_command_mutex(struct ngene *dev, struct ngene_command *com)
288{
289 int ret;
290 u8 *tmpCmdDoneByte;
291
292 dev->cmd_done = 0;
293
294 if (com->cmd.hdr.Opcode == CMD_FWLOAD_PREPARE) {
295 dev->BootFirmware = 1;
296 dev->icounts = ngreadl(NGENE_INT_COUNTS);
297 ngwritel(0, NGENE_COMMAND);
298 ngwritel(0, NGENE_COMMAND_HI);
299 ngwritel(0, NGENE_STATUS);
300 ngwritel(0, NGENE_STATUS_HI);
301 ngwritel(0, NGENE_EVENT);
302 ngwritel(0, NGENE_EVENT_HI);
303 } else if (com->cmd.hdr.Opcode == CMD_FWLOAD_FINISH) {
304 u64 fwio = dev->PAFWInterfaceBuffer;
305
306 ngwritel(fwio & 0xffffffff, NGENE_COMMAND);
307 ngwritel(fwio >> 32, NGENE_COMMAND_HI);
308 ngwritel((fwio + 256) & 0xffffffff, NGENE_STATUS);
309 ngwritel((fwio + 256) >> 32, NGENE_STATUS_HI);
310 ngwritel((fwio + 512) & 0xffffffff, NGENE_EVENT);
311 ngwritel((fwio + 512) >> 32, NGENE_EVENT_HI);
312 }
313
314 memcpy(dev->FWInterfaceBuffer, com->cmd.raw8, com->in_len + 2);
315
316 if (dev->BootFirmware)
317 ngcpyto(HOST_TO_NGENE, com->cmd.raw8, com->in_len + 2);
318
319 spin_lock_irq(&dev->cmd_lock);
320 tmpCmdDoneByte = dev->ngenetohost + com->out_len;
321 if (!com->out_len)
322 tmpCmdDoneByte++;
323 *tmpCmdDoneByte = 0;
324 dev->ngenetohost[0] = 0;
325 dev->ngenetohost[1] = 0;
326 dev->CmdDoneByte = tmpCmdDoneByte;
327 spin_unlock_irq(&dev->cmd_lock);
328
329 /* Notify 8051. */
330 ngwritel(1, FORCE_INT);
331
332 ret = wait_event_timeout(dev->cmd_wq, dev->cmd_done == 1, 2 * HZ);
333 if (!ret) {
334 /*ngwritel(0, FORCE_NMI);*/
335
336 printk(KERN_ERR DEVICE_NAME
337 ": Command timeout cmd=%02x prev=%02x\n",
338 com->cmd.hdr.Opcode, dev->prev_cmd);
339 dump_command_io(dev);
340 return -1;
341 }
342 if (com->cmd.hdr.Opcode == CMD_FWLOAD_FINISH)
343 dev->BootFirmware = 0;
344
345 dev->prev_cmd = com->cmd.hdr.Opcode;
346
347 if (!com->out_len)
348 return 0;
349
350 memcpy(com->cmd.raw8, dev->ngenetohost, com->out_len);
351
352 return 0;
353}
354
355static int ngene_command(struct ngene *dev, struct ngene_command *com)
356{
357 int result;
358
359 down(&dev->cmd_mutex);
360 result = ngene_command_mutex(dev, com);
361 up(&dev->cmd_mutex);
362 return result;
363}
364
365
366static int ngene_command_i2c_read(struct ngene *dev, u8 adr,
367 u8 *out, u8 outlen, u8 *in, u8 inlen, int flag)
368{
369 struct ngene_command com;
370
371 com.cmd.hdr.Opcode = CMD_I2C_READ;
372 com.cmd.hdr.Length = outlen + 3;
373 com.cmd.I2CRead.Device = adr << 1;
374 memcpy(com.cmd.I2CRead.Data, out, outlen);
375 com.cmd.I2CRead.Data[outlen] = inlen;
376 com.cmd.I2CRead.Data[outlen + 1] = 0;
377 com.in_len = outlen + 3;
378 com.out_len = inlen + 1;
379
380 if (ngene_command(dev, &com) < 0)
381 return -EIO;
382
383 if ((com.cmd.raw8[0] >> 1) != adr)
384 return -EIO;
385
386 if (flag)
387 memcpy(in, com.cmd.raw8, inlen + 1);
388 else
389 memcpy(in, com.cmd.raw8 + 1, inlen);
390 return 0;
391}
392
393static int ngene_command_i2c_write(struct ngene *dev, u8 adr,
394 u8 *out, u8 outlen)
395{
396 struct ngene_command com;
397
398
399 com.cmd.hdr.Opcode = CMD_I2C_WRITE;
400 com.cmd.hdr.Length = outlen + 1;
401 com.cmd.I2CRead.Device = adr << 1;
402 memcpy(com.cmd.I2CRead.Data, out, outlen);
403 com.in_len = outlen + 1;
404 com.out_len = 1;
405
406 if (ngene_command(dev, &com) < 0)
407 return -EIO;
408
409 if (com.cmd.raw8[0] == 1)
410 return -EIO;
411
412 return 0;
413}
414
415static int ngene_command_load_firmware(struct ngene *dev,
416 u8 *ngene_fw, u32 size)
417{
418#define FIRSTCHUNK (1024)
419 u32 cleft;
420 struct ngene_command com;
421
422 com.cmd.hdr.Opcode = CMD_FWLOAD_PREPARE;
423 com.cmd.hdr.Length = 0;
424 com.in_len = 0;
425 com.out_len = 0;
426
427 ngene_command(dev, &com);
428
429 cleft = (size + 3) & ~3;
430 if (cleft > FIRSTCHUNK) {
431 ngcpyto(PROGRAM_SRAM + FIRSTCHUNK, ngene_fw + FIRSTCHUNK,
432 cleft - FIRSTCHUNK);
433 cleft = FIRSTCHUNK;
434 }
435 ngcpyto(DATA_FIFO_AREA, ngene_fw, cleft);
436
437 memset(&com, 0, sizeof(struct ngene_command));
438 com.cmd.hdr.Opcode = CMD_FWLOAD_FINISH;
439 com.cmd.hdr.Length = 4;
440 com.cmd.FWLoadFinish.Address = DATA_FIFO_AREA;
441 com.cmd.FWLoadFinish.Length = (unsigned short)cleft;
442 com.in_len = 4;
443 com.out_len = 0;
444
445 return ngene_command(dev, &com);
446}
447
448
449static int ngene_command_config_buf(struct ngene *dev, u8 config)
450{
451 struct ngene_command com;
452
453 com.cmd.hdr.Opcode = CMD_CONFIGURE_BUFFER;
454 com.cmd.hdr.Length = 1;
455 com.cmd.ConfigureBuffers.config = config;
456 com.in_len = 1;
457 com.out_len = 0;
458
459 if (ngene_command(dev, &com) < 0)
460 return -EIO;
461 return 0;
462}
463
464static int ngene_command_config_free_buf(struct ngene *dev, u8 *config)
465{
466 struct ngene_command com;
467
468 com.cmd.hdr.Opcode = CMD_CONFIGURE_FREE_BUFFER;
469 com.cmd.hdr.Length = 6;
470 memcpy(&com.cmd.ConfigureBuffers.config, config, 6);
471 com.in_len = 6;
472 com.out_len = 0;
473
474 if (ngene_command(dev, &com) < 0)
475 return -EIO;
476
477 return 0;
478}
479
480static int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level)
481{
482 struct ngene_command com;
483
484 com.cmd.hdr.Opcode = CMD_SET_GPIO_PIN;
485 com.cmd.hdr.Length = 1;
486 com.cmd.SetGpioPin.select = select | (level << 7);
487 com.in_len = 1;
488 com.out_len = 0;
489
490 return ngene_command(dev, &com);
491}
492
493
494/*
495 02000640 is sample on rising edge.
496 02000740 is sample on falling edge.
497 02000040 is ignore "valid" signal
498
499 0: FD_CTL1 Bit 7,6 must be 0,1
500 7 disable(fw controlled)
501 6 0-AUX,1-TS
502 5 0-par,1-ser
503 4 0-lsb/1-msb
504 3,2 reserved
505 1,0 0-no sync, 1-use ext. start, 2-use 0x47, 3-both
506 1: FD_CTL2 has 3-valid must be hi, 2-use valid, 1-edge
507 2: FD_STA is read-only. 0-sync
508 3: FD_INSYNC is number of 47s to trigger "in sync".
509 4: FD_OUTSYNC is number of 47s to trigger "out of sync".
510 5: FD_MAXBYTE1 is low-order of bytes per packet.
511 6: FD_MAXBYTE2 is high-order of bytes per packet.
512 7: Top byte is unused.
513*/
514
515/****************************************************************************/
516
517static u8 TSFeatureDecoderSetup[8 * 4] = {
518 0x42, 0x00, 0x00, 0x02, 0x02, 0xbc, 0x00, 0x00,
519 0x40, 0x06, 0x00, 0x02, 0x02, 0xbc, 0x00, 0x00, /* DRXH */
520 0x71, 0x07, 0x00, 0x02, 0x02, 0xbc, 0x00, 0x00, /* DRXHser */
521 0x72, 0x06, 0x00, 0x02, 0x02, 0xbc, 0x00, 0x00, /* S2ser */
522};
523
524/* Set NGENE I2S Config to 16 bit packed */
525static u8 I2SConfiguration[] = {
526 0x00, 0x10, 0x00, 0x00,
527 0x80, 0x10, 0x00, 0x00,
528};
529
530static u8 SPDIFConfiguration[10] = {
531 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
532};
533
534/* Set NGENE I2S Config to transport stream compatible mode */
535
536static u8 TS_I2SConfiguration[4] = { 0x3E, 0x1A, 0x00, 0x00 }; /*3e 18 00 00 ?*/
537
538static u8 TS_I2SOutConfiguration[4] = { 0x80, 0x20, 0x00, 0x00 };
539
540static u8 ITUDecoderSetup[4][16] = {
541 {0x1c, 0x13, 0x01, 0x68, 0x3d, 0x90, 0x14, 0x20, /* SDTV */
542 0x00, 0x00, 0x01, 0xb0, 0x9c, 0x00, 0x00, 0x00},
543 {0x9c, 0x03, 0x23, 0xC0, 0x60, 0x0E, 0x13, 0x00,
544 0x00, 0x00, 0x00, 0x01, 0xB0, 0x00, 0x00, 0x00},
545 {0x9f, 0x00, 0x23, 0xC0, 0x60, 0x0F, 0x13, 0x00, /* HDTV 1080i50 */
546 0x00, 0x00, 0x00, 0x01, 0xB0, 0x00, 0x00, 0x00},
547 {0x9c, 0x01, 0x23, 0xC0, 0x60, 0x0E, 0x13, 0x00, /* HDTV 1080i60 */
548 0x00, 0x00, 0x00, 0x01, 0xB0, 0x00, 0x00, 0x00},
549};
550
551/*
552 * 50 48 60 gleich
553 * 27p50 9f 00 22 80 42 69 18 ...
554 * 27p60 93 00 22 80 82 69 1c ...
555 */
556
557/* Maxbyte to 1144 (for raw data) */
558static u8 ITUFeatureDecoderSetup[8] = {
559 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x04, 0x00
560};
561
562static void FillTSBuffer(void *Buffer, int Length, u32 Flags)
563{
564 u32 *ptr = Buffer;
565
566 memset(Buffer, 0xff, Length);
567 while (Length > 0) {
568 if (Flags & DF_SWAP32)
569 *ptr = 0x471FFF10;
570 else
571 *ptr = 0x10FF1F47;
572 ptr += (188 / 4);
573 Length -= 188;
574 }
575}
576
577
578static void flush_buffers(struct ngene_channel *chan)
579{
580 u8 val;
581
582 do {
583 msleep(1);
584 spin_lock_irq(&chan->state_lock);
585 val = chan->nextBuffer->ngeneBuffer.SR.Flags & 0x80;
586 spin_unlock_irq(&chan->state_lock);
587 } while (val);
588}
589
590static void clear_buffers(struct ngene_channel *chan)
591{
592 struct SBufferHeader *Cur = chan->nextBuffer;
593
594 do {
595 memset(&Cur->ngeneBuffer.SR, 0, sizeof(Cur->ngeneBuffer.SR));
596 if (chan->mode & NGENE_IO_TSOUT)
597 FillTSBuffer(Cur->Buffer1,
598 chan->Capture1Length,
599 chan->DataFormatFlags);
600 Cur = Cur->Next;
601 } while (Cur != chan->nextBuffer);
602
603 if (chan->mode & NGENE_IO_TSOUT) {
604 chan->nextBuffer->ngeneBuffer.SR.DTOUpdate =
605 chan->AudioDTOValue;
606 chan->AudioDTOUpdated = 0;
607
608 Cur = chan->TSIdleBuffer.Head;
609
610 do {
611 memset(&Cur->ngeneBuffer.SR, 0,
612 sizeof(Cur->ngeneBuffer.SR));
613 FillTSBuffer(Cur->Buffer1,
614 chan->Capture1Length,
615 chan->DataFormatFlags);
616 Cur = Cur->Next;
617 } while (Cur != chan->TSIdleBuffer.Head);
618 }
619}
620
621static int ngene_command_stream_control(struct ngene *dev, u8 stream,
622 u8 control, u8 mode, u8 flags)
623{
624 struct ngene_channel *chan = &dev->channel[stream];
625 struct ngene_command com;
626 u16 BsUVI = ((stream & 1) ? 0x9400 : 0x9300);
627 u16 BsSDI = ((stream & 1) ? 0x9600 : 0x9500);
628 u16 BsSPI = ((stream & 1) ? 0x9800 : 0x9700);
629 u16 BsSDO = 0x9B00;
630
631 /* down(&dev->stream_mutex); */
632 while (down_trylock(&dev->stream_mutex)) {
633 printk(KERN_INFO DEVICE_NAME ": SC locked\n");
634 msleep(1);
635 }
636 memset(&com, 0, sizeof(com));
637 com.cmd.hdr.Opcode = CMD_CONTROL;
638 com.cmd.hdr.Length = sizeof(struct FW_STREAM_CONTROL) - 2;
639 com.cmd.StreamControl.Stream = stream | (control ? 8 : 0);
640 if (chan->mode & NGENE_IO_TSOUT)
641 com.cmd.StreamControl.Stream |= 0x07;
642 com.cmd.StreamControl.Control = control |
643 (flags & SFLAG_ORDER_LUMA_CHROMA);
644 com.cmd.StreamControl.Mode = mode;
645 com.in_len = sizeof(struct FW_STREAM_CONTROL);
646 com.out_len = 0;
647
648 dprintk(KERN_INFO DEVICE_NAME
649 ": Stream=%02x, Control=%02x, Mode=%02x\n",
650 com.cmd.StreamControl.Stream, com.cmd.StreamControl.Control,
651 com.cmd.StreamControl.Mode);
652
653 chan->Mode = mode;
654
655 if (!(control & 0x80)) {
656 spin_lock_irq(&chan->state_lock);
657 if (chan->State == KSSTATE_RUN) {
658 chan->State = KSSTATE_ACQUIRE;
659 chan->HWState = HWSTATE_STOP;
660 spin_unlock_irq(&chan->state_lock);
661 if (ngene_command(dev, &com) < 0) {
662 up(&dev->stream_mutex);
663 return -1;
664 }
665 /* clear_buffers(chan); */
666 flush_buffers(chan);
667 up(&dev->stream_mutex);
668 return 0;
669 }
670 spin_unlock_irq(&chan->state_lock);
671 up(&dev->stream_mutex);
672 return 0;
673 }
674
675 if (mode & SMODE_AUDIO_CAPTURE) {
676 com.cmd.StreamControl.CaptureBlockCount =
677 chan->Capture1Length / AUDIO_BLOCK_SIZE;
678 com.cmd.StreamControl.Buffer_Address = chan->RingBuffer.PAHead;
679 } else if (mode & SMODE_TRANSPORT_STREAM) {
680 com.cmd.StreamControl.CaptureBlockCount =
681 chan->Capture1Length / TS_BLOCK_SIZE;
682 com.cmd.StreamControl.MaxLinesPerField =
683 chan->Capture1Length / TS_BLOCK_SIZE;
684 com.cmd.StreamControl.Buffer_Address =
685 chan->TSRingBuffer.PAHead;
686 if (chan->mode & NGENE_IO_TSOUT) {
687 com.cmd.StreamControl.BytesPerVBILine =
688 chan->Capture1Length / TS_BLOCK_SIZE;
689 com.cmd.StreamControl.Stream |= 0x07;
690 }
691 } else {
692 com.cmd.StreamControl.BytesPerVideoLine = chan->nBytesPerLine;
693 com.cmd.StreamControl.MaxLinesPerField = chan->nLines;
694 com.cmd.StreamControl.MinLinesPerField = 100;
695 com.cmd.StreamControl.Buffer_Address = chan->RingBuffer.PAHead;
696
697 if (mode & SMODE_VBI_CAPTURE) {
698 com.cmd.StreamControl.MaxVBILinesPerField =
699 chan->nVBILines;
700 com.cmd.StreamControl.MinVBILinesPerField = 0;
701 com.cmd.StreamControl.BytesPerVBILine =
702 chan->nBytesPerVBILine;
703 }
704 if (flags & SFLAG_COLORBAR)
705 com.cmd.StreamControl.Stream |= 0x04;
706 }
707
708 spin_lock_irq(&chan->state_lock);
709 if (mode & SMODE_AUDIO_CAPTURE) {
710 chan->nextBuffer = chan->RingBuffer.Head;
711 if (mode & SMODE_AUDIO_SPDIF) {
712 com.cmd.StreamControl.SetupDataLen =
713 sizeof(SPDIFConfiguration);
714 com.cmd.StreamControl.SetupDataAddr = BsSPI;
715 memcpy(com.cmd.StreamControl.SetupData,
716 SPDIFConfiguration, sizeof(SPDIFConfiguration));
717 } else {
718 com.cmd.StreamControl.SetupDataLen = 4;
719 com.cmd.StreamControl.SetupDataAddr = BsSDI;
720 memcpy(com.cmd.StreamControl.SetupData,
721 I2SConfiguration +
722 4 * dev->card_info->i2s[stream], 4);
723 }
724 } else if (mode & SMODE_TRANSPORT_STREAM) {
725 chan->nextBuffer = chan->TSRingBuffer.Head;
726 if (stream >= STREAM_AUDIOIN1) {
727 if (chan->mode & NGENE_IO_TSOUT) {
728 com.cmd.StreamControl.SetupDataLen =
729 sizeof(TS_I2SOutConfiguration);
730 com.cmd.StreamControl.SetupDataAddr = BsSDO;
731 memcpy(com.cmd.StreamControl.SetupData,
732 TS_I2SOutConfiguration,
733 sizeof(TS_I2SOutConfiguration));
734 } else {
735 com.cmd.StreamControl.SetupDataLen =
736 sizeof(TS_I2SConfiguration);
737 com.cmd.StreamControl.SetupDataAddr = BsSDI;
738 memcpy(com.cmd.StreamControl.SetupData,
739 TS_I2SConfiguration,
740 sizeof(TS_I2SConfiguration));
741 }
742 } else {
743 com.cmd.StreamControl.SetupDataLen = 8;
744 com.cmd.StreamControl.SetupDataAddr = BsUVI + 0x10;
745 memcpy(com.cmd.StreamControl.SetupData,
746 TSFeatureDecoderSetup +
747 8 * dev->card_info->tsf[stream], 8);
748 }
749 } else {
750 chan->nextBuffer = chan->RingBuffer.Head;
751 com.cmd.StreamControl.SetupDataLen =
752 16 + sizeof(ITUFeatureDecoderSetup);
753 com.cmd.StreamControl.SetupDataAddr = BsUVI;
754 memcpy(com.cmd.StreamControl.SetupData,
755 ITUDecoderSetup[chan->itumode], 16);
756 memcpy(com.cmd.StreamControl.SetupData + 16,
757 ITUFeatureDecoderSetup, sizeof(ITUFeatureDecoderSetup));
758 }
759 clear_buffers(chan);
760 chan->State = KSSTATE_RUN;
761 if (mode & SMODE_TRANSPORT_STREAM)
762 chan->HWState = HWSTATE_RUN;
763 else
764 chan->HWState = HWSTATE_STARTUP;
765 spin_unlock_irq(&chan->state_lock);
766
767 if (ngene_command(dev, &com) < 0) {
768 up(&dev->stream_mutex);
769 return -1;
770 }
771 up(&dev->stream_mutex);
772 return 0;
773}
774
775
776/****************************************************************************/
777/* I2C **********************************************************************/
778/****************************************************************************/
779
780static void ngene_i2c_set_bus(struct ngene *dev, int bus)
781{
782 if (!(dev->card_info->i2c_access & 2))
783 return;
784 if (dev->i2c_current_bus == bus)
785 return;
786
787 switch (bus) {
788 case 0:
789 ngene_command_gpio_set(dev, 3, 0);
790 ngene_command_gpio_set(dev, 2, 1);
791 break;
792
793 case 1:
794 ngene_command_gpio_set(dev, 2, 0);
795 ngene_command_gpio_set(dev, 3, 1);
796 break;
797 }
798 dev->i2c_current_bus = bus;
799}
800
801static int ngene_i2c_master_xfer(struct i2c_adapter *adapter,
802 struct i2c_msg msg[], int num)
803{
804 struct ngene_channel *chan =
805 (struct ngene_channel *)i2c_get_adapdata(adapter);
806 struct ngene *dev = chan->dev;
807
808 down(&dev->i2c_switch_mutex);
809 ngene_i2c_set_bus(dev, chan->number);
810
811 if (num == 2 && msg[1].flags & I2C_M_RD && !(msg[0].flags & I2C_M_RD))
812 if (!ngene_command_i2c_read(dev, msg[0].addr,
813 msg[0].buf, msg[0].len,
814 msg[1].buf, msg[1].len, 0))
815 goto done;
816
817 if (num == 1 && !(msg[0].flags & I2C_M_RD))
818 if (!ngene_command_i2c_write(dev, msg[0].addr,
819 msg[0].buf, msg[0].len))
820 goto done;
821 if (num == 1 && (msg[0].flags & I2C_M_RD))
822 if (!ngene_command_i2c_read(dev, msg[0].addr, 0, 0,
823 msg[0].buf, msg[0].len, 0))
824 goto done;
825
826 up(&dev->i2c_switch_mutex);
827 return -EIO;
828
829done:
830 up(&dev->i2c_switch_mutex);
831 return num;
832}
833
834
835static u32 ngene_i2c_functionality(struct i2c_adapter *adap)
836{
837 return I2C_FUNC_SMBUS_EMUL;
838}
839
840static struct i2c_algorithm ngene_i2c_algo = {
841 .master_xfer = ngene_i2c_master_xfer,
842 .functionality = ngene_i2c_functionality,
843};
844
845static int ngene_i2c_init(struct ngene *dev, int dev_nr)
846{
847 struct i2c_adapter *adap = &(dev->channel[dev_nr].i2c_adapter);
848
849 i2c_set_adapdata(adap, &(dev->channel[dev_nr]));
850 adap->class = I2C_CLASS_TV_DIGITAL | I2C_CLASS_TV_ANALOG;
851
852 strcpy(adap->name, "nGene");
853
854 adap->algo = &ngene_i2c_algo;
855 adap->algo_data = (void *)&(dev->channel[dev_nr]);
856 adap->dev.parent = &dev->pci_dev->dev;
857
858 return i2c_add_adapter(adap);
859}
860
861
862/****************************************************************************/
863/* DVB functions and API interface ******************************************/
864/****************************************************************************/
865
866static void swap_buffer(u32 *p, u32 len)
867{
868 while (len) {
869 *p = swab32(*p);
870 p++;
871 len -= 4;
872 }
873}
874
875
876static void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
877{
878 struct ngene_channel *chan = priv;
879
880
881#ifdef COMMAND_TIMEOUT_WORKAROUND
882 if (chan->users > 0)
883#endif
884 dvb_dmx_swfilter(&chan->demux, buf, len);
885 return 0;
886}
887
888u8 fill_ts[188] = { 0x47, 0x1f, 0xff, 0x10 };
889
890static void *tsout_exchange(void *priv, void *buf, u32 len,
891 u32 clock, u32 flags)
892{
893 struct ngene_channel *chan = priv;
894 struct ngene *dev = chan->dev;
895 u32 alen;
896
897 alen = dvb_ringbuffer_avail(&dev->tsout_rbuf);
898 alen -= alen % 188;
899
900 if (alen < len)
901 FillTSBuffer(buf + alen, len - alen, flags);
902 else
903 alen = len;
904 dvb_ringbuffer_read(&dev->tsout_rbuf, buf, alen);
905 if (flags & DF_SWAP32)
906 swap_buffer((u32 *)buf, alen);
907 wake_up_interruptible(&dev->tsout_rbuf.queue);
908 return buf;
909}
910
911
912static void set_transfer(struct ngene_channel *chan, int state)
913{
914 u8 control = 0, mode = 0, flags = 0;
915 struct ngene *dev = chan->dev;
916 int ret;
917
918 /*
919 printk(KERN_INFO DEVICE_NAME ": st %d\n", state);
920 msleep(100);
921 */
922
923 if (state) {
924 if (chan->running) {
925 printk(KERN_INFO DEVICE_NAME ": already running\n");
926 return;
927 }
928 } else {
929 if (!chan->running) {
930 printk(KERN_INFO DEVICE_NAME ": already stopped\n");
931 return;
932 }
933 }
934
935 if (dev->card_info->switch_ctrl)
936 dev->card_info->switch_ctrl(chan, 1, state ^ 1);
937
938 if (state) {
939 spin_lock_irq(&chan->state_lock);
940
941 /* printk(KERN_INFO DEVICE_NAME ": lock=%08x\n",
942 ngreadl(0x9310)); */
943 dvb_ringbuffer_flush(&dev->tsout_rbuf);
944 control = 0x80;
945 if (chan->mode & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) {
946 chan->Capture1Length = 512 * 188;
947 mode = SMODE_TRANSPORT_STREAM;
948 }
949 if (chan->mode & NGENE_IO_TSOUT) {
950 chan->pBufferExchange = tsout_exchange;
951 /* 0x66666666 = 50MHz *2^33 /250MHz */
952 chan->AudioDTOValue = 0x66666666;
953 /* set_dto(chan, 38810700+1000); */
954 /* set_dto(chan, 19392658); */
955 }
956 if (chan->mode & NGENE_IO_TSIN)
957 chan->pBufferExchange = tsin_exchange;
958 /* ngwritel(0, 0x9310); */
959 spin_unlock_irq(&chan->state_lock);
960 } else
961 ;/* printk(KERN_INFO DEVICE_NAME ": lock=%08x\n",
962 ngreadl(0x9310)); */
963
964 ret = ngene_command_stream_control(dev, chan->number,
965 control, mode, flags);
966 if (!ret)
967 chan->running = state;
968 else
969 printk(KERN_ERR DEVICE_NAME ": set_transfer %d failed\n",
970 state);
971 if (!state) {
972 spin_lock_irq(&chan->state_lock);
973 chan->pBufferExchange = 0;
974 dvb_ringbuffer_flush(&dev->tsout_rbuf);
975 spin_unlock_irq(&chan->state_lock);
976 }
977}
978
979static int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed)
980{
981 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
982 struct ngene_channel *chan = dvbdmx->priv;
983
984 if (chan->users == 0) {
985#ifdef COMMAND_TIMEOUT_WORKAROUND
986 if (!chan->running)
987#endif
988 set_transfer(chan, 1);
989 /* msleep(10); */
990 }
991
992 return ++chan->users;
993}
994
995static int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
996{
997 struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
998 struct ngene_channel *chan = dvbdmx->priv;
999
1000 if (--chan->users)
1001 return chan->users;
1002
1003#ifndef COMMAND_TIMEOUT_WORKAROUND
1004 set_transfer(chan, 0);
1005#endif
1006
1007 return 0;
1008}
1009
1010
1011
1012static int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
1013 int (*start_feed)(struct dvb_demux_feed *),
1014 int (*stop_feed)(struct dvb_demux_feed *),
1015 void *priv)
1016{
1017 dvbdemux->priv = priv;
1018
1019 dvbdemux->filternum = 256;
1020 dvbdemux->feednum = 256;
1021 dvbdemux->start_feed = start_feed;
1022 dvbdemux->stop_feed = stop_feed;
1023 dvbdemux->write_to_decoder = 0;
1024 dvbdemux->dmx.capabilities = (DMX_TS_FILTERING |
1025 DMX_SECTION_FILTERING |
1026 DMX_MEMORY_BASED_FILTERING);
1027 return dvb_dmx_init(dvbdemux);
1028}
1029
1030static int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
1031 struct dvb_demux *dvbdemux,
1032 struct dmx_frontend *hw_frontend,
1033 struct dmx_frontend *mem_frontend,
1034 struct dvb_adapter *dvb_adapter)
1035{
1036 int ret;
1037
1038 dmxdev->filternum = 256;
1039 dmxdev->demux = &dvbdemux->dmx;
1040 dmxdev->capabilities = 0;
1041 ret = dvb_dmxdev_init(dmxdev, dvb_adapter);
1042 if (ret < 0)
1043 return ret;
1044
1045 hw_frontend->source = DMX_FRONTEND_0;
1046 dvbdemux->dmx.add_frontend(&dvbdemux->dmx, hw_frontend);
1047 mem_frontend->source = DMX_MEMORY_FE;
1048 dvbdemux->dmx.add_frontend(&dvbdemux->dmx, mem_frontend);
1049 return dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, hw_frontend);
1050}
1051
1052
1053/****************************************************************************/
1054/* nGene hardware init and release functions ********************************/
1055/****************************************************************************/
1056
1057static void free_ringbuffer(struct ngene *dev, struct SRingBufferDescriptor *rb)
1058{
1059 struct SBufferHeader *Cur = rb->Head;
1060 u32 j;
1061
1062 if (!Cur)
1063 return;
1064
1065 for (j = 0; j < rb->NumBuffers; j++, Cur = Cur->Next) {
1066 if (Cur->Buffer1)
1067 pci_free_consistent(dev->pci_dev,
1068 rb->Buffer1Length,
1069 Cur->Buffer1,
1070 Cur->scList1->Address);
1071
1072 if (Cur->Buffer2)
1073 pci_free_consistent(dev->pci_dev,
1074 rb->Buffer2Length,
1075 Cur->Buffer2,
1076 Cur->scList2->Address);
1077 }
1078
1079 if (rb->SCListMem)
1080 pci_free_consistent(dev->pci_dev, rb->SCListMemSize,
1081 rb->SCListMem, rb->PASCListMem);
1082
1083 pci_free_consistent(dev->pci_dev, rb->MemSize, rb->Head, rb->PAHead);
1084}
1085
1086static void free_idlebuffer(struct ngene *dev,
1087 struct SRingBufferDescriptor *rb,
1088 struct SRingBufferDescriptor *tb)
1089{
1090 int j;
1091 struct SBufferHeader *Cur = tb->Head;
1092
1093 if (!rb->Head)
1094 return;
1095 free_ringbuffer(dev, rb);
1096 for (j = 0; j < tb->NumBuffers; j++, Cur = Cur->Next) {
1097 Cur->Buffer2 = 0;
1098 Cur->scList2 = 0;
1099 Cur->ngeneBuffer.Address_of_first_entry_2 = 0;
1100 Cur->ngeneBuffer.Number_of_entries_2 = 0;
1101 }
1102}
1103
1104static void free_common_buffers(struct ngene *dev)
1105{
1106 u32 i;
1107 struct ngene_channel *chan;
1108
1109 for (i = STREAM_VIDEOIN1; i < MAX_STREAM; i++) {
1110 chan = &dev->channel[i];
1111 free_idlebuffer(dev, &chan->TSIdleBuffer, &chan->TSRingBuffer);
1112 free_ringbuffer(dev, &chan->RingBuffer);
1113 free_ringbuffer(dev, &chan->TSRingBuffer);
1114 }
1115
1116 if (dev->OverflowBuffer)
1117 pci_free_consistent(dev->pci_dev,
1118 OVERFLOW_BUFFER_SIZE,
1119 dev->OverflowBuffer, dev->PAOverflowBuffer);
1120
1121 if (dev->FWInterfaceBuffer)
1122 pci_free_consistent(dev->pci_dev,
1123 4096,
1124 dev->FWInterfaceBuffer,
1125 dev->PAFWInterfaceBuffer);
1126}
1127
1128/****************************************************************************/
1129/* Ring buffer handling *****************************************************/
1130/****************************************************************************/
1131
1132static int create_ring_buffer(struct pci_dev *pci_dev,
1133 struct SRingBufferDescriptor *descr, u32 NumBuffers)
1134{
1135 dma_addr_t tmp;
1136 struct SBufferHeader *Head;
1137 u32 i;
1138 u32 MemSize = SIZEOF_SBufferHeader * NumBuffers;
1139 u64 PARingBufferHead;
1140 u64 PARingBufferCur;
1141 u64 PARingBufferNext;
1142 struct SBufferHeader *Cur, *Next;
1143
1144 descr->Head = 0;
1145 descr->MemSize = 0;
1146 descr->PAHead = 0;
1147 descr->NumBuffers = 0;
1148
1149 if (MemSize < 4096)
1150 MemSize = 4096;
1151
1152 Head = pci_alloc_consistent(pci_dev, MemSize, &tmp);
1153 PARingBufferHead = tmp;
1154
1155 if (!Head)
1156 return -ENOMEM;
1157
1158 memset(Head, 0, MemSize);
1159
1160 PARingBufferCur = PARingBufferHead;
1161 Cur = Head;
1162
1163 for (i = 0; i < NumBuffers - 1; i++) {
1164 Next = (struct SBufferHeader *)
1165 (((u8 *) Cur) + SIZEOF_SBufferHeader);
1166 PARingBufferNext = PARingBufferCur + SIZEOF_SBufferHeader;
1167 Cur->Next = Next;
1168 Cur->ngeneBuffer.Next = PARingBufferNext;
1169 Cur = Next;
1170 PARingBufferCur = PARingBufferNext;
1171 }
1172 /* Last Buffer points back to first one */
1173 Cur->Next = Head;
1174 Cur->ngeneBuffer.Next = PARingBufferHead;
1175
1176 descr->Head = Head;
1177 descr->MemSize = MemSize;
1178 descr->PAHead = PARingBufferHead;
1179 descr->NumBuffers = NumBuffers;
1180
1181 return 0;
1182}
1183
1184static int AllocateRingBuffers(struct pci_dev *pci_dev,
1185 dma_addr_t of,
1186 struct SRingBufferDescriptor *pRingBuffer,
1187 u32 Buffer1Length, u32 Buffer2Length)
1188{
1189 dma_addr_t tmp;
1190 u32 i, j;
1191 int status = 0;
1192 u32 SCListMemSize = pRingBuffer->NumBuffers
1193 * ((Buffer2Length != 0) ? (NUM_SCATTER_GATHER_ENTRIES * 2) :
1194 NUM_SCATTER_GATHER_ENTRIES)
1195 * sizeof(struct HW_SCATTER_GATHER_ELEMENT);
1196
1197 u64 PASCListMem;
1198 struct HW_SCATTER_GATHER_ELEMENT *SCListEntry;
1199 u64 PASCListEntry;
1200 struct SBufferHeader *Cur;
1201 void *SCListMem;
1202
1203 if (SCListMemSize < 4096)
1204 SCListMemSize = 4096;
1205
1206 SCListMem = pci_alloc_consistent(pci_dev, SCListMemSize, &tmp);
1207
1208 PASCListMem = tmp;
1209 if (SCListMem == NULL)
1210 return -ENOMEM;
1211
1212 memset(SCListMem, 0, SCListMemSize);
1213
1214 pRingBuffer->SCListMem = SCListMem;
1215 pRingBuffer->PASCListMem = PASCListMem;
1216 pRingBuffer->SCListMemSize = SCListMemSize;
1217 pRingBuffer->Buffer1Length = Buffer1Length;
1218 pRingBuffer->Buffer2Length = Buffer2Length;
1219
1220 SCListEntry = SCListMem;
1221 PASCListEntry = PASCListMem;
1222 Cur = pRingBuffer->Head;
1223
1224 for (i = 0; i < pRingBuffer->NumBuffers; i += 1, Cur = Cur->Next) {
1225 u64 PABuffer;
1226
1227 void *Buffer = pci_alloc_consistent(pci_dev, Buffer1Length,
1228 &tmp);
1229 PABuffer = tmp;
1230
1231 if (Buffer == NULL)
1232 return -ENOMEM;
1233
1234 Cur->Buffer1 = Buffer;
1235
1236 SCListEntry->Address = PABuffer;
1237 SCListEntry->Length = Buffer1Length;
1238
1239 Cur->scList1 = SCListEntry;
1240 Cur->ngeneBuffer.Address_of_first_entry_1 = PASCListEntry;
1241 Cur->ngeneBuffer.Number_of_entries_1 =
1242 NUM_SCATTER_GATHER_ENTRIES;
1243
1244 SCListEntry += 1;
1245 PASCListEntry += sizeof(struct HW_SCATTER_GATHER_ELEMENT);
1246
1247#if NUM_SCATTER_GATHER_ENTRIES > 1
1248 for (j = 0; j < NUM_SCATTER_GATHER_ENTRIES - 1; j += 1) {
1249 SCListEntry->Address = of;
1250 SCListEntry->Length = OVERFLOW_BUFFER_SIZE;
1251 SCListEntry += 1;
1252 PASCListEntry +=
1253 sizeof(struct HW_SCATTER_GATHER_ELEMENT);
1254 }
1255#endif
1256
1257 if (!Buffer2Length)
1258 continue;
1259
1260 Buffer = pci_alloc_consistent(pci_dev, Buffer2Length, &tmp);
1261 PABuffer = tmp;
1262
1263 if (Buffer == NULL)
1264 return -ENOMEM;
1265
1266 Cur->Buffer2 = Buffer;
1267
1268 SCListEntry->Address = PABuffer;
1269 SCListEntry->Length = Buffer2Length;
1270
1271 Cur->scList2 = SCListEntry;
1272 Cur->ngeneBuffer.Address_of_first_entry_2 = PASCListEntry;
1273 Cur->ngeneBuffer.Number_of_entries_2 =
1274 NUM_SCATTER_GATHER_ENTRIES;
1275
1276 SCListEntry += 1;
1277 PASCListEntry += sizeof(struct HW_SCATTER_GATHER_ELEMENT);
1278
1279#if NUM_SCATTER_GATHER_ENTRIES > 1
1280 for (j = 0; j < NUM_SCATTER_GATHER_ENTRIES - 1; j++) {
1281 SCListEntry->Address = of;
1282 SCListEntry->Length = OVERFLOW_BUFFER_SIZE;
1283 SCListEntry += 1;
1284 PASCListEntry +=
1285 sizeof(struct HW_SCATTER_GATHER_ELEMENT);
1286 }
1287#endif
1288
1289 }
1290
1291 return status;
1292}
1293
1294static int FillTSIdleBuffer(struct SRingBufferDescriptor *pIdleBuffer,
1295 struct SRingBufferDescriptor *pRingBuffer)
1296{
1297 int status = 0;
1298
1299 /* Copy pointer to scatter gather list in TSRingbuffer
1300 structure for buffer 2
1301 Load number of buffer
1302 */
1303 u32 n = pRingBuffer->NumBuffers;
1304
1305 /* Point to first buffer entry */
1306 struct SBufferHeader *Cur = pRingBuffer->Head;
1307 int i;
1308 /* Loop thru all buffer and set Buffer 2 pointers to TSIdlebuffer */
1309 for (i = 0; i < n; i++) {
1310 Cur->Buffer2 = pIdleBuffer->Head->Buffer1;
1311 Cur->scList2 = pIdleBuffer->Head->scList1;
1312 Cur->ngeneBuffer.Address_of_first_entry_2 =
1313 pIdleBuffer->Head->ngeneBuffer.
1314 Address_of_first_entry_1;
1315 Cur->ngeneBuffer.Number_of_entries_2 =
1316 pIdleBuffer->Head->ngeneBuffer.Number_of_entries_1;
1317 Cur = Cur->Next;
1318 }
1319 return status;
1320}
1321
1322static u32 RingBufferSizes[MAX_STREAM] = {
1323 RING_SIZE_VIDEO,
1324 RING_SIZE_VIDEO,
1325 RING_SIZE_AUDIO,
1326 RING_SIZE_AUDIO,
1327 RING_SIZE_AUDIO,
1328};
1329
1330static u32 Buffer1Sizes[MAX_STREAM] = {
1331 MAX_VIDEO_BUFFER_SIZE,
1332 MAX_VIDEO_BUFFER_SIZE,
1333 MAX_AUDIO_BUFFER_SIZE,
1334 MAX_AUDIO_BUFFER_SIZE,
1335 MAX_AUDIO_BUFFER_SIZE
1336};
1337
1338static u32 Buffer2Sizes[MAX_STREAM] = {
1339 MAX_VBI_BUFFER_SIZE,
1340 MAX_VBI_BUFFER_SIZE,
1341 0,
1342 0,
1343 0
1344};
1345
1346
1347static int AllocCommonBuffers(struct ngene *dev)
1348{
1349 int status = 0, i;
1350
1351 dev->FWInterfaceBuffer = pci_alloc_consistent(dev->pci_dev, 4096,
1352 &dev->PAFWInterfaceBuffer);
1353 if (!dev->FWInterfaceBuffer)
1354 return -ENOMEM;
1355 dev->hosttongene = dev->FWInterfaceBuffer;
1356 dev->ngenetohost = dev->FWInterfaceBuffer + 256;
1357 dev->EventBuffer = dev->FWInterfaceBuffer + 512;
1358
1359 dev->OverflowBuffer = pci_alloc_consistent(dev->pci_dev,
1360 OVERFLOW_BUFFER_SIZE,
1361 &dev->PAOverflowBuffer);
1362 if (!dev->OverflowBuffer)
1363 return -ENOMEM;
1364 memset(dev->OverflowBuffer, 0, OVERFLOW_BUFFER_SIZE);
1365
1366 for (i = STREAM_VIDEOIN1; i < MAX_STREAM; i++) {
1367 int type = dev->card_info->io_type[i];
1368
1369 dev->channel[i].State = KSSTATE_STOP;
1370
1371 if (type & (NGENE_IO_TV | NGENE_IO_HDTV | NGENE_IO_AIN)) {
1372 status = create_ring_buffer(dev->pci_dev,
1373 &dev->channel[i].RingBuffer,
1374 RingBufferSizes[i]);
1375 if (status < 0)
1376 break;
1377
1378 if (type & (NGENE_IO_TV | NGENE_IO_AIN)) {
1379 status = AllocateRingBuffers(dev->pci_dev,
1380 dev->
1381 PAOverflowBuffer,
1382 &dev->channel[i].
1383 RingBuffer,
1384 Buffer1Sizes[i],
1385 Buffer2Sizes[i]);
1386 if (status < 0)
1387 break;
1388 } else if (type & NGENE_IO_HDTV) {
1389 status = AllocateRingBuffers(dev->pci_dev,
1390 dev->
1391 PAOverflowBuffer,
1392 &dev->channel[i].
1393 RingBuffer,
1394 MAX_HDTV_BUFFER_SIZE,
1395 0);
1396 if (status < 0)
1397 break;
1398 }
1399 }
1400
1401 if (type & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) {
1402
1403 status = create_ring_buffer(dev->pci_dev,
1404 &dev->channel[i].
1405 TSRingBuffer, RING_SIZE_TS);
1406 if (status < 0)
1407 break;
1408
1409 status = AllocateRingBuffers(dev->pci_dev,
1410 dev->PAOverflowBuffer,
1411 &dev->channel[i].
1412 TSRingBuffer,
1413 MAX_TS_BUFFER_SIZE, 0);
1414 if (status)
1415 break;
1416 }
1417
1418 if (type & NGENE_IO_TSOUT) {
1419 status = create_ring_buffer(dev->pci_dev,
1420 &dev->channel[i].
1421 TSIdleBuffer, 1);
1422 if (status < 0)
1423 break;
1424 status = AllocateRingBuffers(dev->pci_dev,
1425 dev->PAOverflowBuffer,
1426 &dev->channel[i].
1427 TSIdleBuffer,
1428 MAX_TS_BUFFER_SIZE, 0);
1429 if (status)
1430 break;
1431 FillTSIdleBuffer(&dev->channel[i].TSIdleBuffer,
1432 &dev->channel[i].TSRingBuffer);
1433 }
1434 }
1435 return status;
1436}
1437
1438static void ngene_release_buffers(struct ngene *dev)
1439{
1440 if (dev->iomem)
1441 iounmap(dev->iomem);
1442 free_common_buffers(dev);
1443 vfree(dev->tsout_buf);
1444 vfree(dev->ain_buf);
1445 vfree(dev->vin_buf);
1446 vfree(dev);
1447}
1448
1449static int ngene_get_buffers(struct ngene *dev)
1450{
1451 if (AllocCommonBuffers(dev))
1452 return -ENOMEM;
1453 if (dev->card_info->io_type[4] & NGENE_IO_TSOUT) {
1454 dev->tsout_buf = vmalloc(TSOUT_BUF_SIZE);
1455 if (!dev->tsout_buf)
1456 return -ENOMEM;
1457 dvb_ringbuffer_init(&dev->tsout_rbuf,
1458 dev->tsout_buf, TSOUT_BUF_SIZE);
1459 }
1460 if (dev->card_info->io_type[2] & NGENE_IO_AIN) {
1461 dev->ain_buf = vmalloc(AIN_BUF_SIZE);
1462 if (!dev->ain_buf)
1463 return -ENOMEM;
1464 dvb_ringbuffer_init(&dev->ain_rbuf, dev->ain_buf, AIN_BUF_SIZE);
1465 }
1466 if (dev->card_info->io_type[0] & NGENE_IO_HDTV) {
1467 dev->vin_buf = vmalloc(VIN_BUF_SIZE);
1468 if (!dev->vin_buf)
1469 return -ENOMEM;
1470 dvb_ringbuffer_init(&dev->vin_rbuf, dev->vin_buf, VIN_BUF_SIZE);
1471 }
1472 dev->iomem = ioremap(pci_resource_start(dev->pci_dev, 0),
1473 pci_resource_len(dev->pci_dev, 0));
1474 if (!dev->iomem)
1475 return -ENOMEM;
1476
1477 return 0;
1478}
1479
1480static void ngene_init(struct ngene *dev)
1481{
1482 int i;
1483
1484 tasklet_init(&dev->event_tasklet, event_tasklet, (unsigned long)dev);
1485
1486 memset_io(dev->iomem + 0xc000, 0x00, 0x220);
1487 memset_io(dev->iomem + 0xc400, 0x00, 0x100);
1488
1489 for (i = 0; i < MAX_STREAM; i++) {
1490 dev->channel[i].dev = dev;
1491 dev->channel[i].number = i;
1492 }
1493
1494 dev->fw_interface_version = 0;
1495
1496 ngwritel(0, NGENE_INT_ENABLE);
1497
1498 dev->icounts = ngreadl(NGENE_INT_COUNTS);
1499
1500 dev->device_version = ngreadl(DEV_VER) & 0x0f;
1501 printk(KERN_INFO DEVICE_NAME ": Device version %d\n",
1502 dev->device_version);
1503}
1504
1505static int ngene_load_firm(struct ngene *dev)
1506{
1507 u32 size;
1508 const struct firmware *fw = NULL;
1509 u8 *ngene_fw;
1510 char *fw_name;
1511 int err, version;
1512
1513 version = dev->card_info->fw_version;
1514
1515 switch (version) {
1516 default:
1517 case 15:
1518 version = 15;
1519 size = 23466;
1520 fw_name = "ngene_15.fw";
1521 break;
1522 case 16:
1523 size = 23498;
1524 fw_name = "ngene_16.fw";
1525 break;
1526 case 17:
1527 size = 24446;
1528 fw_name = "ngene_17.fw";
1529 break;
1530 }
1531
1532 if (request_firmware(&fw, fw_name, &dev->pci_dev->dev) < 0) {
1533 printk(KERN_ERR DEVICE_NAME
1534 ": Could not load firmware file %s.\n", fw_name);
1535 printk(KERN_INFO DEVICE_NAME
1536 ": Copy %s to your hotplug directory!\n", fw_name);
1537 return -1;
1538 }
1539 if (size != fw->size) {
1540 printk(KERN_ERR DEVICE_NAME
1541 ": Firmware %s has invalid size!", fw_name);
1542 err = -1;
1543 } else {
1544 printk(KERN_INFO DEVICE_NAME
1545 ": Loading firmware file %s.\n", fw_name);
1546 ngene_fw = (u8 *) fw->data;
1547 err = ngene_command_load_firmware(dev, ngene_fw, size);
1548 }
1549
1550 release_firmware(fw);
1551
1552 return err;
1553}
1554
1555static void ngene_stop(struct ngene *dev)
1556{
1557 down(&dev->cmd_mutex);
1558 i2c_del_adapter(&(dev->channel[0].i2c_adapter));
1559 i2c_del_adapter(&(dev->channel[1].i2c_adapter));
1560 ngwritel(0, NGENE_INT_ENABLE);
1561 ngwritel(0, NGENE_COMMAND);
1562 ngwritel(0, NGENE_COMMAND_HI);
1563 ngwritel(0, NGENE_STATUS);
1564 ngwritel(0, NGENE_STATUS_HI);
1565 ngwritel(0, NGENE_EVENT);
1566 ngwritel(0, NGENE_EVENT_HI);
1567 free_irq(dev->pci_dev->irq, dev);
1568}
1569
1570static int ngene_start(struct ngene *dev)
1571{
1572 int stat;
1573 int i;
1574
1575 pci_set_master(dev->pci_dev);
1576 ngene_init(dev);
1577
1578 stat = request_irq(dev->pci_dev->irq, irq_handler,
1579 IRQF_SHARED, "nGene",
1580 (void *)dev);
1581 if (stat < 0)
1582 return stat;
1583
1584 init_waitqueue_head(&dev->cmd_wq);
1585 init_waitqueue_head(&dev->tx_wq);
1586 init_waitqueue_head(&dev->rx_wq);
1587 sema_init(&dev->cmd_mutex, 1);
1588 sema_init(&dev->stream_mutex, 1);
1589 sema_init(&dev->pll_mutex, 1);
1590 sema_init(&dev->i2c_switch_mutex, 1);
1591 spin_lock_init(&dev->cmd_lock);
1592 for (i = 0; i < MAX_STREAM; i++)
1593 spin_lock_init(&dev->channel[i].state_lock);
1594 ngwritel(1, TIMESTAMPS);
1595
1596 ngwritel(1, NGENE_INT_ENABLE);
1597
1598 stat = ngene_load_firm(dev);
1599 if (stat < 0)
1600 goto fail;
1601
1602 stat = ngene_i2c_init(dev, 0);
1603 if (stat < 0)
1604 goto fail;
1605
1606 stat = ngene_i2c_init(dev, 1);
1607 if (stat < 0)
1608 goto fail;
1609
1610 if (dev->card_info->fw_version == 17) {
1611 u8 tsin4_config[6] = {
1612 3072 / 64, 3072 / 64, 0, 3072 / 64, 3072 / 64, 0};
1613 u8 default_config[6] = {
1614 4096 / 64, 4096 / 64, 0, 2048 / 64, 2048 / 64, 0};
1615 u8 *bconf = default_config;
1616
1617 if (dev->card_info->io_type[3] == NGENE_IO_TSIN)
1618 bconf = tsin4_config;
1619 dprintk(KERN_DEBUG DEVICE_NAME ": FW 17 buffer config\n");
1620 stat = ngene_command_config_free_buf(dev, bconf);
1621 } else {
1622 int bconf = BUFFER_CONFIG_4422;
1623 if (dev->card_info->io_type[3] == NGENE_IO_TSIN)
1624 bconf = BUFFER_CONFIG_3333;
1625 stat = ngene_command_config_buf(dev, bconf);
1626 }
1627 return stat;
1628fail:
1629 ngwritel(0, NGENE_INT_ENABLE);
1630 free_irq(dev->pci_dev->irq, dev);
1631 return stat;
1632}
1633
1634
1635
1636/****************************************************************************/
1637/* Switch control (I2C gates, etc.) *****************************************/
1638/****************************************************************************/
1639
1640
1641/****************************************************************************/
1642/* Demod/tuner attachment ***************************************************/
1643/****************************************************************************/
1644
1645static int tuner_attach_stv6110(struct ngene_channel *chan)
1646{
1647 struct stv090x_config *feconf = (struct stv090x_config *)
1648 chan->dev->card_info->fe_config[chan->number];
1649 struct stv6110x_config *tunerconf = (struct stv6110x_config *)
1650 chan->dev->card_info->tuner_config[chan->number];
1651 struct stv6110x_devctl *ctl;
1652
1653 ctl = dvb_attach(stv6110x_attach, chan->fe, tunerconf,
1654 &chan->i2c_adapter);
1655 if (ctl == NULL) {
1656 printk(KERN_ERR DEVICE_NAME ": No STV6110X found!\n");
1657 return -ENODEV;
1658 }
1659
1660 feconf->tuner_init = ctl->tuner_init;
1661 feconf->tuner_set_mode = ctl->tuner_set_mode;
1662 feconf->tuner_set_frequency = ctl->tuner_set_frequency;
1663 feconf->tuner_get_frequency = ctl->tuner_get_frequency;
1664 feconf->tuner_set_bandwidth = ctl->tuner_set_bandwidth;
1665 feconf->tuner_get_bandwidth = ctl->tuner_get_bandwidth;
1666 feconf->tuner_set_bbgain = ctl->tuner_set_bbgain;
1667 feconf->tuner_get_bbgain = ctl->tuner_get_bbgain;
1668 feconf->tuner_set_refclk = ctl->tuner_set_refclk;
1669 feconf->tuner_get_status = ctl->tuner_get_status;
1670
1671 return 0;
1672}
1673
1674
1675static int demod_attach_stv0900(struct ngene_channel *chan)
1676{
1677 struct stv090x_config *feconf = (struct stv090x_config *)
1678 chan->dev->card_info->fe_config[chan->number];
1679
1680 chan->fe = dvb_attach(stv090x_attach,
1681 feconf,
1682 &chan->i2c_adapter,
1683 chan->number == 0 ? STV090x_DEMODULATOR_0 :
1684 STV090x_DEMODULATOR_1);
1685 if (chan->fe == NULL) {
1686 printk(KERN_ERR DEVICE_NAME ": No STV0900 found!\n");
1687 return -ENODEV;
1688 }
1689
1690 if (!dvb_attach(lnbh24_attach, chan->fe, &chan->i2c_adapter, 0,
1691 0, chan->dev->card_info->lnb[chan->number])) {
1692 printk(KERN_ERR DEVICE_NAME ": No LNBH24 found!\n");
1693 dvb_frontend_detach(chan->fe);
1694 return -ENODEV;
1695 }
1696
1697 return 0;
1698}
1699
1700/****************************************************************************/
1701/****************************************************************************/
1702/****************************************************************************/
1703
1704static void release_channel(struct ngene_channel *chan)
1705{
1706 struct dvb_demux *dvbdemux = &chan->demux;
1707 struct ngene *dev = chan->dev;
1708 struct ngene_info *ni = dev->card_info;
1709 int io = ni->io_type[chan->number];
1710
1711#ifdef COMMAND_TIMEOUT_WORKAROUND
1712 if (chan->running)
1713 set_transfer(chan, 0);
1714#endif
1715
1716 tasklet_kill(&chan->demux_tasklet);
1717
1718 if (io & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) {
1719 if (chan->fe) {
1720 dvb_unregister_frontend(chan->fe);
1721 dvb_frontend_detach(chan->fe);
1722 chan->fe = 0;
1723 }
1724 dvbdemux->dmx.close(&dvbdemux->dmx);
1725 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx,
1726 &chan->hw_frontend);
1727 dvbdemux->dmx.remove_frontend(&dvbdemux->dmx,
1728 &chan->mem_frontend);
1729 dvb_dmxdev_release(&chan->dmxdev);
1730 dvb_dmx_release(&chan->demux);
1731
1732 if (chan->number == 0 || !one_adapter)
1733 dvb_unregister_adapter(&dev->adapter[chan->number]);
1734 }
1735}
1736
1737static int init_channel(struct ngene_channel *chan)
1738{
1739 int ret = 0, nr = chan->number;
1740 struct dvb_adapter *adapter = NULL;
1741 struct dvb_demux *dvbdemux = &chan->demux;
1742 struct ngene *dev = chan->dev;
1743 struct ngene_info *ni = dev->card_info;
1744 int io = ni->io_type[nr];
1745
1746 tasklet_init(&chan->demux_tasklet, demux_tasklet, (unsigned long)chan);
1747 chan->users = 0;
1748 chan->type = io;
1749 chan->mode = chan->type; /* for now only one mode */
1750
1751 if (io & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) {
1752 if (nr >= STREAM_AUDIOIN1)
1753 chan->DataFormatFlags = DF_SWAP32;
1754 if (nr == 0 || !one_adapter) {
1755 adapter = &dev->adapter[nr];
1756 ret = dvb_register_adapter(adapter, "nGene",
1757 THIS_MODULE,
1758 &chan->dev->pci_dev->dev,
1759 adapter_nr);
1760 if (ret < 0)
1761 return ret;
1762 } else {
1763 adapter = &dev->adapter[0];
1764 }
1765
1766 ret = my_dvb_dmx_ts_card_init(dvbdemux, "SW demux",
1767 ngene_start_feed,
1768 ngene_stop_feed, chan);
1769 ret = my_dvb_dmxdev_ts_card_init(&chan->dmxdev, &chan->demux,
1770 &chan->hw_frontend,
1771 &chan->mem_frontend, adapter);
1772 }
1773
1774 if (io & NGENE_IO_TSIN) {
1775 chan->fe = NULL;
1776 if (ni->demod_attach[nr])
1777 ni->demod_attach[nr](chan);
1778 if (chan->fe) {
1779 if (dvb_register_frontend(adapter, chan->fe) < 0) {
1780 if (chan->fe->ops.release)
1781 chan->fe->ops.release(chan->fe);
1782 chan->fe = NULL;
1783 }
1784 }
1785 if (chan->fe && ni->tuner_attach[nr])
1786 if (ni->tuner_attach[nr] (chan) < 0) {
1787 printk(KERN_ERR DEVICE_NAME
1788 ": Tuner attach failed on channel %d!\n",
1789 nr);
1790 }
1791 }
1792 return ret;
1793}
1794
1795static int init_channels(struct ngene *dev)
1796{
1797 int i, j;
1798
1799 for (i = 0; i < MAX_STREAM; i++) {
1800 if (init_channel(&dev->channel[i]) < 0) {
1801 for (j = i - 1; j >= 0; j--)
1802 release_channel(&dev->channel[j]);
1803 return -1;
1804 }
1805 }
1806 return 0;
1807}
1808
1809/****************************************************************************/
1810/* device probe/remove calls ************************************************/
1811/****************************************************************************/
1812
1813static void __devexit ngene_remove(struct pci_dev *pdev)
1814{
1815 struct ngene *dev = (struct ngene *)pci_get_drvdata(pdev);
1816 int i;
1817
1818 tasklet_kill(&dev->event_tasklet);
1819 for (i = MAX_STREAM - 1; i >= 0; i--)
1820 release_channel(&dev->channel[i]);
1821 ngene_stop(dev);
1822 ngene_release_buffers(dev);
1823 pci_set_drvdata(pdev, 0);
1824 pci_disable_device(pdev);
1825}
1826
1827static int __devinit ngene_probe(struct pci_dev *pci_dev,
1828 const struct pci_device_id *id)
1829{
1830 struct ngene *dev;
1831 int stat = 0;
1832
1833 if (pci_enable_device(pci_dev) < 0)
1834 return -ENODEV;
1835
1836 dev = vmalloc(sizeof(struct ngene));
1837 if (dev == NULL) {
1838 stat = -ENOMEM;
1839 goto fail0;
1840 }
1841 memset(dev, 0, sizeof(struct ngene));
1842
1843 dev->pci_dev = pci_dev;
1844 dev->card_info = (struct ngene_info *)id->driver_data;
1845 printk(KERN_INFO DEVICE_NAME ": Found %s\n", dev->card_info->name);
1846
1847 pci_set_drvdata(pci_dev, dev);
1848
1849 /* Alloc buffers and start nGene */
1850 stat = ngene_get_buffers(dev);
1851 if (stat < 0)
1852 goto fail1;
1853 stat = ngene_start(dev);
1854 if (stat < 0)
1855 goto fail1;
1856
1857 dev->i2c_current_bus = -1;
1858
1859 /* Register DVB adapters and devices for both channels */
1860 if (init_channels(dev) < 0)
1861 goto fail2;
1862
1863 return 0;
1864
1865fail2:
1866 ngene_stop(dev);
1867fail1:
1868 ngene_release_buffers(dev);
1869fail0:
1870 pci_disable_device(pci_dev);
1871 pci_set_drvdata(pci_dev, 0);
1872 return stat;
1873}
1874
1875/****************************************************************************/
1876/* Card configs *************************************************************/
1877/****************************************************************************/
1878
1879static struct stv090x_config fe_cineS2 = {
1880 .device = STV0900,
1881 .demod_mode = STV090x_DUAL,
1882 .clk_mode = STV090x_CLK_EXT,
1883
1884 .xtal = 27000000,
1885 .address = 0x68,
1886
1887 .ts1_mode = STV090x_TSMODE_SERIAL_PUNCTURED,
1888 .ts2_mode = STV090x_TSMODE_SERIAL_PUNCTURED,
1889
1890 .repeater_level = STV090x_RPTLEVEL_16,
1891
1892 .adc1_range = STV090x_ADC_1Vpp,
1893 .adc2_range = STV090x_ADC_1Vpp,
1894
1895 .diseqc_envelope_mode = true,
1896};
1897
1898static struct stv6110x_config tuner_cineS2_0 = {
1899 .addr = 0x60,
1900 .refclk = 27000000,
1901 .clk_div = 1,
1902};
1903
1904static struct stv6110x_config tuner_cineS2_1 = {
1905 .addr = 0x63,
1906 .refclk = 27000000,
1907 .clk_div = 1,
1908};
1909
1910static struct ngene_info ngene_info_cineS2 = {
1911 .type = NGENE_SIDEWINDER,
1912 .name = "Linux4Media cineS2 DVB-S2 Twin Tuner",
1913 .io_type = {NGENE_IO_TSIN, NGENE_IO_TSIN},
1914 .demod_attach = {demod_attach_stv0900, demod_attach_stv0900},
1915 .tuner_attach = {tuner_attach_stv6110, tuner_attach_stv6110},
1916 .fe_config = {&fe_cineS2, &fe_cineS2},
1917 .tuner_config = {&tuner_cineS2_0, &tuner_cineS2_1},
1918 .lnb = {0x0b, 0x08},
1919 .tsf = {3, 3},
1920 .fw_version = 15,
1921};
1922
1923static struct ngene_info ngene_info_satixs2 = {
1924 .type = NGENE_SIDEWINDER,
1925 .name = "Mystique SaTiX-S2 Dual",
1926 .io_type = {NGENE_IO_TSIN, NGENE_IO_TSIN},
1927 .demod_attach = {demod_attach_stv0900, demod_attach_stv0900},
1928 .tuner_attach = {tuner_attach_stv6110, tuner_attach_stv6110},
1929 .fe_config = {&fe_cineS2, &fe_cineS2},
1930 .tuner_config = {&tuner_cineS2_0, &tuner_cineS2_1},
1931 .lnb = {0x0b, 0x08},
1932 .tsf = {3, 3},
1933 .fw_version = 15,
1934};
1935
1936/****************************************************************************/
1937
1938
1939
1940/****************************************************************************/
1941/* PCI Subsystem ID *********************************************************/
1942/****************************************************************************/
1943
1944#define NGENE_ID(_subvend, _subdev, _driverdata) { \
1945 .vendor = NGENE_VID, .device = NGENE_PID, \
1946 .subvendor = _subvend, .subdevice = _subdev, \
1947 .driver_data = (unsigned long) &_driverdata }
1948
1949/****************************************************************************/
1950
1951static const struct pci_device_id ngene_id_tbl[] __devinitdata = {
1952 NGENE_ID(0x18c3, 0xabc3, ngene_info_cineS2),
1953 NGENE_ID(0x18c3, 0xabc4, ngene_info_cineS2),
1954 NGENE_ID(0x18c3, 0xdb01, ngene_info_satixs2),
1955 {0}
1956};
1957MODULE_DEVICE_TABLE(pci, ngene_id_tbl);
1958
1959/****************************************************************************/
1960/* Init/Exit ****************************************************************/
1961/****************************************************************************/
1962
1963static pci_ers_result_t ngene_error_detected(struct pci_dev *dev,
1964 enum pci_channel_state state)
1965{
1966 printk(KERN_ERR DEVICE_NAME ": PCI error\n");
1967 if (state == pci_channel_io_perm_failure)
1968 return PCI_ERS_RESULT_DISCONNECT;
1969 if (state == pci_channel_io_frozen)
1970 return PCI_ERS_RESULT_NEED_RESET;
1971 return PCI_ERS_RESULT_CAN_RECOVER;
1972}
1973
1974static pci_ers_result_t ngene_link_reset(struct pci_dev *dev)
1975{
1976 printk(KERN_INFO DEVICE_NAME ": link reset\n");
1977 return 0;
1978}
1979
1980static pci_ers_result_t ngene_slot_reset(struct pci_dev *dev)
1981{
1982 printk(KERN_INFO DEVICE_NAME ": slot reset\n");
1983 return 0;
1984}
1985
1986static void ngene_resume(struct pci_dev *dev)
1987{
1988 printk(KERN_INFO DEVICE_NAME ": resume\n");
1989}
1990
1991static struct pci_error_handlers ngene_errors = {
1992 .error_detected = ngene_error_detected,
1993 .link_reset = ngene_link_reset,
1994 .slot_reset = ngene_slot_reset,
1995 .resume = ngene_resume,
1996};
1997
1998static struct pci_driver ngene_pci_driver = {
1999 .name = "ngene",
2000 .id_table = ngene_id_tbl,
2001 .probe = ngene_probe,
2002 .remove = __devexit_p(ngene_remove),
2003 .err_handler = &ngene_errors,
2004};
2005
2006static __init int module_init_ngene(void)
2007{
2008 printk(KERN_INFO
2009 "nGene PCIE bridge driver, Copyright (C) 2005-2007 Micronas\n");
2010 return pci_register_driver(&ngene_pci_driver);
2011}
2012
2013static __exit void module_exit_ngene(void)
2014{
2015 pci_unregister_driver(&ngene_pci_driver);
2016}
2017
2018module_init(module_init_ngene);
2019module_exit(module_exit_ngene);
2020
2021MODULE_DESCRIPTION("nGene");
2022MODULE_AUTHOR("Micronas, Ralph Metzler, Manfred Voelkel");
2023MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/ngene/ngene.h b/drivers/media/dvb/ngene/ngene.h
new file mode 100644
index 000000000000..a7eb29846310
--- /dev/null
+++ b/drivers/media/dvb/ngene/ngene.h
@@ -0,0 +1,859 @@
1/*
2 * ngene.h: nGene PCIe bridge driver
3 *
4 * Copyright (C) 2005-2007 Micronas
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 only, as published by the Free Software Foundation.
9 *
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301, USA
21 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
22 */
23
24#ifndef _NGENE_H_
25#define _NGENE_H_
26
27#include <linux/types.h>
28#include <linux/sched.h>
29#include <linux/interrupt.h>
30#include <linux/i2c.h>
31#include <asm/dma.h>
32#include <linux/scatterlist.h>
33
34#include <linux/dvb/frontend.h>
35
36#include "dmxdev.h"
37#include "dvbdev.h"
38#include "dvb_demux.h"
39#include "dvb_frontend.h"
40#include "dvb_ringbuffer.h"
41
42#define NGENE_VID 0x18c3
43#define NGENE_PID 0x0720
44
45#ifndef VIDEO_CAP_VC1
46#define VIDEO_CAP_AVC 128
47#define VIDEO_CAP_H264 128
48#define VIDEO_CAP_VC1 256
49#define VIDEO_CAP_WMV9 256
50#define VIDEO_CAP_MPEG4 512
51#endif
52
53enum STREAM {
54 STREAM_VIDEOIN1 = 0, /* ITU656 or TS Input */
55 STREAM_VIDEOIN2,
56 STREAM_AUDIOIN1, /* I2S or SPI Input */
57 STREAM_AUDIOIN2,
58 STREAM_AUDIOOUT,
59 MAX_STREAM
60};
61
62enum SMODE_BITS {
63 SMODE_AUDIO_SPDIF = 0x20,
64 SMODE_AVSYNC = 0x10,
65 SMODE_TRANSPORT_STREAM = 0x08,
66 SMODE_AUDIO_CAPTURE = 0x04,
67 SMODE_VBI_CAPTURE = 0x02,
68 SMODE_VIDEO_CAPTURE = 0x01
69};
70
71enum STREAM_FLAG_BITS {
72 SFLAG_CHROMA_FORMAT_2COMP = 0x01, /* Chroma Format : 2's complement */
73 SFLAG_CHROMA_FORMAT_OFFSET = 0x00, /* Chroma Format : Binary offset */
74 SFLAG_ORDER_LUMA_CHROMA = 0x02, /* Byte order: Y,Cb,Y,Cr */
75 SFLAG_ORDER_CHROMA_LUMA = 0x00, /* Byte order: Cb,Y,Cr,Y */
76 SFLAG_COLORBAR = 0x04, /* Select colorbar */
77};
78
79#define PROGRAM_ROM 0x0000
80#define PROGRAM_SRAM 0x1000
81#define PERIPHERALS0 0x8000
82#define PERIPHERALS1 0x9000
83#define SHARED_BUFFER 0xC000
84
85#define HOST_TO_NGENE (SHARED_BUFFER+0x0000)
86#define NGENE_TO_HOST (SHARED_BUFFER+0x0100)
87#define NGENE_COMMAND (SHARED_BUFFER+0x0200)
88#define NGENE_COMMAND_HI (SHARED_BUFFER+0x0204)
89#define NGENE_STATUS (SHARED_BUFFER+0x0208)
90#define NGENE_STATUS_HI (SHARED_BUFFER+0x020C)
91#define NGENE_EVENT (SHARED_BUFFER+0x0210)
92#define NGENE_EVENT_HI (SHARED_BUFFER+0x0214)
93#define VARIABLES (SHARED_BUFFER+0x0210)
94
95#define NGENE_INT_COUNTS (SHARED_BUFFER+0x0260)
96#define NGENE_INT_ENABLE (SHARED_BUFFER+0x0264)
97#define NGENE_VBI_LINE_COUNT (SHARED_BUFFER+0x0268)
98
99#define BUFFER_GP_XMIT (SHARED_BUFFER+0x0800)
100#define BUFFER_GP_RECV (SHARED_BUFFER+0x0900)
101#define EEPROM_AREA (SHARED_BUFFER+0x0A00)
102
103#define SG_V_IN_1 (SHARED_BUFFER+0x0A80)
104#define SG_VBI_1 (SHARED_BUFFER+0x0B00)
105#define SG_A_IN_1 (SHARED_BUFFER+0x0B80)
106#define SG_V_IN_2 (SHARED_BUFFER+0x0C00)
107#define SG_VBI_2 (SHARED_BUFFER+0x0C80)
108#define SG_A_IN_2 (SHARED_BUFFER+0x0D00)
109#define SG_V_OUT (SHARED_BUFFER+0x0D80)
110#define SG_A_OUT2 (SHARED_BUFFER+0x0E00)
111
112#define DATA_A_IN_1 (SHARED_BUFFER+0x0E80)
113#define DATA_A_IN_2 (SHARED_BUFFER+0x0F00)
114#define DATA_A_OUT (SHARED_BUFFER+0x0F80)
115#define DATA_V_IN_1 (SHARED_BUFFER+0x1000)
116#define DATA_V_IN_2 (SHARED_BUFFER+0x2000)
117#define DATA_V_OUT (SHARED_BUFFER+0x3000)
118
119#define DATA_FIFO_AREA (SHARED_BUFFER+0x1000)
120
121#define TIMESTAMPS 0xA000
122#define SCRATCHPAD 0xA080
123#define FORCE_INT 0xA088
124#define FORCE_NMI 0xA090
125#define INT_STATUS 0xA0A0
126
127#define DEV_VER 0x9004
128
129#define FW_DEBUG_DEFAULT (PROGRAM_SRAM+0x00FF)
130
131struct SG_ADDR {
132 u64 start;
133 u64 curr;
134 u16 curr_ptr;
135 u16 elements;
136 u32 pad[3];
137} __attribute__ ((__packed__));
138
139struct SHARED_MEMORY {
140 /* C000 */
141 u32 HostToNgene[64];
142
143 /* C100 */
144 u32 NgeneToHost[64];
145
146 /* C200 */
147 u64 NgeneCommand;
148 u64 NgeneStatus;
149 u64 NgeneEvent;
150
151 /* C210 */
152 u8 pad1[0xc260 - 0xc218];
153
154 /* C260 */
155 u32 IntCounts;
156 u32 IntEnable;
157
158 /* C268 */
159 u8 pad2[0xd000 - 0xc268];
160
161} __attribute__ ((__packed__));
162
163struct BUFFER_STREAM_RESULTS {
164 u32 Clock; /* Stream time in 100ns units */
165 u16 RemainingLines; /* Remaining lines in this field.
166 0 for complete field */
167 u8 FieldCount; /* Video field number */
168 u8 Flags; /* Bit 7 = Done, Bit 6 = seen, Bit 5 = overflow,
169 Bit 0 = FieldID */
170 u16 BlockCount; /* Audio block count (unused) */
171 u8 Reserved[2];
172 u32 DTOUpdate;
173} __attribute__ ((__packed__));
174
175struct HW_SCATTER_GATHER_ELEMENT {
176 u64 Address;
177 u32 Length;
178 u32 Reserved;
179} __attribute__ ((__packed__));
180
181struct BUFFER_HEADER {
182 u64 Next;
183 struct BUFFER_STREAM_RESULTS SR;
184
185 u32 Number_of_entries_1;
186 u32 Reserved5;
187 u64 Address_of_first_entry_1;
188
189 u32 Number_of_entries_2;
190 u32 Reserved7;
191 u64 Address_of_first_entry_2;
192} __attribute__ ((__packed__));
193
194struct EVENT_BUFFER {
195 u32 TimeStamp;
196 u8 GPIOStatus;
197 u8 UARTStatus;
198 u8 RXCharacter;
199 u8 EventStatus;
200 u32 Reserved[2];
201} __attribute__ ((__packed__));
202
203/* Firmware commands. */
204
205enum OPCODES {
206 CMD_NOP = 0,
207 CMD_FWLOAD_PREPARE = 0x01,
208 CMD_FWLOAD_FINISH = 0x02,
209 CMD_I2C_READ = 0x03,
210 CMD_I2C_WRITE = 0x04,
211
212 CMD_I2C_WRITE_NOSTOP = 0x05,
213 CMD_I2C_CONTINUE_WRITE = 0x06,
214 CMD_I2C_CONTINUE_WRITE_NOSTOP = 0x07,
215
216 CMD_DEBUG_OUTPUT = 0x09,
217
218 CMD_CONTROL = 0x10,
219 CMD_CONFIGURE_BUFFER = 0x11,
220 CMD_CONFIGURE_FREE_BUFFER = 0x12,
221
222 CMD_SPI_READ = 0x13,
223 CMD_SPI_WRITE = 0x14,
224
225 CMD_MEM_READ = 0x20,
226 CMD_MEM_WRITE = 0x21,
227 CMD_SFR_READ = 0x22,
228 CMD_SFR_WRITE = 0x23,
229 CMD_IRAM_READ = 0x24,
230 CMD_IRAM_WRITE = 0x25,
231 CMD_SET_GPIO_PIN = 0x26,
232 CMD_SET_GPIO_INT = 0x27,
233 CMD_CONFIGURE_UART = 0x28,
234 CMD_WRITE_UART = 0x29,
235 MAX_CMD
236};
237
238enum RESPONSES {
239 OK = 0,
240 ERROR = 1
241};
242
243struct FW_HEADER {
244 u8 Opcode;
245 u8 Length;
246} __attribute__ ((__packed__));
247
248struct FW_I2C_WRITE {
249 struct FW_HEADER hdr;
250 u8 Device;
251 u8 Data[250];
252} __attribute__ ((__packed__));
253
254struct FW_I2C_CONTINUE_WRITE {
255 struct FW_HEADER hdr;
256 u8 Data[250];
257} __attribute__ ((__packed__));
258
259struct FW_I2C_READ {
260 struct FW_HEADER hdr;
261 u8 Device;
262 u8 Data[252]; /* followed by two bytes of read data count */
263} __attribute__ ((__packed__));
264
265struct FW_SPI_WRITE {
266 struct FW_HEADER hdr;
267 u8 ModeSelect;
268 u8 Data[250];
269} __attribute__ ((__packed__));
270
271struct FW_SPI_READ {
272 struct FW_HEADER hdr;
273 u8 ModeSelect;
274 u8 Data[252]; /* followed by two bytes of read data count */
275} __attribute__ ((__packed__));
276
277struct FW_FWLOAD_PREPARE {
278 struct FW_HEADER hdr;
279} __attribute__ ((__packed__));
280
281struct FW_FWLOAD_FINISH {
282 struct FW_HEADER hdr;
283 u16 Address; /* address of final block */
284 u16 Length;
285} __attribute__ ((__packed__));
286
287/*
288 * Meaning of FW_STREAM_CONTROL::Mode bits:
289 * Bit 7: Loopback PEXin to PEXout using TVOut channel
290 * Bit 6: AVLOOP
291 * Bit 5: Audio select; 0=I2S, 1=SPDIF
292 * Bit 4: AVSYNC
293 * Bit 3: Enable transport stream
294 * Bit 2: Enable audio capture
295 * Bit 1: Enable ITU-Video VBI capture
296 * Bit 0: Enable ITU-Video capture
297 *
298 * Meaning of FW_STREAM_CONTROL::Control bits (see UVI1_CTL)
299 * Bit 7: continuous capture
300 * Bit 6: capture one field
301 * Bit 5: capture one frame
302 * Bit 4: unused
303 * Bit 3: starting field; 0=odd, 1=even
304 * Bit 2: sample size; 0=8-bit, 1=10-bit
305 * Bit 1: data format; 0=UYVY, 1=YUY2
306 * Bit 0: resets buffer pointers
307*/
308
309enum FSC_MODE_BITS {
310 SMODE_LOOPBACK = 0x80,
311 SMODE_AVLOOP = 0x40,
312 _SMODE_AUDIO_SPDIF = 0x20,
313 _SMODE_AVSYNC = 0x10,
314 _SMODE_TRANSPORT_STREAM = 0x08,
315 _SMODE_AUDIO_CAPTURE = 0x04,
316 _SMODE_VBI_CAPTURE = 0x02,
317 _SMODE_VIDEO_CAPTURE = 0x01
318};
319
320
321/* Meaning of FW_STREAM_CONTROL::Stream bits:
322 * Bit 3: Audio sample count: 0 = relative, 1 = absolute
323 * Bit 2: color bar select; 1=color bars, 0=CV3 decoder
324 * Bits 1-0: stream select, UVI1, UVI2, TVOUT
325 */
326
327struct FW_STREAM_CONTROL {
328 struct FW_HEADER hdr;
329 u8 Stream; /* Stream number (UVI1, UVI2, TVOUT) */
330 u8 Control; /* Value written to UVI1_CTL */
331 u8 Mode; /* Controls clock source */
332 u8 SetupDataLen; /* Length of setup data, MSB=1 write
333 backwards */
334 u16 CaptureBlockCount; /* Blocks (a 256 Bytes) to capture per buffer
335 for TS and Audio */
336 u64 Buffer_Address; /* Address of first buffer header */
337 u16 BytesPerVideoLine;
338 u16 MaxLinesPerField;
339 u16 MinLinesPerField;
340 u16 Reserved_1;
341 u16 BytesPerVBILine;
342 u16 MaxVBILinesPerField;
343 u16 MinVBILinesPerField;
344 u16 SetupDataAddr; /* ngene relative address of setup data */
345 u8 SetupData[32]; /* setup data */
346} __attribute__((__packed__));
347
348#define AUDIO_BLOCK_SIZE 256
349#define TS_BLOCK_SIZE 256
350
351struct FW_MEM_READ {
352 struct FW_HEADER hdr;
353 u16 address;
354} __attribute__ ((__packed__));
355
356struct FW_MEM_WRITE {
357 struct FW_HEADER hdr;
358 u16 address;
359 u8 data;
360} __attribute__ ((__packed__));
361
362struct FW_SFR_IRAM_READ {
363 struct FW_HEADER hdr;
364 u8 address;
365} __attribute__ ((__packed__));
366
367struct FW_SFR_IRAM_WRITE {
368 struct FW_HEADER hdr;
369 u8 address;
370 u8 data;
371} __attribute__ ((__packed__));
372
373struct FW_SET_GPIO_PIN {
374 struct FW_HEADER hdr;
375 u8 select;
376} __attribute__ ((__packed__));
377
378struct FW_SET_GPIO_INT {
379 struct FW_HEADER hdr;
380 u8 select;
381} __attribute__ ((__packed__));
382
383struct FW_SET_DEBUGMODE {
384 struct FW_HEADER hdr;
385 u8 debug_flags;
386} __attribute__ ((__packed__));
387
388struct FW_CONFIGURE_BUFFERS {
389 struct FW_HEADER hdr;
390 u8 config;
391} __attribute__ ((__packed__));
392
393enum _BUFFER_CONFIGS {
394 /* 4k UVI1, 4k UVI2, 2k AUD1, 2k AUD2 (standard usage) */
395 BUFFER_CONFIG_4422 = 0,
396 /* 3k UVI1, 3k UVI2, 3k AUD1, 3k AUD2 (4x TS input usage) */
397 BUFFER_CONFIG_3333 = 1,
398 /* 8k UVI1, 0k UVI2, 2k AUD1, 2k I2SOut (HDTV decoder usage) */
399 BUFFER_CONFIG_8022 = 2,
400 BUFFER_CONFIG_FW17 = 255, /* Use new FW 17 command */
401};
402
403struct FW_CONFIGURE_FREE_BUFFERS {
404 struct FW_HEADER hdr;
405 u8 UVI1_BufferLength;
406 u8 UVI2_BufferLength;
407 u8 TVO_BufferLength;
408 u8 AUD1_BufferLength;
409 u8 AUD2_BufferLength;
410 u8 TVA_BufferLength;
411} __attribute__ ((__packed__));
412
413struct FW_CONFIGURE_UART {
414 struct FW_HEADER hdr;
415 u8 UartControl;
416} __attribute__ ((__packed__));
417
418enum _UART_CONFIG {
419 _UART_BAUDRATE_19200 = 0,
420 _UART_BAUDRATE_9600 = 1,
421 _UART_BAUDRATE_4800 = 2,
422 _UART_BAUDRATE_2400 = 3,
423 _UART_RX_ENABLE = 0x40,
424 _UART_TX_ENABLE = 0x80,
425};
426
427struct FW_WRITE_UART {
428 struct FW_HEADER hdr;
429 u8 Data[252];
430} __attribute__ ((__packed__));
431
432
433struct ngene_command {
434 u32 in_len;
435 u32 out_len;
436 union {
437 u32 raw[64];
438 u8 raw8[256];
439 struct FW_HEADER hdr;
440 struct FW_I2C_WRITE I2CWrite;
441 struct FW_I2C_CONTINUE_WRITE I2CContinueWrite;
442 struct FW_I2C_READ I2CRead;
443 struct FW_STREAM_CONTROL StreamControl;
444 struct FW_FWLOAD_PREPARE FWLoadPrepare;
445 struct FW_FWLOAD_FINISH FWLoadFinish;
446 struct FW_MEM_READ MemoryRead;
447 struct FW_MEM_WRITE MemoryWrite;
448 struct FW_SFR_IRAM_READ SfrIramRead;
449 struct FW_SFR_IRAM_WRITE SfrIramWrite;
450 struct FW_SPI_WRITE SPIWrite;
451 struct FW_SPI_READ SPIRead;
452 struct FW_SET_GPIO_PIN SetGpioPin;
453 struct FW_SET_GPIO_INT SetGpioInt;
454 struct FW_SET_DEBUGMODE SetDebugMode;
455 struct FW_CONFIGURE_BUFFERS ConfigureBuffers;
456 struct FW_CONFIGURE_FREE_BUFFERS ConfigureFreeBuffers;
457 struct FW_CONFIGURE_UART ConfigureUart;
458 struct FW_WRITE_UART WriteUart;
459 } cmd;
460} __attribute__ ((__packed__));
461
462#define NGENE_INTERFACE_VERSION 0x103
463#define MAX_VIDEO_BUFFER_SIZE (417792) /* 288*1440 rounded up to next page */
464#define MAX_AUDIO_BUFFER_SIZE (8192) /* Gives room for about 23msec@48KHz */
465#define MAX_VBI_BUFFER_SIZE (28672) /* 1144*18 rounded up to next page */
466#define MAX_TS_BUFFER_SIZE (98304) /* 512*188 rounded up to next page */
467#define MAX_HDTV_BUFFER_SIZE (2080768) /* 541*1920*2 rounded up to next page
468 Max: (1920x1080i60) */
469
470#define OVERFLOW_BUFFER_SIZE (8192)
471
472#define RING_SIZE_VIDEO 4
473#define RING_SIZE_AUDIO 8
474#define RING_SIZE_TS 8
475
476#define NUM_SCATTER_GATHER_ENTRIES 8
477
478#define MAX_DMA_LENGTH (((MAX_VIDEO_BUFFER_SIZE + MAX_VBI_BUFFER_SIZE) * \
479 RING_SIZE_VIDEO * 2) + \
480 (MAX_AUDIO_BUFFER_SIZE * RING_SIZE_AUDIO * 2) + \
481 (MAX_TS_BUFFER_SIZE * RING_SIZE_TS * 4) + \
482 (RING_SIZE_VIDEO * PAGE_SIZE * 2) + \
483 (RING_SIZE_AUDIO * PAGE_SIZE * 2) + \
484 (RING_SIZE_TS * PAGE_SIZE * 4) + \
485 8 * PAGE_SIZE + OVERFLOW_BUFFER_SIZE + PAGE_SIZE)
486
487#define EVENT_QUEUE_SIZE 16
488
489/* Gathers the current state of a single channel. */
490
491struct SBufferHeader {
492 struct BUFFER_HEADER ngeneBuffer; /* Physical descriptor */
493 struct SBufferHeader *Next;
494 void *Buffer1;
495 struct HW_SCATTER_GATHER_ELEMENT *scList1;
496 void *Buffer2;
497 struct HW_SCATTER_GATHER_ELEMENT *scList2;
498};
499
500/* Sizeof SBufferHeader aligned to next 64 Bit boundary (hw restriction) */
501#define SIZEOF_SBufferHeader ((sizeof(struct SBufferHeader) + 63) & ~63)
502
503enum HWSTATE {
504 HWSTATE_STOP,
505 HWSTATE_STARTUP,
506 HWSTATE_RUN,
507 HWSTATE_PAUSE,
508};
509
510enum KSSTATE {
511 KSSTATE_STOP,
512 KSSTATE_ACQUIRE,
513 KSSTATE_PAUSE,
514 KSSTATE_RUN,
515};
516
517struct SRingBufferDescriptor {
518 struct SBufferHeader *Head; /* Points to first buffer in ring buffer
519 structure*/
520 u64 PAHead; /* Physical address of first buffer */
521 u32 MemSize; /* Memory size of allocated ring buffers
522 (needed for freeing) */
523 u32 NumBuffers; /* Number of buffers in the ring */
524 u32 Buffer1Length; /* Allocated length of Buffer 1 */
525 u32 Buffer2Length; /* Allocated length of Buffer 2 */
526 void *SCListMem; /* Memory to hold scatter gather lists for this
527 ring */
528 u64 PASCListMem; /* Physical address .. */
529 u32 SCListMemSize; /* Size of this memory */
530};
531
532enum STREAMMODEFLAGS {
533 StreamMode_NONE = 0, /* Stream not used */
534 StreamMode_ANALOG = 1, /* Analog: Stream 0,1 = Video, 2,3 = Audio */
535 StreamMode_TSIN = 2, /* Transport stream input (all) */
536 StreamMode_HDTV = 4, /* HDTV: Maximum 1920x1080p30,1920x1080i60
537 (only stream 0) */
538 StreamMode_TSOUT = 8, /* Transport stream output (only stream 3) */
539};
540
541
542enum BufferExchangeFlags {
543 BEF_EVEN_FIELD = 0x00000001,
544 BEF_CONTINUATION = 0x00000002,
545 BEF_MORE_DATA = 0x00000004,
546 BEF_OVERFLOW = 0x00000008,
547 DF_SWAP32 = 0x00010000,
548};
549
550typedef void *(IBufferExchange)(void *, void *, u32, u32, u32);
551
552struct MICI_STREAMINFO {
553 IBufferExchange *pExchange;
554 IBufferExchange *pExchangeVBI; /* Secondary (VBI, ancillary) */
555 u8 Stream;
556 u8 Flags;
557 u8 Mode;
558 u8 Reserved;
559 u16 nLinesVideo;
560 u16 nBytesPerLineVideo;
561 u16 nLinesVBI;
562 u16 nBytesPerLineVBI;
563 u32 CaptureLength; /* Used for audio and transport stream */
564};
565
566/****************************************************************************/
567/* STRUCTS ******************************************************************/
568/****************************************************************************/
569
570/* sound hardware definition */
571#define MIXER_ADDR_TVTUNER 0
572#define MIXER_ADDR_LAST 0
573
574struct ngene_channel;
575
576/*struct sound chip*/
577
578struct mychip {
579 struct ngene_channel *chan;
580 struct snd_card *card;
581 struct pci_dev *pci;
582 struct snd_pcm_substream *substream;
583 struct snd_pcm *pcm;
584 unsigned long port;
585 int irq;
586 spinlock_t mixer_lock;
587 spinlock_t lock;
588 int mixer_volume[MIXER_ADDR_LAST + 1][2];
589 int capture_source[MIXER_ADDR_LAST + 1][2];
590};
591
592#ifdef NGENE_V4L
593struct ngene_overlay {
594 int tvnorm;
595 struct v4l2_rect w;
596 enum v4l2_field field;
597 struct v4l2_clip *clips;
598 int nclips;
599 int setup_ok;
600};
601
602struct ngene_tvnorm {
603 int v4l2_id;
604 char *name;
605 u16 swidth, sheight; /* scaled standard width, height */
606 int tuner_norm;
607 int soundstd;
608};
609
610struct ngene_vopen {
611 struct ngene_channel *ch;
612 enum v4l2_priority prio;
613 int width;
614 int height;
615 int depth;
616 struct videobuf_queue vbuf_q;
617 struct videobuf_queue vbi;
618 int fourcc;
619 int picxcount;
620 int resources;
621 enum v4l2_buf_type type;
622 const struct ngene_format *fmt;
623
624 const struct ngene_format *ovfmt;
625 struct ngene_overlay ov;
626};
627#endif
628
629struct ngene_channel {
630 struct device device;
631 struct i2c_adapter i2c_adapter;
632
633 struct ngene *dev;
634 int number;
635 int type;
636 int mode;
637
638 struct dvb_frontend *fe;
639 struct dmxdev dmxdev;
640 struct dvb_demux demux;
641 struct dmx_frontend hw_frontend;
642 struct dmx_frontend mem_frontend;
643 int users;
644 struct video_device *v4l_dev;
645 struct tasklet_struct demux_tasklet;
646
647 struct SBufferHeader *nextBuffer;
648 enum KSSTATE State;
649 enum HWSTATE HWState;
650 u8 Stream;
651 u8 Flags;
652 u8 Mode;
653 IBufferExchange *pBufferExchange;
654 IBufferExchange *pBufferExchange2;
655
656 spinlock_t state_lock;
657 u16 nLines;
658 u16 nBytesPerLine;
659 u16 nVBILines;
660 u16 nBytesPerVBILine;
661 u16 itumode;
662 u32 Capture1Length;
663 u32 Capture2Length;
664 struct SRingBufferDescriptor RingBuffer;
665 struct SRingBufferDescriptor TSRingBuffer;
666 struct SRingBufferDescriptor TSIdleBuffer;
667
668 u32 DataFormatFlags;
669
670 int AudioDTOUpdated;
671 u32 AudioDTOValue;
672
673 int (*set_tone)(struct dvb_frontend *, fe_sec_tone_mode_t);
674 u8 lnbh;
675
676 /* stuff from analog driver */
677
678 int minor;
679 struct mychip *mychip;
680 struct snd_card *soundcard;
681 u8 *evenbuffer;
682 u8 dma_on;
683 int soundstreamon;
684 int audiomute;
685 int soundbuffisallocated;
686 int sndbuffflag;
687 int tun_rdy;
688 int dec_rdy;
689 int tun_dec_rdy;
690 int lastbufferflag;
691
692 struct ngene_tvnorm *tvnorms;
693 int tvnorm_num;
694 int tvnorm;
695
696#ifdef NGENE_V4L
697 int videousers;
698 struct v4l2_prio_state prio;
699 struct ngene_vopen init;
700 int resources;
701 struct v4l2_framebuffer fbuf;
702 struct ngene_buffer *screen; /* overlay */
703 struct list_head capture; /* video capture queue */
704 spinlock_t s_lock;
705 struct semaphore reslock;
706#endif
707
708 int running;
709};
710
711struct ngene;
712
713typedef void (rx_cb_t)(struct ngene *, u32, u8);
714typedef void (tx_cb_t)(struct ngene *, u32);
715
716struct ngene {
717 int nr;
718 struct pci_dev *pci_dev;
719 unsigned char *iomem;
720
721 /*struct i2c_adapter i2c_adapter;*/
722
723 u32 device_version;
724 u32 fw_interface_version;
725 u32 icounts;
726
727 u8 *CmdDoneByte;
728 int BootFirmware;
729 void *OverflowBuffer;
730 dma_addr_t PAOverflowBuffer;
731 void *FWInterfaceBuffer;
732 dma_addr_t PAFWInterfaceBuffer;
733 u8 *ngenetohost;
734 u8 *hosttongene;
735
736 struct EVENT_BUFFER EventQueue[EVENT_QUEUE_SIZE];
737 int EventQueueOverflowCount;
738 int EventQueueOverflowFlag;
739 struct tasklet_struct event_tasklet;
740 struct EVENT_BUFFER *EventBuffer;
741 int EventQueueWriteIndex;
742 int EventQueueReadIndex;
743
744 wait_queue_head_t cmd_wq;
745 int cmd_done;
746 struct semaphore cmd_mutex;
747 struct semaphore stream_mutex;
748 struct semaphore pll_mutex;
749 struct semaphore i2c_switch_mutex;
750 int i2c_current_channel;
751 int i2c_current_bus;
752 spinlock_t cmd_lock;
753
754 struct dvb_adapter adapter[MAX_STREAM];
755 struct ngene_channel channel[MAX_STREAM];
756
757 struct ngene_info *card_info;
758
759 tx_cb_t *TxEventNotify;
760 rx_cb_t *RxEventNotify;
761 int tx_busy;
762 wait_queue_head_t tx_wq;
763 wait_queue_head_t rx_wq;
764#define UART_RBUF_LEN 4096
765 u8 uart_rbuf[UART_RBUF_LEN];
766 int uart_rp, uart_wp;
767
768 u8 *tsout_buf;
769#define TSOUT_BUF_SIZE (512*188*8)
770 struct dvb_ringbuffer tsout_rbuf;
771
772 u8 *ain_buf;
773#define AIN_BUF_SIZE (128*1024)
774 struct dvb_ringbuffer ain_rbuf;
775
776
777 u8 *vin_buf;
778#define VIN_BUF_SIZE (4*1920*1080)
779 struct dvb_ringbuffer vin_rbuf;
780
781 unsigned long exp_val;
782 int prev_cmd;
783};
784
785struct ngene_info {
786 int type;
787#define NGENE_APP 0
788#define NGENE_TERRATEC 1
789#define NGENE_SIDEWINDER 2
790#define NGENE_RACER 3
791#define NGENE_VIPER 4
792#define NGENE_PYTHON 5
793#define NGENE_VBOX_V1 6
794#define NGENE_VBOX_V2 7
795
796 int fw_version;
797 char *name;
798
799 int io_type[MAX_STREAM];
800#define NGENE_IO_NONE 0
801#define NGENE_IO_TV 1
802#define NGENE_IO_HDTV 2
803#define NGENE_IO_TSIN 4
804#define NGENE_IO_TSOUT 8
805#define NGENE_IO_AIN 16
806
807 void *fe_config[4];
808 void *tuner_config[4];
809
810 int (*demod_attach[4])(struct ngene_channel *);
811 int (*tuner_attach[4])(struct ngene_channel *);
812
813 u8 avf[4];
814 u8 msp[4];
815 u8 demoda[4];
816 u8 lnb[4];
817 int i2c_access;
818 u8 ntsc;
819 u8 tsf[4];
820 u8 i2s[4];
821
822 int (*gate_ctrl)(struct dvb_frontend *, int);
823 int (*switch_ctrl)(struct ngene_channel *, int, int);
824};
825
826#ifdef NGENE_V4L
827struct ngene_format{
828 char *name;
829 int fourcc; /* video4linux 2 */
830 int btformat; /* BT848_COLOR_FMT_* */
831 int format;
832 int btswap; /* BT848_COLOR_CTL_* */
833 int depth; /* bit/pixel */
834 int flags;
835 int hshift, vshift; /* for planar modes */
836 int palette;
837};
838
839#define RESOURCE_OVERLAY 1
840#define RESOURCE_VIDEO 2
841#define RESOURCE_VBI 4
842
843struct ngene_buffer {
844 /* common v4l buffer stuff -- must be first */
845 struct videobuf_buffer vb;
846
847 /* ngene specific */
848 const struct ngene_format *fmt;
849 int tvnorm;
850 int btformat;
851 int btswap;
852};
853#endif
854
855
856#endif
857
858/* LocalWords: Endif
859 */
diff --git a/drivers/media/dvb/pluto2/pluto2.c b/drivers/media/dvb/pluto2/pluto2.c
index 80d14a065bad..1c798219dc7c 100644
--- a/drivers/media/dvb/pluto2/pluto2.c
+++ b/drivers/media/dvb/pluto2/pluto2.c
@@ -30,6 +30,7 @@
30#include <linux/module.h> 30#include <linux/module.h>
31#include <linux/pci.h> 31#include <linux/pci.h>
32#include <linux/dma-mapping.h> 32#include <linux/dma-mapping.h>
33#include <linux/slab.h>
33 34
34#include "demux.h" 35#include "demux.h"
35#include "dmxdev.h" 36#include "dmxdev.h"
diff --git a/drivers/media/dvb/pt1/pt1.c b/drivers/media/dvb/pt1/pt1.c
index 1fd8306371e2..6aded234aa61 100644
--- a/drivers/media/dvb/pt1/pt1.c
+++ b/drivers/media/dvb/pt1/pt1.c
@@ -23,11 +23,11 @@
23 23
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/slab.h>
26#include <linux/vmalloc.h> 27#include <linux/vmalloc.h>
27#include <linux/pci.h> 28#include <linux/pci.h>
28#include <linux/kthread.h> 29#include <linux/kthread.h>
29#include <linux/freezer.h> 30#include <linux/freezer.h>
30#include <linux/vmalloc.h>
31 31
32#include "dvbdev.h" 32#include "dvbdev.h"
33#include "dvb_demux.h" 33#include "dvb_demux.h"
diff --git a/drivers/media/dvb/pt1/va1j5jf8007s.c b/drivers/media/dvb/pt1/va1j5jf8007s.c
index 2db940f8635f..fc6594996e79 100644
--- a/drivers/media/dvb/pt1/va1j5jf8007s.c
+++ b/drivers/media/dvb/pt1/va1j5jf8007s.c
@@ -48,6 +48,60 @@ struct va1j5jf8007s_state {
48 enum va1j5jf8007s_tune_state tune_state; 48 enum va1j5jf8007s_tune_state tune_state;
49}; 49};
50 50
51static int va1j5jf8007s_read_snr(struct dvb_frontend *fe, u16 *snr)
52{
53 struct va1j5jf8007s_state *state;
54 u8 addr;
55 int i;
56 u8 write_buf[1], read_buf[1];
57 struct i2c_msg msgs[2];
58 s32 word, x1, x2, x3, x4, x5, y;
59
60 state = fe->demodulator_priv;
61 addr = state->config->demod_address;
62
63 word = 0;
64 for (i = 0; i < 2; i++) {
65 write_buf[0] = 0xbc + i;
66
67 msgs[0].addr = addr;
68 msgs[0].flags = 0;
69 msgs[0].len = sizeof(write_buf);
70 msgs[0].buf = write_buf;
71
72 msgs[1].addr = addr;
73 msgs[1].flags = I2C_M_RD;
74 msgs[1].len = sizeof(read_buf);
75 msgs[1].buf = read_buf;
76
77 if (i2c_transfer(state->adap, msgs, 2) != 2)
78 return -EREMOTEIO;
79
80 word <<= 8;
81 word |= read_buf[0];
82 }
83
84 word -= 3000;
85 if (word < 0)
86 word = 0;
87
88 x1 = int_sqrt(word << 16) * ((15625ll << 21) / 1000000);
89 x2 = (s64)x1 * x1 >> 31;
90 x3 = (s64)x2 * x1 >> 31;
91 x4 = (s64)x2 * x2 >> 31;
92 x5 = (s64)x4 * x1 >> 31;
93
94 y = (58857ll << 23) / 1000;
95 y -= (s64)x1 * ((89565ll << 24) / 1000) >> 30;
96 y += (s64)x2 * ((88977ll << 24) / 1000) >> 28;
97 y -= (s64)x3 * ((50259ll << 25) / 1000) >> 27;
98 y += (s64)x4 * ((14341ll << 27) / 1000) >> 27;
99 y -= (s64)x5 * ((16346ll << 30) / 10000) >> 28;
100
101 *snr = y < 0 ? 0 : y >> 15;
102 return 0;
103}
104
51static int va1j5jf8007s_get_frontend_algo(struct dvb_frontend *fe) 105static int va1j5jf8007s_get_frontend_algo(struct dvb_frontend *fe)
52{ 106{
53 return DVBFE_ALGO_HW; 107 return DVBFE_ALGO_HW;
@@ -337,7 +391,7 @@ va1j5jf8007s_tune(struct dvb_frontend *fe,
337{ 391{
338 struct va1j5jf8007s_state *state; 392 struct va1j5jf8007s_state *state;
339 int ret; 393 int ret;
340 int lock; 394 int lock = 0;
341 395
342 state = fe->demodulator_priv; 396 state = fe->demodulator_priv;
343 397
@@ -536,6 +590,7 @@ static struct dvb_frontend_ops va1j5jf8007s_ops = {
536 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO, 590 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
537 }, 591 },
538 592
593 .read_snr = va1j5jf8007s_read_snr,
539 .get_frontend_algo = va1j5jf8007s_get_frontend_algo, 594 .get_frontend_algo = va1j5jf8007s_get_frontend_algo,
540 .read_status = va1j5jf8007s_read_status, 595 .read_status = va1j5jf8007s_read_status,
541 .tune = va1j5jf8007s_tune, 596 .tune = va1j5jf8007s_tune,
diff --git a/drivers/media/dvb/pt1/va1j5jf8007t.c b/drivers/media/dvb/pt1/va1j5jf8007t.c
index 71117f4ca7e6..3db4f3e34e8f 100644
--- a/drivers/media/dvb/pt1/va1j5jf8007t.c
+++ b/drivers/media/dvb/pt1/va1j5jf8007t.c
@@ -46,6 +46,52 @@ struct va1j5jf8007t_state {
46 enum va1j5jf8007t_tune_state tune_state; 46 enum va1j5jf8007t_tune_state tune_state;
47}; 47};
48 48
49static int va1j5jf8007t_read_snr(struct dvb_frontend *fe, u16 *snr)
50{
51 struct va1j5jf8007t_state *state;
52 u8 addr;
53 int i;
54 u8 write_buf[1], read_buf[1];
55 struct i2c_msg msgs[2];
56 s32 word, x, y;
57
58 state = fe->demodulator_priv;
59 addr = state->config->demod_address;
60
61 word = 0;
62 for (i = 0; i < 3; i++) {
63 write_buf[0] = 0x8b + i;
64
65 msgs[0].addr = addr;
66 msgs[0].flags = 0;
67 msgs[0].len = sizeof(write_buf);
68 msgs[0].buf = write_buf;
69
70 msgs[1].addr = addr;
71 msgs[1].flags = I2C_M_RD;
72 msgs[1].len = sizeof(read_buf);
73 msgs[1].buf = read_buf;
74
75 if (i2c_transfer(state->adap, msgs, 2) != 2)
76 return -EREMOTEIO;
77
78 word <<= 8;
79 word |= read_buf[0];
80 }
81
82 if (!word)
83 return -EIO;
84
85 x = 10 * (intlog10(0x540000 * 100 / word) - (2 << 24));
86 y = (24ll << 46) / 1000000;
87 y = ((s64)y * x >> 30) - (16ll << 40) / 10000;
88 y = ((s64)y * x >> 29) + (398ll << 35) / 10000;
89 y = ((s64)y * x >> 30) + (5491ll << 29) / 10000;
90 y = ((s64)y * x >> 30) + (30965ll << 23) / 10000;
91 *snr = y >> 15;
92 return 0;
93}
94
49static int va1j5jf8007t_get_frontend_algo(struct dvb_frontend *fe) 95static int va1j5jf8007t_get_frontend_algo(struct dvb_frontend *fe)
50{ 96{
51 return DVBFE_ALGO_HW; 97 return DVBFE_ALGO_HW;
@@ -224,7 +270,7 @@ va1j5jf8007t_tune(struct dvb_frontend *fe,
224{ 270{
225 struct va1j5jf8007t_state *state; 271 struct va1j5jf8007t_state *state;
226 int ret; 272 int ret;
227 int lock, retry; 273 int lock = 0, retry = 0;
228 274
229 state = fe->demodulator_priv; 275 state = fe->demodulator_priv;
230 276
@@ -393,6 +439,7 @@ static struct dvb_frontend_ops va1j5jf8007t_ops = {
393 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO, 439 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
394 }, 440 },
395 441
442 .read_snr = va1j5jf8007t_read_snr,
396 .get_frontend_algo = va1j5jf8007t_get_frontend_algo, 443 .get_frontend_algo = va1j5jf8007t_get_frontend_algo,
397 .read_status = va1j5jf8007t_read_status, 444 .read_status = va1j5jf8007t_read_status,
398 .tune = va1j5jf8007t_tune, 445 .tune = va1j5jf8007t_tune,
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
index 0420e2885e75..cff77e2eb557 100644
--- a/drivers/media/dvb/siano/sms-cards.c
+++ b/drivers/media/dvb/siano/sms-cards.c
@@ -62,6 +62,7 @@ static struct sms_board sms_boards[] = {
62 [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { 62 [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
63 .name = "Hauppauge WinTV MiniStick", 63 .name = "Hauppauge WinTV MiniStick",
64 .type = SMS_NOVA_B0, 64 .type = SMS_NOVA_B0,
65 .fw[DEVICE_MODE_ISDBT_BDA] = "sms1xxx-hcw-55xxx-isdbt-02.fw",
65 .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", 66 .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
66 .board_cfg.leds_power = 26, 67 .board_cfg.leds_power = 26,
67 .board_cfg.led0 = 27, 68 .board_cfg.led0 = 27,
@@ -97,7 +98,7 @@ static struct sms_board sms_boards[] = {
97 }, 98 },
98}; 99};
99 100
100struct sms_board *sms_get_board(int id) 101struct sms_board *sms_get_board(unsigned id)
101{ 102{
102 BUG_ON(id >= ARRAY_SIZE(sms_boards)); 103 BUG_ON(id >= ARRAY_SIZE(sms_boards));
103 104
@@ -294,6 +295,8 @@ int sms_board_load_modules(int id)
294 case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A: 295 case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A:
295 case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B: 296 case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B:
296 case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: 297 case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
298 case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
299 case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
297 request_module("smsdvb"); 300 request_module("smsdvb");
298 break; 301 break;
299 default: 302 default:
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h
index 38f062f6ad68..8f19fc000b46 100644
--- a/drivers/media/dvb/siano/sms-cards.h
+++ b/drivers/media/dvb/siano/sms-cards.h
@@ -81,7 +81,7 @@ struct sms_board {
81 int led_power, led_hi, led_lo, lna_ctrl, rf_switch; 81 int led_power, led_hi, led_lo, lna_ctrl, rf_switch;
82}; 82};
83 83
84struct sms_board *sms_get_board(int id); 84struct sms_board *sms_get_board(unsigned id);
85 85
86extern struct smscore_device_t *coredev; 86extern struct smscore_device_t *coredev;
87 87
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c
index fa6a62369a78..0c87a3c3899a 100644
--- a/drivers/media/dvb/siano/smscoreapi.c
+++ b/drivers/media/dvb/siano/smscoreapi.c
@@ -28,6 +28,7 @@
28#include <linux/dma-mapping.h> 28#include <linux/dma-mapping.h>
29#include <linux/delay.h> 29#include <linux/delay.h>
30#include <linux/io.h> 30#include <linux/io.h>
31#include <linux/slab.h>
31 32
32#include <linux/firmware.h> 33#include <linux/firmware.h>
33#include <linux/wait.h> 34#include <linux/wait.h>
@@ -1373,7 +1374,7 @@ static int GetGpioPinParams(u32 PinNum, u32 *pTranslatedPinNum,
1373 1374
1374 *pGroupCfg = 1; 1375 *pGroupCfg = 1;
1375 1376
1376 if (PinNum >= 0 && PinNum <= 1) { 1377 if (PinNum <= 1) {
1377 *pTranslatedPinNum = 0; 1378 *pTranslatedPinNum = 0;
1378 *pGroupNum = 9; 1379 *pGroupNum = 9;
1379 *pGroupCfg = 2; 1380 *pGroupCfg = 2;
@@ -1459,8 +1460,10 @@ int smscore_gpio_configure(struct smscore_device_t *coredev, u8 PinNum,
1459 if (!(coredev->device_flags & SMS_DEVICE_FAMILY2)) { 1460 if (!(coredev->device_flags & SMS_DEVICE_FAMILY2)) {
1460 pMsg->xMsgHeader.msgType = MSG_SMS_GPIO_CONFIG_REQ; 1461 pMsg->xMsgHeader.msgType = MSG_SMS_GPIO_CONFIG_REQ;
1461 if (GetGpioPinParams(PinNum, &TranslatedPinNum, &GroupNum, 1462 if (GetGpioPinParams(PinNum, &TranslatedPinNum, &GroupNum,
1462 &groupCfg) != 0) 1463 &groupCfg) != 0) {
1463 return -EINVAL; 1464 rc = -EINVAL;
1465 goto free;
1466 }
1464 1467
1465 pMsg->msgData[1] = TranslatedPinNum; 1468 pMsg->msgData[1] = TranslatedPinNum;
1466 pMsg->msgData[2] = GroupNum; 1469 pMsg->msgData[2] = GroupNum;
@@ -1490,6 +1493,7 @@ int smscore_gpio_configure(struct smscore_device_t *coredev, u8 PinNum,
1490 else 1493 else
1491 sms_err("smscore_gpio_configure error"); 1494 sms_err("smscore_gpio_configure error");
1492 } 1495 }
1496free:
1493 kfree(buffer); 1497 kfree(buffer);
1494 1498
1495 return rc; 1499 return rc;
diff --git a/drivers/media/dvb/siano/smscoreapi.h b/drivers/media/dvb/siano/smscoreapi.h
index eec18aaf5512..8ecadecaa9d0 100644
--- a/drivers/media/dvb/siano/smscoreapi.h
+++ b/drivers/media/dvb/siano/smscoreapi.h
@@ -212,6 +212,8 @@ struct smscore_device_t {
212#define MSG_SMS_DAB_CHANNEL 607 212#define MSG_SMS_DAB_CHANNEL 607
213#define MSG_SMS_GET_PID_FILTER_LIST_REQ 608 213#define MSG_SMS_GET_PID_FILTER_LIST_REQ 608
214#define MSG_SMS_GET_PID_FILTER_LIST_RES 609 214#define MSG_SMS_GET_PID_FILTER_LIST_RES 609
215#define MSG_SMS_GET_STATISTICS_RES 616
216#define MSG_SMS_GET_STATISTICS_REQ 615
215#define MSG_SMS_HO_PER_SLICES_IND 630 217#define MSG_SMS_HO_PER_SLICES_IND 630
216#define MSG_SMS_SET_ANTENNA_CONFIG_REQ 651 218#define MSG_SMS_SET_ANTENNA_CONFIG_REQ 651
217#define MSG_SMS_SET_ANTENNA_CONFIG_RES 652 219#define MSG_SMS_SET_ANTENNA_CONFIG_RES 652
@@ -339,7 +341,7 @@ struct SmsFirmware_ST {
339 341
340/* Statistics information returned as response for 342/* Statistics information returned as response for
341 * SmsHostApiGetStatistics_Req */ 343 * SmsHostApiGetStatistics_Req */
342struct SMSHOSTLIB_STATISTICS_S { 344struct SMSHOSTLIB_STATISTICS_ST {
343 u32 Reserved; /* Reserved */ 345 u32 Reserved; /* Reserved */
344 346
345 /* Common parameters */ 347 /* Common parameters */
@@ -424,6 +426,79 @@ struct SMSHOSTLIB_STATISTICS_S {
424 u32 ReservedFields[10]; /* Reserved */ 426 u32 ReservedFields[10]; /* Reserved */
425}; 427};
426 428
429struct SmsMsgStatisticsInfo_ST {
430 u32 RequestResult;
431
432 struct SMSHOSTLIB_STATISTICS_ST Stat;
433
434 /* Split the calc of the SNR in DAB */
435 u32 Signal; /* dB */
436 u32 Noise; /* dB */
437
438};
439
440struct SMSHOSTLIB_ISDBT_LAYER_STAT_ST {
441 /* Per-layer information */
442 u32 CodeRate; /* Code Rate from SMSHOSTLIB_CODE_RATE_ET,
443 * 255 means layer does not exist */
444 u32 Constellation; /* Constellation from SMSHOSTLIB_CONSTELLATION_ET,
445 * 255 means layer does not exist */
446 u32 BER; /* Post Viterbi BER [1E-5], 0xFFFFFFFF indicate N/A */
447 u32 BERErrorCount; /* Post Viterbi Error Bits Count */
448 u32 BERBitCount; /* Post Viterbi Total Bits Count */
449 u32 PreBER; /* Pre Viterbi BER [1E-5], 0xFFFFFFFF indicate N/A */
450 u32 TS_PER; /* Transport stream PER [%], 0xFFFFFFFF indicate N/A */
451 u32 ErrorTSPackets; /* Number of erroneous transport-stream packets */
452 u32 TotalTSPackets; /* Total number of transport-stream packets */
453 u32 TILdepthI; /* Time interleaver depth I parameter,
454 * 255 means layer does not exist */
455 u32 NumberOfSegments; /* Number of segments in layer A,
456 * 255 means layer does not exist */
457 u32 TMCCErrors; /* TMCC errors */
458};
459
460struct SMSHOSTLIB_STATISTICS_ISDBT_ST {
461 u32 StatisticsType; /* Enumerator identifying the type of the
462 * structure. Values are the same as
463 * SMSHOSTLIB_DEVICE_MODES_E
464 *
465 * This field MUST always be first in any
466 * statistics structure */
467
468 u32 FullSize; /* Total size of the structure returned by the modem.
469 * If the size requested by the host is smaller than
470 * FullSize, the struct will be truncated */
471
472 /* Common parameters */
473 u32 IsRfLocked; /* 0 - not locked, 1 - locked */
474 u32 IsDemodLocked; /* 0 - not locked, 1 - locked */
475 u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */
476
477 /* Reception quality */
478 s32 SNR; /* dB */
479 s32 RSSI; /* dBm */
480 s32 InBandPwr; /* In band power in dBM */
481 s32 CarrierOffset; /* Carrier Offset in Hz */
482
483 /* Transmission parameters */
484 u32 Frequency; /* Frequency in Hz */
485 u32 Bandwidth; /* Bandwidth in MHz */
486 u32 TransmissionMode; /* ISDB-T transmission mode */
487 u32 ModemState; /* 0 - Acquisition, 1 - Locked */
488 u32 GuardInterval; /* Guard Interval, 1 divided by value */
489 u32 SystemType; /* ISDB-T system type (ISDB-T / ISDB-Tsb) */
490 u32 PartialReception; /* TRUE - partial reception, FALSE otherwise */
491 u32 NumOfLayers; /* Number of ISDB-T layers in the network */
492
493 /* Per-layer information */
494 /* Layers A, B and C */
495 struct SMSHOSTLIB_ISDBT_LAYER_STAT_ST LayerInfo[3];
496 /* Per-layer statistics, see SMSHOSTLIB_ISDBT_LAYER_STAT_ST */
497
498 /* Interface information */
499 u32 SmsToHostTxErrors; /* Total number of transmission errors. */
500};
501
427struct PID_STATISTICS_DATA_S { 502struct PID_STATISTICS_DATA_S {
428 struct PID_BURST_S { 503 struct PID_BURST_S {
429 u32 size; 504 u32 size;
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c
index 266033ae2784..b80d09b035a1 100644
--- a/drivers/media/dvb/siano/smsdvb.c
+++ b/drivers/media/dvb/siano/smsdvb.c
@@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
20****************************************************************/ 20****************************************************************/
21 21
22#include <linux/module.h> 22#include <linux/module.h>
23#include <linux/slab.h>
23#include <linux/init.h> 24#include <linux/init.h>
24 25
25#include "dmxdev.h" 26#include "dmxdev.h"
@@ -116,6 +117,118 @@ static void sms_board_dvb3_event(struct smsdvb_client_t *client,
116 } 117 }
117} 118}
118 119
120
121static void smsdvb_update_dvb_stats(struct RECEPTION_STATISTICS_S *pReceptionData,
122 struct SMSHOSTLIB_STATISTICS_ST *p)
123{
124 if (sms_dbg & 2) {
125 printk(KERN_DEBUG "Reserved = %d", p->Reserved);
126 printk(KERN_DEBUG "IsRfLocked = %d", p->IsRfLocked);
127 printk(KERN_DEBUG "IsDemodLocked = %d", p->IsDemodLocked);
128 printk(KERN_DEBUG "IsExternalLNAOn = %d", p->IsExternalLNAOn);
129 printk(KERN_DEBUG "SNR = %d", p->SNR);
130 printk(KERN_DEBUG "BER = %d", p->BER);
131 printk(KERN_DEBUG "FIB_CRC = %d", p->FIB_CRC);
132 printk(KERN_DEBUG "TS_PER = %d", p->TS_PER);
133 printk(KERN_DEBUG "MFER = %d", p->MFER);
134 printk(KERN_DEBUG "RSSI = %d", p->RSSI);
135 printk(KERN_DEBUG "InBandPwr = %d", p->InBandPwr);
136 printk(KERN_DEBUG "CarrierOffset = %d", p->CarrierOffset);
137 printk(KERN_DEBUG "Frequency = %d", p->Frequency);
138 printk(KERN_DEBUG "Bandwidth = %d", p->Bandwidth);
139 printk(KERN_DEBUG "TransmissionMode = %d", p->TransmissionMode);
140 printk(KERN_DEBUG "ModemState = %d", p->ModemState);
141 printk(KERN_DEBUG "GuardInterval = %d", p->GuardInterval);
142 printk(KERN_DEBUG "CodeRate = %d", p->CodeRate);
143 printk(KERN_DEBUG "LPCodeRate = %d", p->LPCodeRate);
144 printk(KERN_DEBUG "Hierarchy = %d", p->Hierarchy);
145 printk(KERN_DEBUG "Constellation = %d", p->Constellation);
146 printk(KERN_DEBUG "BurstSize = %d", p->BurstSize);
147 printk(KERN_DEBUG "BurstDuration = %d", p->BurstDuration);
148 printk(KERN_DEBUG "BurstCycleTime = %d", p->BurstCycleTime);
149 printk(KERN_DEBUG "CalculatedBurstCycleTime = %d", p->CalculatedBurstCycleTime);
150 printk(KERN_DEBUG "NumOfRows = %d", p->NumOfRows);
151 printk(KERN_DEBUG "NumOfPaddCols = %d", p->NumOfPaddCols);
152 printk(KERN_DEBUG "NumOfPunctCols = %d", p->NumOfPunctCols);
153 printk(KERN_DEBUG "ErrorTSPackets = %d", p->ErrorTSPackets);
154 printk(KERN_DEBUG "TotalTSPackets = %d", p->TotalTSPackets);
155 printk(KERN_DEBUG "NumOfValidMpeTlbs = %d", p->NumOfValidMpeTlbs);
156 printk(KERN_DEBUG "NumOfInvalidMpeTlbs = %d", p->NumOfInvalidMpeTlbs);
157 printk(KERN_DEBUG "NumOfCorrectedMpeTlbs = %d", p->NumOfCorrectedMpeTlbs);
158 printk(KERN_DEBUG "BERErrorCount = %d", p->BERErrorCount);
159 printk(KERN_DEBUG "BERBitCount = %d", p->BERBitCount);
160 printk(KERN_DEBUG "SmsToHostTxErrors = %d", p->SmsToHostTxErrors);
161 printk(KERN_DEBUG "PreBER = %d", p->PreBER);
162 printk(KERN_DEBUG "CellId = %d", p->CellId);
163 printk(KERN_DEBUG "DvbhSrvIndHP = %d", p->DvbhSrvIndHP);
164 printk(KERN_DEBUG "DvbhSrvIndLP = %d", p->DvbhSrvIndLP);
165 printk(KERN_DEBUG "NumMPEReceived = %d", p->NumMPEReceived);
166 }
167
168 pReceptionData->IsDemodLocked = p->IsDemodLocked;
169
170 pReceptionData->SNR = p->SNR;
171 pReceptionData->BER = p->BER;
172 pReceptionData->BERErrorCount = p->BERErrorCount;
173 pReceptionData->InBandPwr = p->InBandPwr;
174 pReceptionData->ErrorTSPackets = p->ErrorTSPackets;
175};
176
177
178static void smsdvb_update_isdbt_stats(struct RECEPTION_STATISTICS_S *pReceptionData,
179 struct SMSHOSTLIB_STATISTICS_ISDBT_ST *p)
180{
181 int i;
182
183 if (sms_dbg & 2) {
184 printk(KERN_DEBUG "IsRfLocked = %d", p->IsRfLocked);
185 printk(KERN_DEBUG "IsDemodLocked = %d", p->IsDemodLocked);
186 printk(KERN_DEBUG "IsExternalLNAOn = %d", p->IsExternalLNAOn);
187 printk(KERN_DEBUG "SNR = %d", p->SNR);
188 printk(KERN_DEBUG "RSSI = %d", p->RSSI);
189 printk(KERN_DEBUG "InBandPwr = %d", p->InBandPwr);
190 printk(KERN_DEBUG "CarrierOffset = %d", p->CarrierOffset);
191 printk(KERN_DEBUG "Frequency = %d", p->Frequency);
192 printk(KERN_DEBUG "Bandwidth = %d", p->Bandwidth);
193 printk(KERN_DEBUG "TransmissionMode = %d", p->TransmissionMode);
194 printk(KERN_DEBUG "ModemState = %d", p->ModemState);
195 printk(KERN_DEBUG "GuardInterval = %d", p->GuardInterval);
196 printk(KERN_DEBUG "SystemType = %d", p->SystemType);
197 printk(KERN_DEBUG "PartialReception = %d", p->PartialReception);
198 printk(KERN_DEBUG "NumOfLayers = %d", p->NumOfLayers);
199 printk(KERN_DEBUG "SmsToHostTxErrors = %d", p->SmsToHostTxErrors);
200
201 for (i = 0; i < 3; i++) {
202 printk(KERN_DEBUG "%d: CodeRate = %d", i, p->LayerInfo[i].CodeRate);
203 printk(KERN_DEBUG "%d: Constellation = %d", i, p->LayerInfo[i].Constellation);
204 printk(KERN_DEBUG "%d: BER = %d", i, p->LayerInfo[i].BER);
205 printk(KERN_DEBUG "%d: BERErrorCount = %d", i, p->LayerInfo[i].BERErrorCount);
206 printk(KERN_DEBUG "%d: BERBitCount = %d", i, p->LayerInfo[i].BERBitCount);
207 printk(KERN_DEBUG "%d: PreBER = %d", i, p->LayerInfo[i].PreBER);
208 printk(KERN_DEBUG "%d: TS_PER = %d", i, p->LayerInfo[i].TS_PER);
209 printk(KERN_DEBUG "%d: ErrorTSPackets = %d", i, p->LayerInfo[i].ErrorTSPackets);
210 printk(KERN_DEBUG "%d: TotalTSPackets = %d", i, p->LayerInfo[i].TotalTSPackets);
211 printk(KERN_DEBUG "%d: TILdepthI = %d", i, p->LayerInfo[i].TILdepthI);
212 printk(KERN_DEBUG "%d: NumberOfSegments = %d", i, p->LayerInfo[i].NumberOfSegments);
213 printk(KERN_DEBUG "%d: TMCCErrors = %d", i, p->LayerInfo[i].TMCCErrors);
214 }
215 }
216
217 pReceptionData->IsDemodLocked = p->IsDemodLocked;
218
219 pReceptionData->SNR = p->SNR;
220 pReceptionData->InBandPwr = p->InBandPwr;
221
222 pReceptionData->ErrorTSPackets = 0;
223 pReceptionData->BER = 0;
224 pReceptionData->BERErrorCount = 0;
225 for (i = 0; i < 3; i++) {
226 pReceptionData->BER += p->LayerInfo[i].BER;
227 pReceptionData->BERErrorCount += p->LayerInfo[i].BERErrorCount;
228 pReceptionData->ErrorTSPackets += p->LayerInfo[i].ErrorTSPackets;
229 }
230}
231
119static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb) 232static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
120{ 233{
121 struct smsdvb_client_t *client = (struct smsdvb_client_t *) context; 234 struct smsdvb_client_t *client = (struct smsdvb_client_t *) context;
@@ -134,6 +247,7 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
134 break; 247 break;
135 248
136 case MSG_SMS_RF_TUNE_RES: 249 case MSG_SMS_RF_TUNE_RES:
250 case MSG_SMS_ISDBT_TUNE_RES:
137 complete(&client->tune_done); 251 complete(&client->tune_done);
138 break; 252 break;
139 253
@@ -217,6 +331,40 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
217 is_status_update = true; 331 is_status_update = true;
218 break; 332 break;
219 } 333 }
334 case MSG_SMS_GET_STATISTICS_RES: {
335 union {
336 struct SMSHOSTLIB_STATISTICS_ISDBT_ST isdbt;
337 struct SmsMsgStatisticsInfo_ST dvb;
338 } *p = (void *) (phdr + 1);
339 struct RECEPTION_STATISTICS_S *pReceptionData =
340 &client->sms_stat_dvb.ReceptionData;
341
342 sms_info("MSG_SMS_GET_STATISTICS_RES");
343
344 is_status_update = true;
345
346 switch (smscore_get_device_mode(client->coredev)) {
347 case DEVICE_MODE_ISDBT:
348 case DEVICE_MODE_ISDBT_BDA:
349 smsdvb_update_isdbt_stats(pReceptionData, &p->isdbt);
350 break;
351 default:
352 smsdvb_update_dvb_stats(pReceptionData, &p->dvb.Stat);
353 }
354 if (!pReceptionData->IsDemodLocked) {
355 pReceptionData->SNR = 0;
356 pReceptionData->BER = 0;
357 pReceptionData->BERErrorCount = 0;
358 pReceptionData->InBandPwr = 0;
359 pReceptionData->ErrorTSPackets = 0;
360 }
361
362 complete(&client->tune_done);
363 break;
364 }
365 default:
366 sms_info("Unhandled message %d", phdr->msgType);
367
220 } 368 }
221 smscore_putbuffer(client->coredev, cb); 369 smscore_putbuffer(client->coredev, cb);
222 370
@@ -233,10 +381,10 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
233 DVB3_EVENT_UNC_ERR); 381 DVB3_EVENT_UNC_ERR);
234 382
235 } else { 383 } else {
236 /*client->fe_status = 384 if (client->sms_stat_dvb.ReceptionData.IsRfLocked)
237 (phdr->msgType == MSG_SMS_NO_SIGNAL_IND) ? 385 client->fe_status = FE_HAS_SIGNAL | FE_HAS_CARRIER;
238 0 : FE_HAS_SIGNAL;*/ 386 else
239 client->fe_status = 0; 387 client->fe_status = 0;
240 sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK); 388 sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK);
241 } 389 }
242 } 390 }
@@ -325,6 +473,20 @@ static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client,
325 0 : -ETIME; 473 0 : -ETIME;
326} 474}
327 475
476static int smsdvb_send_statistics_request(struct smsdvb_client_t *client)
477{
478 int rc;
479 struct SmsMsgHdr_ST Msg = { MSG_SMS_GET_STATISTICS_REQ,
480 DVBT_BDA_CONTROL_MSG_ID,
481 HIF_TASK,
482 sizeof(struct SmsMsgHdr_ST), 0 };
483
484 rc = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
485 &client->tune_done);
486
487 return rc;
488}
489
328static inline int led_feedback(struct smsdvb_client_t *client) 490static inline int led_feedback(struct smsdvb_client_t *client)
329{ 491{
330 if (client->fe_status & FE_HAS_LOCK) 492 if (client->fe_status & FE_HAS_LOCK)
@@ -337,33 +499,43 @@ static inline int led_feedback(struct smsdvb_client_t *client)
337 499
338static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) 500static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat)
339{ 501{
502 int rc;
340 struct smsdvb_client_t *client; 503 struct smsdvb_client_t *client;
341 client = container_of(fe, struct smsdvb_client_t, frontend); 504 client = container_of(fe, struct smsdvb_client_t, frontend);
342 505
506 rc = smsdvb_send_statistics_request(client);
507
343 *stat = client->fe_status; 508 *stat = client->fe_status;
344 509
345 led_feedback(client); 510 led_feedback(client);
346 511
347 return 0; 512 return rc;
348} 513}
349 514
350static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber) 515static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber)
351{ 516{
517 int rc;
352 struct smsdvb_client_t *client; 518 struct smsdvb_client_t *client;
353 client = container_of(fe, struct smsdvb_client_t, frontend); 519 client = container_of(fe, struct smsdvb_client_t, frontend);
354 520
521 rc = smsdvb_send_statistics_request(client);
522
355 *ber = client->sms_stat_dvb.ReceptionData.BER; 523 *ber = client->sms_stat_dvb.ReceptionData.BER;
356 524
357 led_feedback(client); 525 led_feedback(client);
358 526
359 return 0; 527 return rc;
360} 528}
361 529
362static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 530static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
363{ 531{
532 int rc;
533
364 struct smsdvb_client_t *client; 534 struct smsdvb_client_t *client;
365 client = container_of(fe, struct smsdvb_client_t, frontend); 535 client = container_of(fe, struct smsdvb_client_t, frontend);
366 536
537 rc = smsdvb_send_statistics_request(client);
538
367 if (client->sms_stat_dvb.ReceptionData.InBandPwr < -95) 539 if (client->sms_stat_dvb.ReceptionData.InBandPwr < -95)
368 *strength = 0; 540 *strength = 0;
369 else if (client->sms_stat_dvb.ReceptionData.InBandPwr > -29) 541 else if (client->sms_stat_dvb.ReceptionData.InBandPwr > -29)
@@ -375,31 +547,37 @@ static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
375 547
376 led_feedback(client); 548 led_feedback(client);
377 549
378 return 0; 550 return rc;
379} 551}
380 552
381static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr) 553static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr)
382{ 554{
555 int rc;
383 struct smsdvb_client_t *client; 556 struct smsdvb_client_t *client;
384 client = container_of(fe, struct smsdvb_client_t, frontend); 557 client = container_of(fe, struct smsdvb_client_t, frontend);
385 558
559 rc = smsdvb_send_statistics_request(client);
560
386 *snr = client->sms_stat_dvb.ReceptionData.SNR; 561 *snr = client->sms_stat_dvb.ReceptionData.SNR;
387 562
388 led_feedback(client); 563 led_feedback(client);
389 564
390 return 0; 565 return rc;
391} 566}
392 567
393static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 568static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
394{ 569{
570 int rc;
395 struct smsdvb_client_t *client; 571 struct smsdvb_client_t *client;
396 client = container_of(fe, struct smsdvb_client_t, frontend); 572 client = container_of(fe, struct smsdvb_client_t, frontend);
397 573
574 rc = smsdvb_send_statistics_request(client);
575
398 *ucblocks = client->sms_stat_dvb.ReceptionData.ErrorTSPackets; 576 *ucblocks = client->sms_stat_dvb.ReceptionData.ErrorTSPackets;
399 577
400 led_feedback(client); 578 led_feedback(client);
401 579
402 return 0; 580 return rc;
403} 581}
404 582
405static int smsdvb_get_tune_settings(struct dvb_frontend *fe, 583static int smsdvb_get_tune_settings(struct dvb_frontend *fe,
@@ -413,9 +591,10 @@ static int smsdvb_get_tune_settings(struct dvb_frontend *fe,
413 return 0; 591 return 0;
414} 592}
415 593
416static int smsdvb_set_frontend(struct dvb_frontend *fe, 594static int smsdvb_dvbt_set_frontend(struct dvb_frontend *fe,
417 struct dvb_frontend_parameters *fep) 595 struct dvb_frontend_parameters *p)
418{ 596{
597 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
419 struct smsdvb_client_t *client = 598 struct smsdvb_client_t *client =
420 container_of(fe, struct smsdvb_client_t, frontend); 599 container_of(fe, struct smsdvb_client_t, frontend);
421 600
@@ -429,24 +608,33 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe,
429 client->fe_status = FE_HAS_SIGNAL; 608 client->fe_status = FE_HAS_SIGNAL;
430 client->event_fe_state = -1; 609 client->event_fe_state = -1;
431 client->event_unc_state = -1; 610 client->event_unc_state = -1;
611 fe->dtv_property_cache.delivery_system = SYS_DVBT;
432 612
433 Msg.Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; 613 Msg.Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
434 Msg.Msg.msgDstId = HIF_TASK; 614 Msg.Msg.msgDstId = HIF_TASK;
435 Msg.Msg.msgFlags = 0; 615 Msg.Msg.msgFlags = 0;
436 Msg.Msg.msgType = MSG_SMS_RF_TUNE_REQ; 616 Msg.Msg.msgType = MSG_SMS_RF_TUNE_REQ;
437 Msg.Msg.msgLength = sizeof(Msg); 617 Msg.Msg.msgLength = sizeof(Msg);
438 Msg.Data[0] = fep->frequency; 618 Msg.Data[0] = c->frequency;
439 Msg.Data[2] = 12000000; 619 Msg.Data[2] = 12000000;
440 620
441 sms_debug("freq %d band %d", 621 sms_info("%s: freq %d band %d", __func__, c->frequency,
442 fep->frequency, fep->u.ofdm.bandwidth); 622 c->bandwidth_hz);
443 623
444 switch (fep->u.ofdm.bandwidth) { 624 switch (c->bandwidth_hz / 1000000) {
445 case BANDWIDTH_8_MHZ: Msg.Data[1] = BW_8_MHZ; break; 625 case 8:
446 case BANDWIDTH_7_MHZ: Msg.Data[1] = BW_7_MHZ; break; 626 Msg.Data[1] = BW_8_MHZ;
447 case BANDWIDTH_6_MHZ: Msg.Data[1] = BW_6_MHZ; break; 627 break;
448 case BANDWIDTH_AUTO: return -EOPNOTSUPP; 628 case 7:
449 default: return -EINVAL; 629 Msg.Data[1] = BW_7_MHZ;
630 break;
631 case 6:
632 Msg.Data[1] = BW_6_MHZ;
633 break;
634 case 0:
635 return -EOPNOTSUPP;
636 default:
637 return -EINVAL;
450 } 638 }
451 /* Disable LNA, if any. An error is returned if no LNA is present */ 639 /* Disable LNA, if any. An error is returned if no LNA is present */
452 ret = sms_board_lna_control(client->coredev, 0); 640 ret = sms_board_lna_control(client->coredev, 0);
@@ -470,6 +658,90 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe,
470 &client->tune_done); 658 &client->tune_done);
471} 659}
472 660
661static int smsdvb_isdbt_set_frontend(struct dvb_frontend *fe,
662 struct dvb_frontend_parameters *p)
663{
664 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
665 struct smsdvb_client_t *client =
666 container_of(fe, struct smsdvb_client_t, frontend);
667
668 struct {
669 struct SmsMsgHdr_ST Msg;
670 u32 Data[4];
671 } Msg;
672
673 fe->dtv_property_cache.delivery_system = SYS_ISDBT;
674
675 Msg.Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
676 Msg.Msg.msgDstId = HIF_TASK;
677 Msg.Msg.msgFlags = 0;
678 Msg.Msg.msgType = MSG_SMS_ISDBT_TUNE_REQ;
679 Msg.Msg.msgLength = sizeof(Msg);
680
681 if (c->isdbt_sb_segment_idx == -1)
682 c->isdbt_sb_segment_idx = 0;
683
684 switch (c->isdbt_sb_segment_count) {
685 case 3:
686 Msg.Data[1] = BW_ISDBT_3SEG;
687 break;
688 case 1:
689 Msg.Data[1] = BW_ISDBT_1SEG;
690 break;
691 case 0: /* AUTO */
692 switch (c->bandwidth_hz / 1000000) {
693 case 8:
694 case 7:
695 c->isdbt_sb_segment_count = 3;
696 Msg.Data[1] = BW_ISDBT_3SEG;
697 break;
698 case 6:
699 c->isdbt_sb_segment_count = 1;
700 Msg.Data[1] = BW_ISDBT_1SEG;
701 break;
702 default: /* Assumes 6 MHZ bw */
703 c->isdbt_sb_segment_count = 1;
704 c->bandwidth_hz = 6000;
705 Msg.Data[1] = BW_ISDBT_1SEG;
706 break;
707 }
708 break;
709 default:
710 sms_info("Segment count %d not supported", c->isdbt_sb_segment_count);
711 return -EINVAL;
712 }
713
714 Msg.Data[0] = c->frequency;
715 Msg.Data[2] = 12000000;
716 Msg.Data[3] = c->isdbt_sb_segment_idx;
717
718 sms_info("%s: freq %d segwidth %d segindex %d\n", __func__,
719 c->frequency, c->isdbt_sb_segment_count,
720 c->isdbt_sb_segment_idx);
721
722 return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
723 &client->tune_done);
724}
725
726static int smsdvb_set_frontend(struct dvb_frontend *fe,
727 struct dvb_frontend_parameters *fep)
728{
729 struct smsdvb_client_t *client =
730 container_of(fe, struct smsdvb_client_t, frontend);
731 struct smscore_device_t *coredev = client->coredev;
732
733 switch (smscore_get_device_mode(coredev)) {
734 case DEVICE_MODE_DVBT:
735 case DEVICE_MODE_DVBT_BDA:
736 return smsdvb_dvbt_set_frontend(fe, fep);
737 case DEVICE_MODE_ISDBT:
738 case DEVICE_MODE_ISDBT_BDA:
739 return smsdvb_isdbt_set_frontend(fe, fep);
740 default:
741 return -EINVAL;
742 }
743}
744
473static int smsdvb_get_frontend(struct dvb_frontend *fe, 745static int smsdvb_get_frontend(struct dvb_frontend *fe,
474 struct dvb_frontend_parameters *fep) 746 struct dvb_frontend_parameters *fep)
475{ 747{
@@ -557,13 +829,6 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
557 /* device removal handled by onremove callback */ 829 /* device removal handled by onremove callback */
558 if (!arrival) 830 if (!arrival)
559 return 0; 831 return 0;
560
561 if (smscore_get_device_mode(coredev) != DEVICE_MODE_DVBT_BDA) {
562 sms_err("SMS Device mode is not set for "
563 "DVB operation.");
564 return 0;
565 }
566
567 client = kzalloc(sizeof(struct smsdvb_client_t), GFP_KERNEL); 832 client = kzalloc(sizeof(struct smsdvb_client_t), GFP_KERNEL);
568 if (!client) { 833 if (!client) {
569 sms_err("kmalloc() failed"); 834 sms_err("kmalloc() failed");
@@ -662,7 +927,7 @@ adapter_error:
662 return rc; 927 return rc;
663} 928}
664 929
665int smsdvb_module_init(void) 930static int __init smsdvb_module_init(void)
666{ 931{
667 int rc; 932 int rc;
668 933
@@ -676,7 +941,7 @@ int smsdvb_module_init(void)
676 return rc; 941 return rc;
677} 942}
678 943
679void smsdvb_module_exit(void) 944static void __exit smsdvb_module_exit(void)
680{ 945{
681 smscore_unregister_hotplug(smsdvb_hotplug); 946 smscore_unregister_hotplug(smsdvb_hotplug);
682 947
diff --git a/drivers/media/dvb/siano/smsir.c b/drivers/media/dvb/siano/smsir.c
index e3d776feeaca..a56eac76e0f0 100644
--- a/drivers/media/dvb/siano/smsir.c
+++ b/drivers/media/dvb/siano/smsir.c
@@ -85,9 +85,9 @@ static struct keyboard_layout_map_t keyboard_layout_maps[] = {
85 { } /* Terminating entry */ 85 { } /* Terminating entry */
86}; 86};
87 87
88u32 ir_pos; 88static u32 ir_pos;
89u32 ir_word; 89static u32 ir_word;
90u32 ir_toggle; 90static u32 ir_toggle;
91 91
92#define RC5_PUSH_BIT(dst, bit, pos) \ 92#define RC5_PUSH_BIT(dst, bit, pos) \
93 { dst <<= 1; dst |= bit; pos++; } 93 { dst <<= 1; dst |= bit; pos++; }
diff --git a/drivers/media/dvb/siano/smssdio.c b/drivers/media/dvb/siano/smssdio.c
index d1d652e7f890..e57d38b0197c 100644
--- a/drivers/media/dvb/siano/smssdio.c
+++ b/drivers/media/dvb/siano/smssdio.c
@@ -33,6 +33,7 @@
33 */ 33 */
34 34
35#include <linux/moduleparam.h> 35#include <linux/moduleparam.h>
36#include <linux/slab.h>
36#include <linux/firmware.h> 37#include <linux/firmware.h>
37#include <linux/delay.h> 38#include <linux/delay.h>
38#include <linux/mmc/card.h> 39#include <linux/mmc/card.h>
@@ -48,7 +49,7 @@
48#define SMSSDIO_INT 0x04 49#define SMSSDIO_INT 0x04
49#define SMSSDIO_BLOCK_SIZE 128 50#define SMSSDIO_BLOCK_SIZE 128
50 51
51static const struct sdio_device_id smssdio_ids[] = { 52static const struct sdio_device_id smssdio_ids[] __devinitconst = {
52 {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_STELLAR), 53 {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_STELLAR),
53 .driver_data = SMS1XXX_BOARD_SIANO_STELLAR}, 54 .driver_data = SMS1XXX_BOARD_SIANO_STELLAR},
54 {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_NOVA_A0), 55 {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_NOVA_A0),
@@ -78,7 +79,7 @@ struct smssdio_device {
78 79
79static int smssdio_sendrequest(void *context, void *buffer, size_t size) 80static int smssdio_sendrequest(void *context, void *buffer, size_t size)
80{ 81{
81 int ret; 82 int ret = 0;
82 struct smssdio_device *smsdev; 83 struct smssdio_device *smsdev;
83 84
84 smsdev = context; 85 smsdev = context;
@@ -222,7 +223,7 @@ static void smssdio_interrupt(struct sdio_func *func)
222 smscore_onresponse(smsdev->coredev, cb); 223 smscore_onresponse(smsdev->coredev, cb);
223} 224}
224 225
225static int smssdio_probe(struct sdio_func *func, 226static int __devinit smssdio_probe(struct sdio_func *func,
226 const struct sdio_device_id *id) 227 const struct sdio_device_id *id)
227{ 228{
228 int ret; 229 int ret;
@@ -338,7 +339,7 @@ static struct sdio_driver smssdio_driver = {
338/* Module functions */ 339/* Module functions */
339/*******************************************************************/ 340/*******************************************************************/
340 341
341int smssdio_module_init(void) 342static int __init smssdio_module_init(void)
342{ 343{
343 int ret = 0; 344 int ret = 0;
344 345
@@ -350,7 +351,7 @@ int smssdio_module_init(void)
350 return ret; 351 return ret;
351} 352}
352 353
353void smssdio_module_exit(void) 354static void __exit smssdio_module_exit(void)
354{ 355{
355 sdio_unregister_driver(&smssdio_driver); 356 sdio_unregister_driver(&smssdio_driver);
356} 357}
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c
index 8f88a586b0dd..a9c27fb69ba7 100644
--- a/drivers/media/dvb/siano/smsusb.c
+++ b/drivers/media/dvb/siano/smsusb.c
@@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/usb.h> 24#include <linux/usb.h>
25#include <linux/firmware.h> 25#include <linux/firmware.h>
26#include <linux/slab.h>
26 27
27#include "smscoreapi.h" 28#include "smscoreapi.h"
28#include "sms-cards.h" 29#include "sms-cards.h"
@@ -390,7 +391,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
390 return rc; 391 return rc;
391} 392}
392 393
393static int smsusb_probe(struct usb_interface *intf, 394static int __devinit smsusb_probe(struct usb_interface *intf,
394 const struct usb_device_id *id) 395 const struct usb_device_id *id)
395{ 396{
396 struct usb_device *udev = interface_to_usbdev(intf); 397 struct usb_device *udev = interface_to_usbdev(intf);
@@ -484,7 +485,7 @@ static int smsusb_resume(struct usb_interface *intf)
484 return 0; 485 return 0;
485} 486}
486 487
487struct usb_device_id smsusb_id_table[] = { 488static const struct usb_device_id smsusb_id_table[] __devinitconst = {
488 { USB_DEVICE(0x187f, 0x0010), 489 { USB_DEVICE(0x187f, 0x0010),
489 .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, 490 .driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
490 { USB_DEVICE(0x187f, 0x0100), 491 { USB_DEVICE(0x187f, 0x0100),
@@ -533,8 +534,18 @@ struct usb_device_id smsusb_id_table[] = {
533 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, 534 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
534 { USB_DEVICE(0x2040, 0xb910), 535 { USB_DEVICE(0x2040, 0xb910),
535 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, 536 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
537 { USB_DEVICE(0x2040, 0xb980),
538 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
539 { USB_DEVICE(0x2040, 0xb990),
540 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
536 { USB_DEVICE(0x2040, 0xc000), 541 { USB_DEVICE(0x2040, 0xc000),
537 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, 542 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
543 { USB_DEVICE(0x2040, 0xc010),
544 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
545 { USB_DEVICE(0x2040, 0xc080),
546 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
547 { USB_DEVICE(0x2040, 0xc090),
548 .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
538 { } /* Terminating entry */ 549 { } /* Terminating entry */
539 }; 550 };
540 551
@@ -550,7 +561,7 @@ static struct usb_driver smsusb_driver = {
550 .resume = smsusb_resume, 561 .resume = smsusb_resume,
551}; 562};
552 563
553int smsusb_module_init(void) 564static int __init smsusb_module_init(void)
554{ 565{
555 int rc = usb_register(&smsusb_driver); 566 int rc = usb_register(&smsusb_driver);
556 if (rc) 567 if (rc)
@@ -561,7 +572,7 @@ int smsusb_module_init(void)
561 return rc; 572 return rc;
562} 573}
563 574
564void smsusb_module_exit(void) 575static void __exit smsusb_module_exit(void)
565{ 576{
566 /* Regular USB Cleanup */ 577 /* Regular USB Cleanup */
567 usb_deregister(&smsusb_driver); 578 usb_deregister(&smsusb_driver);
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
index 8d65c652ba50..38915591c6e5 100644
--- a/drivers/media/dvb/ttpci/av7110.c
+++ b/drivers/media/dvb/ttpci/av7110.c
@@ -49,6 +49,7 @@
49#include <linux/crc32.h> 49#include <linux/crc32.h>
50#include <linux/i2c.h> 50#include <linux/i2c.h>
51#include <linux/kthread.h> 51#include <linux/kthread.h>
52#include <linux/slab.h>
52#include <asm/unaligned.h> 53#include <asm/unaligned.h>
53#include <asm/byteorder.h> 54#include <asm/byteorder.h>
54 55
@@ -2425,7 +2426,7 @@ static int __devinit av7110_attach(struct saa7146_dev* dev,
2425 * use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called 2426 * use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called
2426 */ 2427 */
2427 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 ); 2428 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2428 /* set event counter 1 treshold to maximum allowed value (rEC p55) */ 2429 /* set event counter 1 threshold to maximum allowed value (rEC p55) */
2429 saa7146_write(dev, ECT1R, 0x3fff ); 2430 saa7146_write(dev, ECT1R, 0x3fff );
2430#endif 2431#endif
2431 /* Set RPS1 Address register to point to RPS code (r108 p42) */ 2432 /* Set RPS1 Address register to point to RPS code (r108 p42) */
@@ -2559,7 +2560,7 @@ static int __devinit av7110_attach(struct saa7146_dev* dev,
2559 * use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called 2560 * use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called
2560 */ 2561 */
2561 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 ); 2562 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2562 /* set event counter 1 treshold to maximum allowed value (rEC p55) */ 2563 /* set event counter 1 threshold to maximum allowed value (rEC p55) */
2563 saa7146_write(dev, ECT1R, 0x3fff ); 2564 saa7146_write(dev, ECT1R, 0x3fff );
2564#endif 2565#endif
2565 /* Setup BUDGETPATCH MAIN RPS1 "program" (p35) */ 2566 /* Setup BUDGETPATCH MAIN RPS1 "program" (p35) */
diff --git a/drivers/media/dvb/ttpci/av7110_ca.c b/drivers/media/dvb/ttpci/av7110_ca.c
index c7a65b1544a3..ac7779c45c5b 100644
--- a/drivers/media/dvb/ttpci/av7110_ca.c
+++ b/drivers/media/dvb/ttpci/av7110_ca.c
@@ -34,6 +34,7 @@
34#include <linux/fs.h> 34#include <linux/fs.h>
35#include <linux/timer.h> 35#include <linux/timer.h>
36#include <linux/poll.h> 36#include <linux/poll.h>
37#include <linux/gfp.h>
37 38
38#include "av7110.h" 39#include "av7110.h"
39#include "av7110_hw.h" 40#include "av7110_hw.h"
diff --git a/drivers/media/dvb/ttpci/av7110_ir.c b/drivers/media/dvb/ttpci/av7110_ir.c
index 23a1c6380d3f..b070e88d8c6b 100644
--- a/drivers/media/dvb/ttpci/av7110_ir.c
+++ b/drivers/media/dvb/ttpci/av7110_ir.c
@@ -268,8 +268,8 @@ int av7110_check_ir_config(struct av7110 *av7110, int force)
268 268
269 269
270/* /proc/av7110_ir interface */ 270/* /proc/av7110_ir interface */
271static int av7110_ir_write_proc(struct file *file, const char __user *buffer, 271static ssize_t av7110_ir_proc_write(struct file *file, const char __user *buffer,
272 unsigned long count, void *data) 272 size_t count, loff_t *pos)
273{ 273{
274 char *page; 274 char *page;
275 u32 ir_config; 275 u32 ir_config;
@@ -309,6 +309,10 @@ static int av7110_ir_write_proc(struct file *file, const char __user *buffer,
309 return count; 309 return count;
310} 310}
311 311
312static const struct file_operations av7110_ir_proc_fops = {
313 .owner = THIS_MODULE,
314 .write = av7110_ir_proc_write,
315};
312 316
313/* interrupt handler */ 317/* interrupt handler */
314static void ir_handler(struct av7110 *av7110, u32 ircom) 318static void ir_handler(struct av7110 *av7110, u32 ircom)
@@ -368,11 +372,9 @@ int __devinit av7110_ir_init(struct av7110 *av7110)
368 input_dev->timer.data = (unsigned long) &av7110->ir; 372 input_dev->timer.data = (unsigned long) &av7110->ir;
369 373
370 if (av_cnt == 1) { 374 if (av_cnt == 1) {
371 e = create_proc_entry("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL); 375 e = proc_create("av7110_ir", S_IWUSR, NULL, &av7110_ir_proc_fops);
372 if (e) { 376 if (e)
373 e->write_proc = av7110_ir_write_proc;
374 e->size = 4 + 256 * sizeof(u16); 377 e->size = 4 + 256 * sizeof(u16);
375 }
376 } 378 }
377 379
378 tasklet_init(&av7110->ir.ir_tasklet, av7110_emit_key, (unsigned long) &av7110->ir); 380 tasklet_init(&av7110->ir.ir_tasklet, av7110_emit_key, (unsigned long) &av7110->ir);
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c
index 8ea915227674..983672aa2450 100644
--- a/drivers/media/dvb/ttpci/budget-av.c
+++ b/drivers/media/dvb/ttpci/budget-av.c
@@ -1055,7 +1055,7 @@ static const struct stb0899_s1_reg knc1_stb0899_s1_init_3[] = {
1055 { STB0899_TSCFGH , 0x0c }, 1055 { STB0899_TSCFGH , 0x0c },
1056 { STB0899_TSCFGM , 0x00 }, 1056 { STB0899_TSCFGM , 0x00 },
1057 { STB0899_TSCFGL , 0x0c }, 1057 { STB0899_TSCFGL , 0x0c },
1058 { STB0899_TSOUT , 0x0d }, /* 0x0d for CAM */ 1058 { STB0899_TSOUT , 0x4d }, /* 0x0d for CAM */
1059 { STB0899_RSSYNCDEL , 0x00 }, 1059 { STB0899_RSSYNCDEL , 0x00 },
1060 { STB0899_TSINHDELH , 0x02 }, 1060 { STB0899_TSINHDELH , 0x02 },
1061 { STB0899_TSINHDELM , 0x00 }, 1061 { STB0899_TSINHDELM , 0x00 },
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
index b5c681372b6c..49c2a817a06f 100644
--- a/drivers/media/dvb/ttpci/budget-ci.c
+++ b/drivers/media/dvb/ttpci/budget-ci.c
@@ -178,7 +178,7 @@ static void msp430_ir_interrupt(unsigned long data)
178 if (budget_ci->ir.last_raw != raw || !timer_pending(&budget_ci->ir.timer_keyup)) { 178 if (budget_ci->ir.last_raw != raw || !timer_pending(&budget_ci->ir.timer_keyup)) {
179 ir_input_nokey(dev, &budget_ci->ir.state); 179 ir_input_nokey(dev, &budget_ci->ir.state);
180 ir_input_keydown(dev, &budget_ci->ir.state, 180 ir_input_keydown(dev, &budget_ci->ir.state,
181 budget_ci->ir.ir_key, raw); 181 budget_ci->ir.ir_key);
182 budget_ci->ir.last_raw = raw; 182 budget_ci->ir.last_raw = raw;
183 } 183 }
184 184
@@ -190,12 +190,13 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
190 struct saa7146_dev *saa = budget_ci->budget.dev; 190 struct saa7146_dev *saa = budget_ci->budget.dev;
191 struct input_dev *input_dev = budget_ci->ir.dev; 191 struct input_dev *input_dev = budget_ci->ir.dev;
192 int error; 192 int error;
193 struct ir_scancode_table *ir_codes;
194
193 195
194 budget_ci->ir.dev = input_dev = input_allocate_device(); 196 budget_ci->ir.dev = input_dev = input_allocate_device();
195 if (!input_dev) { 197 if (!input_dev) {
196 printk(KERN_ERR "budget_ci: IR interface initialisation failed\n"); 198 printk(KERN_ERR "budget_ci: IR interface initialisation failed\n");
197 error = -ENOMEM; 199 return -ENOMEM;
198 goto out1;
199 } 200 }
200 201
201 snprintf(budget_ci->ir.name, sizeof(budget_ci->ir.name), 202 snprintf(budget_ci->ir.name, sizeof(budget_ci->ir.name),
@@ -217,6 +218,11 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
217 } 218 }
218 input_dev->dev.parent = &saa->pci->dev; 219 input_dev->dev.parent = &saa->pci->dev;
219 220
221 if (rc5_device < 0)
222 budget_ci->ir.rc5_device = IR_DEVICE_ANY;
223 else
224 budget_ci->ir.rc5_device = rc5_device;
225
220 /* Select keymap and address */ 226 /* Select keymap and address */
221 switch (budget_ci->budget.dev->pci->subsystem_device) { 227 switch (budget_ci->budget.dev->pci->subsystem_device) {
222 case 0x100c: 228 case 0x100c:
@@ -224,47 +230,34 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
224 case 0x1011: 230 case 0x1011:
225 case 0x1012: 231 case 0x1012:
226 /* The hauppauge keymap is a superset of these remotes */ 232 /* The hauppauge keymap is a superset of these remotes */
227 ir_input_init(input_dev, &budget_ci->ir.state, 233 ir_codes = &ir_codes_hauppauge_new_table;
228 IR_TYPE_RC5, &ir_codes_hauppauge_new_table);
229 234
230 if (rc5_device < 0) 235 if (rc5_device < 0)
231 budget_ci->ir.rc5_device = 0x1f; 236 budget_ci->ir.rc5_device = 0x1f;
232 else
233 budget_ci->ir.rc5_device = rc5_device;
234 break; 237 break;
235 case 0x1010: 238 case 0x1010:
236 case 0x1017: 239 case 0x1017:
237 case 0x101a: 240 case 0x101a:
238 /* for the Technotrend 1500 bundled remote */ 241 /* for the Technotrend 1500 bundled remote */
239 ir_input_init(input_dev, &budget_ci->ir.state, 242 ir_codes = &ir_codes_tt_1500_table;
240 IR_TYPE_RC5, &ir_codes_tt_1500_table);
241
242 if (rc5_device < 0)
243 budget_ci->ir.rc5_device = IR_DEVICE_ANY;
244 else
245 budget_ci->ir.rc5_device = rc5_device;
246 break; 243 break;
247 default: 244 default:
248 /* unknown remote */ 245 /* unknown remote */
249 ir_input_init(input_dev, &budget_ci->ir.state, 246 ir_codes = &ir_codes_budget_ci_old_table;
250 IR_TYPE_RC5, &ir_codes_budget_ci_old_table);
251
252 if (rc5_device < 0)
253 budget_ci->ir.rc5_device = IR_DEVICE_ANY;
254 else
255 budget_ci->ir.rc5_device = rc5_device;
256 break; 247 break;
257 } 248 }
258 249
250 ir_input_init(input_dev, &budget_ci->ir.state, IR_TYPE_RC5);
251
259 /* initialise the key-up timeout handler */ 252 /* initialise the key-up timeout handler */
260 init_timer(&budget_ci->ir.timer_keyup); 253 init_timer(&budget_ci->ir.timer_keyup);
261 budget_ci->ir.timer_keyup.function = msp430_ir_keyup; 254 budget_ci->ir.timer_keyup.function = msp430_ir_keyup;
262 budget_ci->ir.timer_keyup.data = (unsigned long) &budget_ci->ir; 255 budget_ci->ir.timer_keyup.data = (unsigned long) &budget_ci->ir;
263 budget_ci->ir.last_raw = 0xffff; /* An impossible value */ 256 budget_ci->ir.last_raw = 0xffff; /* An impossible value */
264 error = input_register_device(input_dev); 257 error = ir_input_register(input_dev, ir_codes, NULL);
265 if (error) { 258 if (error) {
266 printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error); 259 printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error);
267 goto out2; 260 return error;
268 } 261 }
269 262
270 /* note: these must be after input_register_device */ 263 /* note: these must be after input_register_device */
@@ -278,11 +271,6 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
278 saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); 271 saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);
279 272
280 return 0; 273 return 0;
281
282out2:
283 input_free_device(input_dev);
284out1:
285 return error;
286} 274}
287 275
288static void msp430_ir_deinit(struct budget_ci *budget_ci) 276static void msp430_ir_deinit(struct budget_ci *budget_ci)
@@ -297,7 +285,7 @@ static void msp430_ir_deinit(struct budget_ci *budget_ci)
297 del_timer_sync(&dev->timer); 285 del_timer_sync(&dev->timer);
298 ir_input_nokey(dev, &budget_ci->ir.state); 286 ir_input_nokey(dev, &budget_ci->ir.state);
299 287
300 input_unregister_device(dev); 288 ir_input_unregister(dev);
301} 289}
302 290
303static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address) 291static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address)
@@ -1248,7 +1236,7 @@ static const struct stb0899_s1_reg tt3200_stb0899_s1_init_3[] = {
1248 { STB0899_TSCFGH , 0x0c }, 1236 { STB0899_TSCFGH , 0x0c },
1249 { STB0899_TSCFGM , 0x00 }, 1237 { STB0899_TSCFGM , 0x00 },
1250 { STB0899_TSCFGL , 0x0c }, 1238 { STB0899_TSCFGL , 0x0c },
1251 { STB0899_TSOUT , 0x0d }, /* 0x0d for CAM */ 1239 { STB0899_TSOUT , 0x4d }, /* 0x0d for CAM */
1252 { STB0899_RSSYNCDEL , 0x00 }, 1240 { STB0899_RSSYNCDEL , 0x00 },
1253 { STB0899_TSINHDELH , 0x02 }, 1241 { STB0899_TSINHDELH , 0x02 },
1254 { STB0899_TSINHDELM , 0x00 }, 1242 { STB0899_TSINHDELM , 0x00 },
diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c
index 60136688a9a4..9c92f9ddd223 100644
--- a/drivers/media/dvb/ttpci/budget-patch.c
+++ b/drivers/media/dvb/ttpci/budget-patch.c
@@ -456,7 +456,7 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
456 // use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled 456 // use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
457 // use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called 457 // use 0x15 to track VPE interrupts - increase by 1 every vpeirq() is called
458 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 ); 458 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
459 // set event counter 1 treshold to maximum allowed value (rEC p55) 459 // set event counter 1 threshold to maximum allowed value (rEC p55)
460 saa7146_write(dev, ECT1R, 0x3fff ); 460 saa7146_write(dev, ECT1R, 0x3fff );
461#endif 461#endif
462 // Fix VSYNC level 462 // Fix VSYNC level
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c
index e48380c48990..1500210c06cf 100644
--- a/drivers/media/dvb/ttpci/budget.c
+++ b/drivers/media/dvb/ttpci/budget.c
@@ -433,9 +433,8 @@ static struct stv090x_config tt1600_stv090x_config = {
433 .demod_mode = STV090x_SINGLE, 433 .demod_mode = STV090x_SINGLE,
434 .clk_mode = STV090x_CLK_EXT, 434 .clk_mode = STV090x_CLK_EXT,
435 435
436 .xtal = 27000000, 436 .xtal = 13500000,
437 .address = 0x68, 437 .address = 0x68,
438 .ref_clk = 27000000,
439 438
440 .ts1_mode = STV090x_TSMODE_DVBCI, 439 .ts1_mode = STV090x_TSMODE_DVBCI,
441 .ts2_mode = STV090x_TSMODE_SERIAL_CONTINUOUS, 440 .ts2_mode = STV090x_TSMODE_SERIAL_CONTINUOUS,
@@ -457,6 +456,7 @@ static struct stv090x_config tt1600_stv090x_config = {
457static struct stv6110x_config tt1600_stv6110x_config = { 456static struct stv6110x_config tt1600_stv6110x_config = {
458 .addr = 0x60, 457 .addr = 0x60,
459 .refclk = 27000000, 458 .refclk = 27000000,
459 .clk_div = 2,
460}; 460};
461 461
462static struct isl6423_config tt1600_isl6423_config = { 462static struct isl6423_config tt1600_isl6423_config = {
@@ -643,9 +643,6 @@ static void frontend_init(struct budget *budget)
643 &budget->i2c_adap, 643 &budget->i2c_adap,
644 &tt1600_isl6423_config); 644 &tt1600_isl6423_config);
645 645
646 } else {
647 dvb_frontend_detach(budget->dvb_frontend);
648 budget->dvb_frontend = NULL;
649 } 646 }
650 } 647 }
651 break; 648 break;
diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
index d91e0638448f..53baccbab17f 100644
--- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c
+++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
@@ -1198,7 +1198,7 @@ static int ttusb_init_rc( struct ttusb_dec *dec)
1198 int err; 1198 int err;
1199 1199
1200 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys)); 1200 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys));
1201 strlcpy(dec->rc_phys, "/input0", sizeof(dec->rc_phys)); 1201 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys));
1202 1202
1203 input_dev = input_allocate_device(); 1203 input_dev = input_allocate_device();
1204 if (!input_dev) 1204 if (!input_dev)