]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - drivers/media/dvb/b2c2/b2c2-common.c
[IA64] Avoid .spillpsp directive in handcoded assembly
[linux-2.6.git] / drivers / media / dvb / b2c2 / b2c2-common.c
1 /*
2  * b2c2-common.c - common methods for the B2C2/Technisat SkyStar2 PCI DVB card and
3  *                 for the B2C2/Technisat Sky/Cable/AirStar USB devices
4  *                 based on the FlexCopII/FlexCopIII by B2C2, Inc.
5  *
6  * Copyright (C) 2003  Vadim Catana, skystar@moldova.cc
7  *
8  * FIX: DISEQC Tone Burst in flexcop_diseqc_ioctl()
9  * FIX: FULL soft DiSEqC for skystar2 (FlexCopII rev 130) VP310 equipped
10  *     Vincenzo Di Massa, hawk.it at tiscalinet.it
11  *
12  * Converted to Linux coding style
13  * Misc reorganization, polishing, restyling
14  *     Roberto Ragusa, r.ragusa at libero.it
15  *
16  * Added hardware filtering support,
17  *     Niklas Peinecke, peinecke at gdv.uni-hannover.de
18  *
19  * This program is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU Lesser General Public License
21  * as published by the Free Software Foundation; either version 2.1
22  * of the License, or (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU Lesser General Public License
30  * along with this program; if not, write to the Free Software
31  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
32  *
33  */
34 #include "stv0299.h"
35 #include "mt352.h"
36 #include "mt312.h"
37
38 static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio)
39 {
40         u8 aclk = 0;
41         u8 bclk = 0;
42
43         if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
44         else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
45         else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
46         else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
47         else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
48         else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; }
49
50         stv0299_writereg (fe, 0x13, aclk);
51         stv0299_writereg (fe, 0x14, bclk);
52         stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
53         stv0299_writereg (fe, 0x20, (ratio >>  8) & 0xff);
54         stv0299_writereg (fe, 0x21, (ratio      ) & 0xf0);
55
56         return 0;
57 }
58
59 static int samsung_tbmu24112_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
60 {
61         u8 buf[4];
62         u32 div;
63         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
64 //      struct adapter* adapter = (struct adapter*) fe->dvb->priv;
65
66         div = params->frequency / 125;
67
68         buf[0] = (div >> 8) & 0x7f;
69         buf[1] = div & 0xff;
70         buf[2] = 0x84;  // 0xC4
71         buf[3] = 0x08;
72
73         if (params->frequency < 1500000) buf[3] |= 0x10;
74
75 //      if (i2c_transfer (&adapter->i2c_adap, &msg, 1) != 1) return -EIO;
76         return 0;
77 }
78
79 static u8 samsung_tbmu24112_inittab[] = {
80              0x01, 0x15,
81              0x02, 0x30,
82              0x03, 0x00,
83              0x04, 0x7D,
84              0x05, 0x35,
85              0x06, 0x02,
86              0x07, 0x00,
87              0x08, 0xC3,
88              0x0C, 0x00,
89              0x0D, 0x81,
90              0x0E, 0x23,
91              0x0F, 0x12,
92              0x10, 0x7E,
93              0x11, 0x84,
94              0x12, 0xB9,
95              0x13, 0x88,
96              0x14, 0x89,
97              0x15, 0xC9,
98              0x16, 0x00,
99              0x17, 0x5C,
100              0x18, 0x00,
101              0x19, 0x00,
102              0x1A, 0x00,
103              0x1C, 0x00,
104              0x1D, 0x00,
105              0x1E, 0x00,
106              0x1F, 0x3A,
107              0x20, 0x2E,
108              0x21, 0x80,
109              0x22, 0xFF,
110              0x23, 0xC1,
111              0x28, 0x00,
112              0x29, 0x1E,
113              0x2A, 0x14,
114              0x2B, 0x0F,
115              0x2C, 0x09,
116              0x2D, 0x05,
117              0x31, 0x1F,
118              0x32, 0x19,
119              0x33, 0xFE,
120              0x34, 0x93,
121              0xff, 0xff,
122 };
123
124 static struct stv0299_config samsung_tbmu24112_config = {
125         .demod_address = 0x68,
126         .inittab = samsung_tbmu24112_inittab,
127         .mclk = 88000000UL,
128         .invert = 0,
129         .enhanced_tuning = 0,
130         .skip_reinit = 0,
131         .lock_output = STV0229_LOCKOUTPUT_LK,
132         .volt13_op0_op1 = STV0299_VOLT13_OP1,
133         .min_delay_ms = 100,
134         .set_symbol_rate = samsung_tbmu24112_set_symbol_rate,
135         .pll_set = samsung_tbmu24112_pll_set,
136 };
137
138
139
140
141
142 static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
143 {
144         static u8 mt352_clock_config [] = { 0x89, 0x10, 0x2d };
145         static u8 mt352_reset [] = { 0x50, 0x80 };
146         static u8 mt352_adc_ctl_1_cfg [] = { 0x8E, 0x40 };
147         static u8 mt352_agc_cfg [] = { 0x67, 0x28, 0xa1 };
148         static u8 mt352_capt_range_cfg[] = { 0x75, 0x32 };
149
150         mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
151         udelay(2000);
152         mt352_write(fe, mt352_reset, sizeof(mt352_reset));
153         mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
154
155         mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
156         mt352_write(fe, mt352_capt_range_cfg, sizeof(mt352_capt_range_cfg));
157
158         return 0;
159 }
160
161 static int samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf)
162 {
163         u32 div;
164         unsigned char bs = 0;
165
166         #define IF_FREQUENCYx6 217    /* 6 * 36.16666666667MHz */
167         div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
168
169         if (params->frequency >= 48000000 && params->frequency <= 154000000) bs = 0x09;
170         if (params->frequency >= 161000000 && params->frequency <= 439000000) bs = 0x0a;
171         if (params->frequency >= 447000000 && params->frequency <= 863000000) bs = 0x08;
172
173         pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address
174         pllbuf[1] = div >> 8;
175         pllbuf[2] = div & 0xff;
176         pllbuf[3] = 0xcc;
177         pllbuf[4] = bs;
178
179         return 0;
180 }
181
182 static struct mt352_config samsung_tdtc9251dh0_config = {
183
184         .demod_address = 0x0f,
185         .demod_init = samsung_tdtc9251dh0_demod_init,
186         .pll_set = samsung_tdtc9251dh0_pll_set,
187 };
188
189 static int skystar23_samsung_tbdu18132_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
190 {
191         u8 buf[4];
192         u32 div;
193         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
194 //      struct adapter* adapter = (struct adapter*) fe->dvb->priv;
195
196         div = (params->frequency + (125/2)) / 125;
197
198         buf[0] = (div >> 8) & 0x7f;
199         buf[1] = (div >> 0) & 0xff;
200         buf[2] = 0x84 | ((div >> 10) & 0x60);
201         buf[3] = 0x80;
202
203         if (params->frequency < 1550000)
204                 buf[3] |= 0x02;
205
206         //if (i2c_transfer (&adapter->i2c_adap, &msg, 1) != 1) return -EIO;
207         return 0;
208 }
209
210 static struct mt312_config skystar23_samsung_tbdu18132_config = {
211
212         .demod_address = 0x0e,
213         .pll_set = skystar23_samsung_tbdu18132_pll_set,
214 };