blob: 84002bc80db5c2a7fb4e2b581bde0167181a6610 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 *
3 * device driver for Conexant 2388x based TV cards
4 * MPEG Transport Stream (DVB) routines
5 *
Chris Pascoefc40b262006-01-09 15:25:35 -02006 * (c) 2004, 2005 Chris Pascoe <c.pascoe@itee.uq.edu.au>
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24#include <linux/module.h>
25#include <linux/init.h>
26#include <linux/device.h>
27#include <linux/fs.h>
28#include <linux/kthread.h>
29#include <linux/file.h>
30#include <linux/suspend.h>
31
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include "cx88.h"
33#include "dvb-pll.h"
Michael Krufky5e453dc2006-01-09 15:32:31 -020034#include <media/v4l2-common.h>
Mauro Carvalho Chehab41ef7c12005-07-12 13:58:44 -070035
Andrew de Quincey1f10c7a2006-08-08 09:10:09 -030036#include "mt352.h"
37#include "mt352_priv.h"
Trent Piephoecf854d2007-05-05 20:11:32 -030038#include "cx88-vp3054-i2c.h"
Andrew de Quincey1f10c7a2006-08-08 09:10:09 -030039#include "zl10353.h"
40#include "cx22702.h"
41#include "or51132.h"
42#include "lgdt330x.h"
Steven Toth60464da2008-01-05 16:53:01 -030043#include "s5h1409.h"
44#include "xc5000.h"
Andrew de Quincey1f10c7a2006-08-08 09:10:09 -030045#include "nxt200x.h"
46#include "cx24123.h"
Andrew de Quinceycd20ca92006-05-12 20:31:51 -030047#include "isl6421.h"
Michael Krufky0df31f82008-04-22 14:46:13 -030048#include "tuner-simple.h"
Michael Krufky827855d2008-04-22 14:46:16 -030049#include "tda9887.h"
Steven Tothd893d5d2008-04-25 03:46:43 -030050#include "s5h1411.h"
Igor M. Liplianine4aab642008-09-23 15:43:57 -030051#include "stv0299.h"
52#include "z0194a.h"
53#include "stv0288.h"
54#include "stb6000.h"
Steven Toth5bd1b662008-09-04 01:17:33 -030055#include "cx24116.h"
Igor M. Liplianinb699c272009-11-16 22:22:32 -030056#include "stv0900.h"
57#include "stb6100.h"
58#include "stb6100_proc.h"
Sergey Ivanov111ac842010-08-09 10:18:32 -030059#include "mb86a16.h"
Igor M. Liplianin0cb73632011-02-25 18:41:24 -030060#include "ds3000.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
62MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
63MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
64MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
65MODULE_LICENSE("GPL");
66
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030067static unsigned int debug;
Linus Torvalds1da177e2005-04-16 15:20:36 -070068module_param(debug, int, 0644);
69MODULE_PARM_DESC(debug,"enable debug messages [dvb]");
70
Ang Way Chuang44c6e2a72010-12-24 02:40:46 -030071static unsigned int dvb_buf_tscnt = 32;
72module_param(dvb_buf_tscnt, int, 0644);
73MODULE_PARM_DESC(dvb_buf_tscnt, "DVB Buffer TS count [dvb]");
74
Janne Grunau78e92002008-04-09 19:13:13 -030075DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
76
Linus Torvalds1da177e2005-04-16 15:20:36 -070077#define dprintk(level,fmt, arg...) if (debug >= level) \
Steven Toth6c5be742006-12-02 21:15:51 -020078 printk(KERN_DEBUG "%s/2-dvb: " fmt, core->name, ## arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -070079
80/* ------------------------------------------------------------------ */
81
82static int dvb_buf_setup(struct videobuf_queue *q,
83 unsigned int *count, unsigned int *size)
84{
85 struct cx8802_dev *dev = q->priv_data;
86
87 dev->ts_packet_size = 188 * 4;
Ang Way Chuang44c6e2a72010-12-24 02:40:46 -030088 dev->ts_packet_count = dvb_buf_tscnt;
Linus Torvalds1da177e2005-04-16 15:20:36 -070089
90 *size = dev->ts_packet_size * dev->ts_packet_count;
Ang Way Chuang44c6e2a72010-12-24 02:40:46 -030091 *count = dvb_buf_tscnt;
Linus Torvalds1da177e2005-04-16 15:20:36 -070092 return 0;
93}
94
Michael Krufky4a390552006-12-05 02:00:53 -030095static int dvb_buf_prepare(struct videobuf_queue *q,
96 struct videobuf_buffer *vb, enum v4l2_field field)
Linus Torvalds1da177e2005-04-16 15:20:36 -070097{
98 struct cx8802_dev *dev = q->priv_data;
Mauro Carvalho Chehabc7b0ac02006-03-10 12:29:15 -030099 return cx8802_buf_prepare(q, dev, (struct cx88_buffer*)vb,field);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100}
101
102static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
103{
104 struct cx8802_dev *dev = q->priv_data;
105 cx8802_buf_queue(dev, (struct cx88_buffer*)vb);
106}
107
Michael Krufky4a390552006-12-05 02:00:53 -0300108static void dvb_buf_release(struct videobuf_queue *q,
109 struct videobuf_buffer *vb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110{
Mauro Carvalho Chehabc7b0ac02006-03-10 12:29:15 -0300111 cx88_free_buffer(q, (struct cx88_buffer*)vb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112}
113
lawrence rust2e4e98e2010-08-25 09:50:20 -0300114static const struct videobuf_queue_ops dvb_qops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115 .buf_setup = dvb_buf_setup,
116 .buf_prepare = dvb_buf_prepare,
117 .buf_queue = dvb_buf_queue,
118 .buf_release = dvb_buf_release,
119};
120
121/* ------------------------------------------------------------------ */
Michael Krufky22f3f172006-12-05 01:38:58 -0300122
123static int cx88_dvb_bus_ctrl(struct dvb_frontend* fe, int acquire)
124{
125 struct cx8802_dev *dev= fe->dvb->priv;
126 struct cx8802_driver *drv = NULL;
127 int ret = 0;
Steven Toth363c35f2008-10-11 11:05:50 -0300128 int fe_id;
129
130 fe_id = videobuf_dvb_find_frontend(&dev->frontends, fe);
131 if (!fe_id) {
Steven Toth2af03ee2008-10-16 20:17:31 -0300132 printk(KERN_ERR "%s() No frontend found\n", __func__);
Steven Toth363c35f2008-10-11 11:05:50 -0300133 return -EINVAL;
134 }
135
Jonathan Nieder8a317a82011-05-01 06:29:16 -0300136 mutex_lock(&dev->core->lock);
Michael Krufky22f3f172006-12-05 01:38:58 -0300137 drv = cx8802_get_driver(dev, CX88_MPEG_DVB);
Jonathan Nieder8a317a82011-05-01 06:29:16 -0300138 mutex_unlock(&dev->core->lock);
139
Michael Krufky22f3f172006-12-05 01:38:58 -0300140 if (drv) {
Steven Toth363c35f2008-10-11 11:05:50 -0300141 if (acquire){
142 dev->frontends.active_fe_id = fe_id;
Michael Krufky22f3f172006-12-05 01:38:58 -0300143 ret = drv->request_acquire(drv);
Steven Toth363c35f2008-10-11 11:05:50 -0300144 } else {
Michael Krufky22f3f172006-12-05 01:38:58 -0300145 ret = drv->request_release(drv);
Steven Toth363c35f2008-10-11 11:05:50 -0300146 dev->frontends.active_fe_id = 0;
147 }
Michael Krufky22f3f172006-12-05 01:38:58 -0300148 }
149
150 return ret;
151}
152
Mauro Carvalho Chehabe32fadc2009-01-06 16:06:07 -0300153static void cx88_dvb_gate_ctrl(struct cx88_core *core, int open)
154{
155 struct videobuf_dvb_frontends *f;
156 struct videobuf_dvb_frontend *fe;
157
158 if (!core->dvbdev)
159 return;
160
161 f = &core->dvbdev->frontends;
162
163 if (!f)
164 return;
165
166 if (f->gate <= 1) /* undefined or fe0 */
167 fe = videobuf_dvb_get_frontend(f, 1);
168 else
169 fe = videobuf_dvb_get_frontend(f, f->gate);
170
171 if (fe && fe->dvb.frontend && fe->dvb.frontend->ops.i2c_gate_ctrl)
172 fe->dvb.frontend->ops.i2c_gate_ctrl(fe->dvb.frontend, open);
173}
174
Michael Krufky22f3f172006-12-05 01:38:58 -0300175/* ------------------------------------------------------------------ */
176
Chris Pascoe3d7d0272006-01-09 18:21:31 -0200177static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178{
lawrence rust2e4e98e2010-08-25 09:50:20 -0300179 static const u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 };
180 static const u8 reset [] = { RESET, 0x80 };
181 static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
182 static const u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 };
183 static const u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
184 static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185
186 mt352_write(fe, clock_config, sizeof(clock_config));
187 udelay(200);
188 mt352_write(fe, reset, sizeof(reset));
189 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
190
191 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
192 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
193 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
194 return 0;
195}
196
Chris Pascoe43eabb42006-01-09 18:21:28 -0200197static int dvico_dual_demod_init(struct dvb_frontend *fe)
198{
lawrence rust2e4e98e2010-08-25 09:50:20 -0300199 static const u8 clock_config [] = { CLOCK_CTL, 0x38, 0x38 };
200 static const u8 reset [] = { RESET, 0x80 };
201 static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
202 static const u8 agc_cfg [] = { AGC_TARGET, 0x28, 0x20 };
203 static const u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
204 static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
Chris Pascoe43eabb42006-01-09 18:21:28 -0200205
206 mt352_write(fe, clock_config, sizeof(clock_config));
207 udelay(200);
208 mt352_write(fe, reset, sizeof(reset));
209 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
210
211 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
212 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
213 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
214
215 return 0;
216}
217
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218static int dntv_live_dvbt_demod_init(struct dvb_frontend* fe)
219{
lawrence rust2e4e98e2010-08-25 09:50:20 -0300220 static const u8 clock_config [] = { 0x89, 0x38, 0x39 };
221 static const u8 reset [] = { 0x50, 0x80 };
222 static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
223 static const u8 agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
Mauro Carvalho Chehabf2421ca2005-11-08 21:37:45 -0800224 0x00, 0xFF, 0x00, 0x40, 0x40 };
lawrence rust2e4e98e2010-08-25 09:50:20 -0300225 static const u8 dntv_extra[] = { 0xB5, 0x7A };
226 static const u8 capt_range_cfg[] = { 0x75, 0x32 };
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227
228 mt352_write(fe, clock_config, sizeof(clock_config));
229 udelay(2000);
230 mt352_write(fe, reset, sizeof(reset));
231 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
232
233 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
234 udelay(2000);
235 mt352_write(fe, dntv_extra, sizeof(dntv_extra));
236 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
237
238 return 0;
239}
240
lawrence rust2e4e98e2010-08-25 09:50:20 -0300241static const struct mt352_config dvico_fusionhdtv = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300242 .demod_address = 0x0f,
Chris Pascoe3d7d0272006-01-09 18:21:31 -0200243 .demod_init = dvico_fusionhdtv_demod_init,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244};
245
lawrence rust2e4e98e2010-08-25 09:50:20 -0300246static const struct mt352_config dntv_live_dvbt_config = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247 .demod_address = 0x0f,
248 .demod_init = dntv_live_dvbt_demod_init,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249};
Chris Pascoefc40b262006-01-09 15:25:35 -0200250
lawrence rust2e4e98e2010-08-25 09:50:20 -0300251static const struct mt352_config dvico_fusionhdtv_dual = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300252 .demod_address = 0x0f,
Chris Pascoe43eabb42006-01-09 18:21:28 -0200253 .demod_init = dvico_dual_demod_init,
Chris Pascoe43eabb42006-01-09 18:21:28 -0200254};
255
lawrence rust2e4e98e2010-08-25 09:50:20 -0300256static const struct zl10353_config cx88_terratec_cinergy_ht_pci_mkii_config = {
Stephan Wienczny70101a22009-03-10 19:08:06 -0300257 .demod_address = (0x1e >> 1),
258 .no_tuner = 1,
259 .if2 = 45600,
260};
261
Sergey Ivanov111ac842010-08-09 10:18:32 -0300262static struct mb86a16_config twinhan_vp1027 = {
263 .demod_address = 0x08,
264};
265
Trent Piephoecf854d2007-05-05 20:11:32 -0300266#if defined(CONFIG_VIDEO_CX88_VP3054) || (defined(CONFIG_VIDEO_CX88_VP3054_MODULE) && defined(MODULE))
Chris Pascoe3d7d0272006-01-09 18:21:31 -0200267static int dntv_live_dvbt_pro_demod_init(struct dvb_frontend* fe)
268{
lawrence rust2e4e98e2010-08-25 09:50:20 -0300269 static const u8 clock_config [] = { 0x89, 0x38, 0x38 };
270 static const u8 reset [] = { 0x50, 0x80 };
271 static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
272 static const u8 agc_cfg [] = { 0x67, 0x10, 0x20, 0x00, 0xFF, 0xFF,
Chris Pascoe3d7d0272006-01-09 18:21:31 -0200273 0x00, 0xFF, 0x00, 0x40, 0x40 };
lawrence rust2e4e98e2010-08-25 09:50:20 -0300274 static const u8 dntv_extra[] = { 0xB5, 0x7A };
275 static const u8 capt_range_cfg[] = { 0x75, 0x32 };
Chris Pascoe3d7d0272006-01-09 18:21:31 -0200276
277 mt352_write(fe, clock_config, sizeof(clock_config));
278 udelay(2000);
279 mt352_write(fe, reset, sizeof(reset));
280 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
281
282 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
283 udelay(2000);
284 mt352_write(fe, dntv_extra, sizeof(dntv_extra));
285 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
286
287 return 0;
288}
289
lawrence rust2e4e98e2010-08-25 09:50:20 -0300290static const struct mt352_config dntv_live_dvbt_pro_config = {
Chris Pascoefc40b262006-01-09 15:25:35 -0200291 .demod_address = 0x0f,
292 .no_tuner = 1,
Chris Pascoe3d7d0272006-01-09 18:21:31 -0200293 .demod_init = dntv_live_dvbt_pro_demod_init,
Chris Pascoefc40b262006-01-09 15:25:35 -0200294};
295#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296
lawrence rust2e4e98e2010-08-25 09:50:20 -0300297static const struct zl10353_config dvico_fusionhdtv_hybrid = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300298 .demod_address = 0x0f,
Andrew de Quinceyf54376e2006-04-18 17:56:10 -0300299 .no_tuner = 1,
Chris Pascoe780dfef2006-02-28 08:34:59 -0300300};
301
lawrence rust2e4e98e2010-08-25 09:50:20 -0300302static const struct zl10353_config dvico_fusionhdtv_xc3028 = {
Chris Pascoeb3fb91d2008-04-22 14:45:15 -0300303 .demod_address = 0x0f,
304 .if2 = 45600,
305 .no_tuner = 1,
306};
307
lawrence rust2e4e98e2010-08-25 09:50:20 -0300308static const struct mt352_config dvico_fusionhdtv_mt352_xc3028 = {
Chris Pascoeb3fb91d2008-04-22 14:45:15 -0300309 .demod_address = 0x0f,
310 .if2 = 4560,
311 .no_tuner = 1,
312 .demod_init = dvico_fusionhdtv_demod_init,
313};
314
lawrence rust2e4e98e2010-08-25 09:50:20 -0300315static const struct zl10353_config dvico_fusionhdtv_plus_v1_1 = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300316 .demod_address = 0x0f,
Chris Pascoe780dfef2006-02-28 08:34:59 -0300317};
Chris Pascoe780dfef2006-02-28 08:34:59 -0300318
lawrence rust2e4e98e2010-08-25 09:50:20 -0300319static const struct cx22702_config connexant_refboard_config = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320 .demod_address = 0x43,
Patrick Boettcher38d84c32005-07-15 12:20:26 -0700321 .output_mode = CX22702_SERIAL_OUTPUT,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322};
323
lawrence rust2e4e98e2010-08-25 09:50:20 -0300324static const struct cx22702_config hauppauge_hvr_config = {
Steven Tothaa481a62006-09-14 15:41:13 -0300325 .demod_address = 0x63,
326 .output_mode = CX22702_SERIAL_OUTPUT,
327};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328
Michael Krufky4a390552006-12-05 02:00:53 -0300329static int or51132_set_ts_param(struct dvb_frontend* fe, int is_punctured)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330{
331 struct cx8802_dev *dev= fe->dvb->priv;
332 dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
333 return 0;
334}
335
lawrence rust2e4e98e2010-08-25 09:50:20 -0300336static const struct or51132_config pchdtv_hd3000 = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300337 .demod_address = 0x15,
338 .set_ts_params = or51132_set_ts_param,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340
Michael Krufky6ddcc912005-07-27 11:46:00 -0700341static int lgdt330x_pll_rf_set(struct dvb_frontend* fe, int index)
Michael Krufky0ccef6d2005-07-27 11:45:55 -0700342{
343 struct cx8802_dev *dev= fe->dvb->priv;
344 struct cx88_core *core = dev->core;
345
Harvey Harrison32d83ef2008-04-08 23:20:00 -0300346 dprintk(1, "%s: index = %d\n", __func__, index);
Michael Krufky0ccef6d2005-07-27 11:45:55 -0700347 if (index == 0)
348 cx_clear(MO_GP0_IO, 8);
349 else
350 cx_set(MO_GP0_IO, 8);
351 return 0;
352}
353
Michael Krufky6ddcc912005-07-27 11:46:00 -0700354static int lgdt330x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
Michael Krufkyf1798492005-07-07 17:58:39 -0700355{
356 struct cx8802_dev *dev= fe->dvb->priv;
357 if (is_punctured)
358 dev->ts_gen_cntrl |= 0x04;
359 else
360 dev->ts_gen_cntrl &= ~0x04;
361 return 0;
362}
363
Michael Krufky6ddcc912005-07-27 11:46:00 -0700364static struct lgdt330x_config fusionhdtv_3_gold = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300365 .demod_address = 0x0e,
366 .demod_chip = LGDT3302,
367 .serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */
368 .set_ts_params = lgdt330x_set_ts_param,
Michael Krufky0d723c02005-07-07 17:58:42 -0700369};
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -0700370
lawrence rust2e4e98e2010-08-25 09:50:20 -0300371static const struct lgdt330x_config fusionhdtv_5_gold = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300372 .demod_address = 0x0e,
373 .demod_chip = LGDT3303,
374 .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
375 .set_ts_params = lgdt330x_set_ts_param,
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -0700376};
Rusty Scottda215d22006-04-07 02:21:31 -0300377
lawrence rust2e4e98e2010-08-25 09:50:20 -0300378static const struct lgdt330x_config pchdtv_hd5500 = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300379 .demod_address = 0x59,
380 .demod_chip = LGDT3303,
381 .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
382 .set_ts_params = lgdt330x_set_ts_param,
Rusty Scottda215d22006-04-07 02:21:31 -0300383};
Michael Krufkyf1798492005-07-07 17:58:39 -0700384
Michael Krufky4a390552006-12-05 02:00:53 -0300385static int nxt200x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
Kirk Laprayfde6d312005-11-08 21:38:18 -0800386{
387 struct cx8802_dev *dev= fe->dvb->priv;
388 dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
389 return 0;
390}
391
lawrence rust2e4e98e2010-08-25 09:50:20 -0300392static const struct nxt200x_config ati_hdtvwonder = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300393 .demod_address = 0x0a,
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300394 .set_ts_params = nxt200x_set_ts_param,
Kirk Laprayfde6d312005-11-08 21:38:18 -0800395};
Kirk Laprayfde6d312005-11-08 21:38:18 -0800396
Steven Toth0fa14aa2006-01-09 15:25:02 -0200397static int cx24123_set_ts_param(struct dvb_frontend* fe,
398 int is_punctured)
399{
400 struct cx8802_dev *dev= fe->dvb->priv;
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300401 dev->ts_gen_cntrl = 0x02;
Steven Toth0fa14aa2006-01-09 15:25:02 -0200402 return 0;
403}
404
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300405static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe,
406 fe_sec_voltage_t voltage)
Vadim Catana0e0351e2006-01-09 15:25:02 -0200407{
408 struct cx8802_dev *dev= fe->dvb->priv;
409 struct cx88_core *core = dev->core;
410
Michael Krufky4a390552006-12-05 02:00:53 -0300411 if (voltage == SEC_VOLTAGE_OFF)
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300412 cx_write(MO_GP0_IO, 0x000006fb);
Michael Krufky4a390552006-12-05 02:00:53 -0300413 else
Andrew de Quinceycd20ca92006-05-12 20:31:51 -0300414 cx_write(MO_GP0_IO, 0x000006f9);
Andrew de Quinceycd20ca92006-05-12 20:31:51 -0300415
416 if (core->prev_set_voltage)
417 return core->prev_set_voltage(fe, voltage);
418 return 0;
Vadim Catana0e0351e2006-01-09 15:25:02 -0200419}
420
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300421static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe,
422 fe_sec_voltage_t voltage)
Saqeb Akhterc02a34f2006-06-29 20:29:33 -0300423{
424 struct cx8802_dev *dev= fe->dvb->priv;
425 struct cx88_core *core = dev->core;
426
427 if (voltage == SEC_VOLTAGE_OFF) {
428 dprintk(1,"LNB Voltage OFF\n");
429 cx_write(MO_GP0_IO, 0x0000efff);
430 }
431
432 if (core->prev_set_voltage)
433 return core->prev_set_voltage(fe, voltage);
434 return 0;
435}
436
Igor M. Liplianinaf832622008-09-04 17:24:14 -0300437static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
438 fe_sec_voltage_t voltage)
439{
440 struct cx8802_dev *dev= fe->dvb->priv;
441 struct cx88_core *core = dev->core;
442
Igor M. Liplianinad5f74c2009-07-29 19:18:28 -0300443 cx_set(MO_GP0_IO, 0x6040);
Igor M. Liplianinaf832622008-09-04 17:24:14 -0300444 switch (voltage) {
Sergey Ivanov111ac842010-08-09 10:18:32 -0300445 case SEC_VOLTAGE_13:
446 cx_clear(MO_GP0_IO, 0x20);
447 break;
448 case SEC_VOLTAGE_18:
449 cx_set(MO_GP0_IO, 0x20);
450 break;
451 case SEC_VOLTAGE_OFF:
452 cx_clear(MO_GP0_IO, 0x20);
453 break;
454 }
455
456 if (core->prev_set_voltage)
457 return core->prev_set_voltage(fe, voltage);
458 return 0;
459}
460
461static int vp1027_set_voltage(struct dvb_frontend *fe,
462 fe_sec_voltage_t voltage)
463{
464 struct cx8802_dev *dev = fe->dvb->priv;
465 struct cx88_core *core = dev->core;
466
467 switch (voltage) {
468 case SEC_VOLTAGE_13:
469 dprintk(1, "LNB SEC Voltage=13\n");
470 cx_write(MO_GP0_IO, 0x00001220);
471 break;
472 case SEC_VOLTAGE_18:
473 dprintk(1, "LNB SEC Voltage=18\n");
474 cx_write(MO_GP0_IO, 0x00001222);
475 break;
476 case SEC_VOLTAGE_OFF:
477 dprintk(1, "LNB Voltage OFF\n");
478 cx_write(MO_GP0_IO, 0x00001230);
479 break;
Igor M. Liplianinaf832622008-09-04 17:24:14 -0300480 }
481
482 if (core->prev_set_voltage)
483 return core->prev_set_voltage(fe, voltage);
484 return 0;
485}
486
lawrence rust2e4e98e2010-08-25 09:50:20 -0300487static const struct cx24123_config geniatech_dvbs_config = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300488 .demod_address = 0x55,
489 .set_ts_params = cx24123_set_ts_param,
Saqeb Akhterc02a34f2006-06-29 20:29:33 -0300490};
491
lawrence rust2e4e98e2010-08-25 09:50:20 -0300492static const struct cx24123_config hauppauge_novas_config = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300493 .demod_address = 0x55,
494 .set_ts_params = cx24123_set_ts_param,
Vadim Catana0e0351e2006-01-09 15:25:02 -0200495};
496
lawrence rust2e4e98e2010-08-25 09:50:20 -0300497static const struct cx24123_config kworld_dvbs_100_config = {
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300498 .demod_address = 0x15,
499 .set_ts_params = cx24123_set_ts_param,
Yeasah Pellef768562006-09-26 12:30:14 -0300500 .lnb_polarity = 1,
Steven Toth0fa14aa2006-01-09 15:25:02 -0200501};
Steven Toth0fa14aa2006-01-09 15:25:02 -0200502
lawrence rust2e4e98e2010-08-25 09:50:20 -0300503static const struct s5h1409_config pinnacle_pctv_hd_800i_config = {
Steven Toth60464da2008-01-05 16:53:01 -0300504 .demod_address = 0x32 >> 1,
505 .output_mode = S5H1409_PARALLEL_OUTPUT,
506 .gpio = S5H1409_GPIO_ON,
507 .qam_if = 44000,
508 .inversion = S5H1409_INVERSION_OFF,
509 .status_mode = S5H1409_DEMODLOCKING,
Steven Toth49170192008-01-15 21:57:14 -0300510 .mpeg_timing = S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
Steven Toth60464da2008-01-05 16:53:01 -0300511};
512
lawrence rust2e4e98e2010-08-25 09:50:20 -0300513static const struct s5h1409_config dvico_hdtv5_pci_nano_config = {
Steven Toth5c00fac2008-04-22 14:45:14 -0300514 .demod_address = 0x32 >> 1,
515 .output_mode = S5H1409_SERIAL_OUTPUT,
516 .gpio = S5H1409_GPIO_OFF,
517 .inversion = S5H1409_INVERSION_OFF,
518 .status_mode = S5H1409_DEMODLOCKING,
519 .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
520};
521
lawrence rust2e4e98e2010-08-25 09:50:20 -0300522static const struct s5h1409_config kworld_atsc_120_config = {
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -0300523 .demod_address = 0x32 >> 1,
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -0300524 .output_mode = S5H1409_SERIAL_OUTPUT,
525 .gpio = S5H1409_GPIO_OFF,
526 .inversion = S5H1409_INVERSION_OFF,
527 .status_mode = S5H1409_DEMODLOCKING,
528 .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
529};
530
lawrence rust2e4e98e2010-08-25 09:50:20 -0300531static const struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = {
Steven Toth60464da2008-01-05 16:53:01 -0300532 .i2c_address = 0x64,
533 .if_khz = 5380,
Steven Toth60464da2008-01-05 16:53:01 -0300534};
535
lawrence rust2e4e98e2010-08-25 09:50:20 -0300536static const struct zl10353_config cx88_pinnacle_hybrid_pctv = {
Stéphane Voltz3f6014f2008-09-05 14:33:54 -0300537 .demod_address = (0x1e >> 1),
538 .no_tuner = 1,
539 .if2 = 45600,
540};
541
lawrence rust2e4e98e2010-08-25 09:50:20 -0300542static const struct zl10353_config cx88_geniatech_x8000_mt = {
Mauro Carvalho Chehab57069342009-08-20 10:14:45 -0300543 .demod_address = (0x1e >> 1),
544 .no_tuner = 1,
545 .disable_i2c_gate_ctrl = 1,
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -0300546};
547
lawrence rust2e4e98e2010-08-25 09:50:20 -0300548static const struct s5h1411_config dvico_fusionhdtv7_config = {
Steven Tothd893d5d2008-04-25 03:46:43 -0300549 .output_mode = S5H1411_SERIAL_OUTPUT,
550 .gpio = S5H1411_GPIO_ON,
551 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
552 .qam_if = S5H1411_IF_44000,
553 .vsb_if = S5H1411_IF_44000,
554 .inversion = S5H1411_INVERSION_OFF,
555 .status_mode = S5H1411_DEMODLOCKING
556};
557
lawrence rust2e4e98e2010-08-25 09:50:20 -0300558static const struct xc5000_config dvico_fusionhdtv7_tuner_config = {
Steven Tothd893d5d2008-04-25 03:46:43 -0300559 .i2c_address = 0xc2 >> 1,
560 .if_khz = 5380,
Steven Tothd893d5d2008-04-25 03:46:43 -0300561};
562
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -0300563static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
564{
565 struct dvb_frontend *fe;
Steven Toth363c35f2008-10-11 11:05:50 -0300566 struct videobuf_dvb_frontend *fe0 = NULL;
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -0300567 struct xc2028_ctrl ctl;
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -0300568 struct xc2028_config cfg = {
569 .i2c_adap = &dev->core->i2c_adap,
570 .i2c_addr = addr,
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -0300571 .ctrl = &ctl,
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -0300572 };
573
Darron Broad92abe9e2008-10-11 11:18:53 -0300574 /* Get the first frontend */
Steven Toth363c35f2008-10-11 11:05:50 -0300575 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
576 if (!fe0)
577 return -EINVAL;
578
579 if (!fe0->dvb.frontend) {
Mauro Carvalho Chehabddd54412008-04-22 14:45:46 -0300580 printk(KERN_ERR "%s/2: dvb frontend not attached. "
581 "Can't attach xc3028\n",
582 dev->core->name);
583 return -EINVAL;
584 }
585
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -0300586 /*
587 * Some xc3028 devices may be hidden by an I2C gate. This is known
588 * to happen with some s5h1409-based devices.
589 * Now that I2C gate is open, sets up xc3028 configuration
590 */
591 cx88_setup_xc3028(dev->core, &ctl);
592
Steven Toth363c35f2008-10-11 11:05:50 -0300593 fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -0300594 if (!fe) {
595 printk(KERN_ERR "%s/2: xc3028 attach failed\n",
596 dev->core->name);
Steven Toth363c35f2008-10-11 11:05:50 -0300597 dvb_frontend_detach(fe0->dvb.frontend);
598 dvb_unregister_frontend(fe0->dvb.frontend);
599 fe0->dvb.frontend = NULL;
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -0300600 return -EINVAL;
601 }
602
603 printk(KERN_INFO "%s/2: xc3028 attached\n",
604 dev->core->name);
605
606 return 0;
607}
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -0300608
Steven Toth5bd1b662008-09-04 01:17:33 -0300609static int cx24116_set_ts_param(struct dvb_frontend *fe,
610 int is_punctured)
611{
612 struct cx8802_dev *dev = fe->dvb->priv;
613 dev->ts_gen_cntrl = 0x2;
614
615 return 0;
616}
617
Igor M. Liplianinb699c272009-11-16 22:22:32 -0300618static int stv0900_set_ts_param(struct dvb_frontend *fe,
619 int is_punctured)
620{
621 struct cx8802_dev *dev = fe->dvb->priv;
622 dev->ts_gen_cntrl = 0;
623
624 return 0;
625}
626
Steven Toth5bd1b662008-09-04 01:17:33 -0300627static int cx24116_reset_device(struct dvb_frontend *fe)
628{
629 struct cx8802_dev *dev = fe->dvb->priv;
630 struct cx88_core *core = dev->core;
631
632 /* Reset the part */
Steven Toth363c35f2008-10-11 11:05:50 -0300633 /* Put the cx24116 into reset */
Steven Toth5bd1b662008-09-04 01:17:33 -0300634 cx_write(MO_SRST_IO, 0);
635 msleep(10);
Steven Toth363c35f2008-10-11 11:05:50 -0300636 /* Take the cx24116 out of reset */
Steven Toth5bd1b662008-09-04 01:17:33 -0300637 cx_write(MO_SRST_IO, 1);
638 msleep(10);
639
640 return 0;
641}
642
lawrence rust2e4e98e2010-08-25 09:50:20 -0300643static const struct cx24116_config hauppauge_hvr4000_config = {
Steven Toth5bd1b662008-09-04 01:17:33 -0300644 .demod_address = 0x05,
645 .set_ts_params = cx24116_set_ts_param,
646 .reset_device = cx24116_reset_device,
647};
648
lawrence rust2e4e98e2010-08-25 09:50:20 -0300649static const struct cx24116_config tevii_s460_config = {
Igor M. Liplianinaf832622008-09-04 17:24:14 -0300650 .demod_address = 0x55,
651 .set_ts_params = cx24116_set_ts_param,
652 .reset_device = cx24116_reset_device,
653};
654
Igor M. Liplianin0cb73632011-02-25 18:41:24 -0300655static int ds3000_set_ts_param(struct dvb_frontend *fe,
656 int is_punctured)
657{
658 struct cx8802_dev *dev = fe->dvb->priv;
659 dev->ts_gen_cntrl = 4;
660
661 return 0;
662}
663
664static struct ds3000_config tevii_ds3000_config = {
665 .demod_address = 0x68,
666 .set_ts_params = ds3000_set_ts_param,
667};
668
lawrence rust2e4e98e2010-08-25 09:50:20 -0300669static const struct stv0900_config prof_7301_stv0900_config = {
Igor M. Liplianinb699c272009-11-16 22:22:32 -0300670 .demod_address = 0x6a,
671/* demod_mode = 0,*/
672 .xtal = 27000000,
673 .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
674 .diseqc_mode = 2,/* 2/3 PWM */
675 .tun1_maddress = 0,/* 0x60 */
676 .tun1_adc = 0,/* 2 Vpp */
677 .path1_mode = 3,
678 .set_ts_params = stv0900_set_ts_param,
679};
680
lawrence rust2e4e98e2010-08-25 09:50:20 -0300681static const struct stb6100_config prof_7301_stb6100_config = {
Igor M. Liplianinb699c272009-11-16 22:22:32 -0300682 .tuner_address = 0x60,
683 .refclock = 27000000,
684};
685
lawrence rust2e4e98e2010-08-25 09:50:20 -0300686static const struct stv0299_config tevii_tuner_sharp_config = {
Igor M. Liplianine4aab642008-09-23 15:43:57 -0300687 .demod_address = 0x68,
Igor M. Liplianind4305c62008-10-17 13:45:55 -0300688 .inittab = sharp_z0194a_inittab,
Igor M. Liplianine4aab642008-09-23 15:43:57 -0300689 .mclk = 88000000UL,
690 .invert = 1,
691 .skip_reinit = 0,
692 .lock_output = 1,
693 .volt13_op0_op1 = STV0299_VOLT13_OP1,
694 .min_delay_ms = 100,
Igor M. Liplianind4305c62008-10-17 13:45:55 -0300695 .set_symbol_rate = sharp_z0194a_set_symbol_rate,
Igor M. Liplianine4aab642008-09-23 15:43:57 -0300696 .set_ts_params = cx24116_set_ts_param,
697};
698
lawrence rust2e4e98e2010-08-25 09:50:20 -0300699static const struct stv0288_config tevii_tuner_earda_config = {
Igor M. Liplianine4aab642008-09-23 15:43:57 -0300700 .demod_address = 0x68,
701 .min_delay_ms = 100,
702 .set_ts_params = cx24116_set_ts_param,
703};
704
Andy Walls6e0e12f2009-01-11 21:18:04 -0300705static int cx8802_alloc_frontends(struct cx8802_dev *dev)
706{
707 struct cx88_core *core = dev->core;
708 struct videobuf_dvb_frontend *fe = NULL;
709 int i;
710
711 mutex_init(&dev->frontends.lock);
712 INIT_LIST_HEAD(&dev->frontends.felist);
713
714 if (!core->board.num_frontends)
715 return -ENODEV;
716
717 printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
718 core->board.num_frontends);
719 for (i = 1; i <= core->board.num_frontends; i++) {
720 fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
721 if (!fe) {
722 printk(KERN_ERR "%s() failed to alloc\n", __func__);
723 videobuf_dvb_dealloc_frontends(&dev->frontends);
724 return -ENOMEM;
725 }
726 }
727 return 0;
728}
729
Dirk Herrendoerfer4f3ca2f12010-02-11 18:06:34 -0300730
731
lawrence rust2e4e98e2010-08-25 09:50:20 -0300732static const u8 samsung_smt_7020_inittab[] = {
Dirk Herrendoerfer4f3ca2f12010-02-11 18:06:34 -0300733 0x01, 0x15,
734 0x02, 0x00,
735 0x03, 0x00,
736 0x04, 0x7D,
737 0x05, 0x0F,
738 0x06, 0x02,
739 0x07, 0x00,
740 0x08, 0x60,
741
742 0x0A, 0xC2,
743 0x0B, 0x00,
744 0x0C, 0x01,
745 0x0D, 0x81,
746 0x0E, 0x44,
747 0x0F, 0x09,
748 0x10, 0x3C,
749 0x11, 0x84,
750 0x12, 0xDA,
751 0x13, 0x99,
752 0x14, 0x8D,
753 0x15, 0xCE,
754 0x16, 0xE8,
755 0x17, 0x43,
756 0x18, 0x1C,
757 0x19, 0x1B,
758 0x1A, 0x1D,
759
760 0x1C, 0x12,
761 0x1D, 0x00,
762 0x1E, 0x00,
763 0x1F, 0x00,
764 0x20, 0x00,
765 0x21, 0x00,
766 0x22, 0x00,
767 0x23, 0x00,
768
769 0x28, 0x02,
770 0x29, 0x28,
771 0x2A, 0x14,
772 0x2B, 0x0F,
773 0x2C, 0x09,
774 0x2D, 0x05,
775
776 0x31, 0x1F,
777 0x32, 0x19,
778 0x33, 0xFC,
779 0x34, 0x13,
780 0xff, 0xff,
781};
782
783
784static int samsung_smt_7020_tuner_set_params(struct dvb_frontend *fe,
785 struct dvb_frontend_parameters *params)
786{
787 struct cx8802_dev *dev = fe->dvb->priv;
788 u8 buf[4];
789 u32 div;
790 struct i2c_msg msg = {
791 .addr = 0x61,
792 .flags = 0,
793 .buf = buf,
794 .len = sizeof(buf) };
795
796 div = params->frequency / 125;
797
798 buf[0] = (div >> 8) & 0x7f;
799 buf[1] = div & 0xff;
800 buf[2] = 0x84; /* 0xC4 */
801 buf[3] = 0x00;
802
803 if (params->frequency < 1500000)
804 buf[3] |= 0x10;
805
806 if (fe->ops.i2c_gate_ctrl)
807 fe->ops.i2c_gate_ctrl(fe, 1);
808
809 if (i2c_transfer(&dev->core->i2c_adap, &msg, 1) != 1)
810 return -EIO;
811
812 return 0;
813}
814
815static int samsung_smt_7020_set_tone(struct dvb_frontend *fe,
816 fe_sec_tone_mode_t tone)
817{
818 struct cx8802_dev *dev = fe->dvb->priv;
819 struct cx88_core *core = dev->core;
820
821 cx_set(MO_GP0_IO, 0x0800);
822
823 switch (tone) {
824 case SEC_TONE_ON:
825 cx_set(MO_GP0_IO, 0x08);
826 break;
827 case SEC_TONE_OFF:
828 cx_clear(MO_GP0_IO, 0x08);
829 break;
830 default:
831 return -EINVAL;
832 }
833
834 return 0;
835}
836
837static int samsung_smt_7020_set_voltage(struct dvb_frontend *fe,
838 fe_sec_voltage_t voltage)
839{
840 struct cx8802_dev *dev = fe->dvb->priv;
841 struct cx88_core *core = dev->core;
842
843 u8 data;
844 struct i2c_msg msg = {
845 .addr = 8,
846 .flags = 0,
847 .buf = &data,
848 .len = sizeof(data) };
849
850 cx_set(MO_GP0_IO, 0x8000);
851
852 switch (voltage) {
853 case SEC_VOLTAGE_OFF:
854 break;
855 case SEC_VOLTAGE_13:
856 data = ISL6421_EN1 | ISL6421_LLC1;
857 cx_clear(MO_GP0_IO, 0x80);
858 break;
859 case SEC_VOLTAGE_18:
860 data = ISL6421_EN1 | ISL6421_LLC1 | ISL6421_VSEL1;
861 cx_clear(MO_GP0_IO, 0x80);
862 break;
863 default:
864 return -EINVAL;
865 };
866
867 return (i2c_transfer(&dev->core->i2c_adap, &msg, 1) == 1) ? 0 : -EIO;
868}
869
870static int samsung_smt_7020_stv0299_set_symbol_rate(struct dvb_frontend *fe,
871 u32 srate, u32 ratio)
872{
873 u8 aclk = 0;
874 u8 bclk = 0;
875
876 if (srate < 1500000) {
877 aclk = 0xb7;
878 bclk = 0x47;
879 } else if (srate < 3000000) {
880 aclk = 0xb7;
881 bclk = 0x4b;
882 } else if (srate < 7000000) {
883 aclk = 0xb7;
884 bclk = 0x4f;
885 } else if (srate < 14000000) {
886 aclk = 0xb7;
887 bclk = 0x53;
888 } else if (srate < 30000000) {
889 aclk = 0xb6;
890 bclk = 0x53;
891 } else if (srate < 45000000) {
892 aclk = 0xb4;
893 bclk = 0x51;
894 }
895
896 stv0299_writereg(fe, 0x13, aclk);
897 stv0299_writereg(fe, 0x14, bclk);
898 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
899 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
900 stv0299_writereg(fe, 0x21, ratio & 0xf0);
901
902 return 0;
903}
904
905
lawrence rust2e4e98e2010-08-25 09:50:20 -0300906static const struct stv0299_config samsung_stv0299_config = {
Dirk Herrendoerfer4f3ca2f12010-02-11 18:06:34 -0300907 .demod_address = 0x68,
908 .inittab = samsung_smt_7020_inittab,
909 .mclk = 88000000UL,
910 .invert = 0,
911 .skip_reinit = 0,
912 .lock_output = STV0299_LOCKOUTPUT_LK,
913 .volt13_op0_op1 = STV0299_VOLT13_OP1,
914 .min_delay_ms = 100,
915 .set_symbol_rate = samsung_smt_7020_stv0299_set_symbol_rate,
916};
917
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918static int dvb_register(struct cx8802_dev *dev)
919{
Steven Toth363c35f2008-10-11 11:05:50 -0300920 struct cx88_core *core = dev->core;
921 struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
Darron Broad59b18422008-10-11 11:44:05 -0300922 int mfe_shared = 0; /* bus not shared by default */
Steven Toth363c35f2008-10-11 11:05:50 -0300923
Matthias Schwarzott0e8bac92008-10-24 10:47:07 -0300924 if (0 != core->i2c_rc) {
925 printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
926 goto frontend_detach;
927 }
928
Steven Toth363c35f2008-10-11 11:05:50 -0300929 /* Get the first frontend */
930 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
931 if (!fe0)
Darron Broad60a5a922008-11-11 08:48:27 -0300932 goto frontend_detach;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933
Darron Broad8e739092008-10-11 11:31:41 -0300934 /* multi-frontend gate control is undefined or defaults to fe0 */
935 dev->frontends.gate = 0;
936
Mauro Carvalho Chehabe32fadc2009-01-06 16:06:07 -0300937 /* Sets the gate control callback to be used by i2c command calls */
938 core->gate_ctrl = cx88_dvb_gate_ctrl;
939
Darron Broad8e739092008-10-11 11:31:41 -0300940 /* init frontend(s) */
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300941 switch (core->boardnr) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942 case CX88_BOARD_HAUPPAUGE_DVB_T1:
Steven Toth363c35f2008-10-11 11:05:50 -0300943 fe0->dvb.frontend = dvb_attach(cx22702_attach,
Michael Krufkyed355262006-12-05 01:34:56 -0300944 &connexant_refboard_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300945 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -0300946 if (fe0->dvb.frontend != NULL) {
947 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300948 0x61, &core->i2c_adap,
949 DVB_PLL_THOMSON_DTT759X))
950 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -0300951 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 break;
Michael Krufkye057ee12005-07-07 17:58:40 -0700953 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 case CX88_BOARD_CONEXANT_DVB_T1:
Manenti Marcof39624f2006-01-09 15:32:45 -0200955 case CX88_BOARD_KWORLD_DVB_T_CX22702:
David Shirley2b5200a2005-11-08 21:37:22 -0800956 case CX88_BOARD_WINFAST_DTV1000:
Steven Toth363c35f2008-10-11 11:05:50 -0300957 fe0->dvb.frontend = dvb_attach(cx22702_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -0300958 &connexant_refboard_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300959 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -0300960 if (fe0->dvb.frontend != NULL) {
961 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300962 0x60, &core->i2c_adap,
963 DVB_PLL_THOMSON_DTT7579))
964 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -0300965 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966 break;
Malcolm Valentine4bd6e9d2006-05-29 13:51:59 -0300967 case CX88_BOARD_WINFAST_DTV2000H:
Vlastimil Labsky4d14c832009-08-10 22:15:54 -0300968 case CX88_BOARD_WINFAST_DTV2000H_J:
Steven Toth611900c2006-01-09 15:25:12 -0200969 case CX88_BOARD_HAUPPAUGE_HVR1100:
970 case CX88_BOARD_HAUPPAUGE_HVR1100LP:
Trent Piephoa5a2ecf2007-03-09 15:07:07 -0300971 case CX88_BOARD_HAUPPAUGE_HVR1300:
Steven Toth363c35f2008-10-11 11:05:50 -0300972 fe0->dvb.frontend = dvb_attach(cx22702_attach,
Michael Krufkyed355262006-12-05 01:34:56 -0300973 &hauppauge_hvr_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300974 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -0300975 if (fe0->dvb.frontend != NULL) {
976 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -0300977 &core->i2c_adap, 0x61,
978 TUNER_PHILIPS_FMD1216ME_MK3))
979 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -0300980 }
Steven Toth611900c2006-01-09 15:25:12 -0200981 break;
Steven Toth363c35f2008-10-11 11:05:50 -0300982 case CX88_BOARD_HAUPPAUGE_HVR3000:
Darron Broad60a5a922008-11-11 08:48:27 -0300983 /* MFE frontend 1 */
984 mfe_shared = 1;
985 dev->frontends.gate = 2;
Steven Toth363c35f2008-10-11 11:05:50 -0300986 /* DVB-S init */
987 fe0->dvb.frontend = dvb_attach(cx24123_attach,
Darron Broad60a5a922008-11-11 08:48:27 -0300988 &hauppauge_novas_config,
989 &dev->core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -0300990 if (fe0->dvb.frontend) {
Darron Broad60a5a922008-11-11 08:48:27 -0300991 if (!dvb_attach(isl6421_attach,
992 fe0->dvb.frontend,
993 &dev->core->i2c_adap,
994 0x08, ISL6421_DCL, 0x00))
995 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -0300996 }
Darron Broad60a5a922008-11-11 08:48:27 -0300997 /* MFE frontend 2 */
Steven Toth363c35f2008-10-11 11:05:50 -0300998 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
Darron Broad60a5a922008-11-11 08:48:27 -0300999 if (!fe1)
1000 goto frontend_detach;
1001 /* DVB-T init */
1002 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1003 &hauppauge_hvr_config,
1004 &dev->core->i2c_adap);
1005 if (fe1->dvb.frontend) {
1006 fe1->dvb.frontend->id = 1;
1007 if (!dvb_attach(simple_tuner_attach,
1008 fe1->dvb.frontend,
1009 &dev->core->i2c_adap,
1010 0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1011 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001012 }
1013 break;
Chris Pascoe780dfef2006-02-28 08:34:59 -03001014 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
Steven Toth363c35f2008-10-11 11:05:50 -03001015 fe0->dvb.frontend = dvb_attach(mt352_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001016 &dvico_fusionhdtv,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001017 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001018 if (fe0->dvb.frontend != NULL) {
1019 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001020 0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1021 goto frontend_detach;
Chris Pascoe780dfef2006-02-28 08:34:59 -03001022 break;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001023 }
Chris Pascoe780dfef2006-02-28 08:34:59 -03001024 /* ZL10353 replaces MT352 on later cards */
Steven Toth363c35f2008-10-11 11:05:50 -03001025 fe0->dvb.frontend = dvb_attach(zl10353_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001026 &dvico_fusionhdtv_plus_v1_1,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001027 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001028 if (fe0->dvb.frontend != NULL) {
1029 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001030 0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1031 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001032 }
Chris Pascoe780dfef2006-02-28 08:34:59 -03001033 break;
Michael Krufkyc2af3cd2006-06-12 14:06:22 -03001034 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
Michael Krufkyc2af3cd2006-06-12 14:06:22 -03001035 /* The tin box says DEE1601, but it seems to be DTT7579
1036 * compatible, with a slightly different MT352 AGC gain. */
Steven Toth363c35f2008-10-11 11:05:50 -03001037 fe0->dvb.frontend = dvb_attach(mt352_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001038 &dvico_fusionhdtv_dual,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001039 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001040 if (fe0->dvb.frontend != NULL) {
1041 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001042 0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1043 goto frontend_detach;
Michael Krufkyc2af3cd2006-06-12 14:06:22 -03001044 break;
1045 }
Michael Krufkyc2af3cd2006-06-12 14:06:22 -03001046 /* ZL10353 replaces MT352 on later cards */
Steven Toth363c35f2008-10-11 11:05:50 -03001047 fe0->dvb.frontend = dvb_attach(zl10353_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001048 &dvico_fusionhdtv_plus_v1_1,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001049 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001050 if (fe0->dvb.frontend != NULL) {
1051 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001052 0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1053 goto frontend_detach;
Michael Krufkyc2af3cd2006-06-12 14:06:22 -03001054 }
Michael Krufkyc2af3cd2006-06-12 14:06:22 -03001055 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
Steven Toth363c35f2008-10-11 11:05:50 -03001057 fe0->dvb.frontend = dvb_attach(mt352_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001058 &dvico_fusionhdtv,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001059 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001060 if (fe0->dvb.frontend != NULL) {
1061 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001062 0x61, NULL, DVB_PLL_LG_Z201))
1063 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001064 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 case CX88_BOARD_KWORLD_DVB_T:
1067 case CX88_BOARD_DNTV_LIVE_DVB_T:
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -07001068 case CX88_BOARD_ADSTECH_DVB_T_PCI:
Steven Toth363c35f2008-10-11 11:05:50 -03001069 fe0->dvb.frontend = dvb_attach(mt352_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001070 &dntv_live_dvbt_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001071 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001072 if (fe0->dvb.frontend != NULL) {
1073 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001074 0x61, NULL, DVB_PLL_UNKNOWN_1))
1075 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001076 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077 break;
Chris Pascoefc40b262006-01-09 15:25:35 -02001078 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
Trent Piephoecf854d2007-05-05 20:11:32 -03001079#if defined(CONFIG_VIDEO_CX88_VP3054) || (defined(CONFIG_VIDEO_CX88_VP3054_MODULE) && defined(MODULE))
Trent Piephof0ad9092007-10-14 02:52:16 -03001080 /* MT352 is on a secondary I2C bus made from some GPIO lines */
Steven Toth363c35f2008-10-11 11:05:50 -03001081 fe0->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config,
Trent Piephof0ad9092007-10-14 02:52:16 -03001082 &dev->vp3054->adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001083 if (fe0->dvb.frontend != NULL) {
1084 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001085 &core->i2c_adap, 0x61,
1086 TUNER_PHILIPS_FMD1216ME_MK3))
1087 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001088 }
Chris Pascoefc40b262006-01-09 15:25:35 -02001089#else
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001090 printk(KERN_ERR "%s/2: built without vp3054 support\n",
1091 core->name);
Chris Pascoefc40b262006-01-09 15:25:35 -02001092#endif
1093 break;
Chris Pascoe780dfef2006-02-28 08:34:59 -03001094 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
Steven Toth363c35f2008-10-11 11:05:50 -03001095 fe0->dvb.frontend = dvb_attach(zl10353_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001096 &dvico_fusionhdtv_hybrid,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001097 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001098 if (fe0->dvb.frontend != NULL) {
1099 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001100 &core->i2c_adap, 0x61,
1101 TUNER_THOMSON_FE6600))
1102 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001103 }
Chris Pascoe780dfef2006-02-28 08:34:59 -03001104 break;
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03001105 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
Steven Toth363c35f2008-10-11 11:05:50 -03001106 fe0->dvb.frontend = dvb_attach(zl10353_attach,
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03001107 &dvico_fusionhdtv_xc3028,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001108 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001109 if (fe0->dvb.frontend == NULL)
1110 fe0->dvb.frontend = dvb_attach(mt352_attach,
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03001111 &dvico_fusionhdtv_mt352_xc3028,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001112 &core->i2c_adap);
Chris Pascoe87655612008-04-22 14:45:15 -03001113 /*
1114 * On this board, the demod provides the I2C bus pullup.
1115 * We must not permit gate_ctrl to be performed, or
1116 * the xc3028 cannot communicate on the bus.
1117 */
Steven Toth363c35f2008-10-11 11:05:50 -03001118 if (fe0->dvb.frontend)
1119 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -03001120 if (attach_xc3028(0x61, dev) < 0)
Darron Broadbecd4302008-10-21 11:47:50 -03001121 goto frontend_detach;
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03001122 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123 case CX88_BOARD_PCHDTV_HD3000:
Steven Toth363c35f2008-10-11 11:05:50 -03001124 fe0->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001125 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001126 if (fe0->dvb.frontend != NULL) {
1127 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001128 &core->i2c_adap, 0x61,
1129 TUNER_THOMSON_DTT761X))
1130 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001131 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 break;
Michael Krufkyf1798492005-07-07 17:58:39 -07001133 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q:
1134 dev->ts_gen_cntrl = 0x08;
Michael Krufkyf1798492005-07-07 17:58:39 -07001135
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001136 /* Do a hardware reset of chip before using it. */
Michael Krufkyf1798492005-07-07 17:58:39 -07001137 cx_clear(MO_GP0_IO, 1);
1138 mdelay(100);
Michael Krufky0ccef6d2005-07-27 11:45:55 -07001139 cx_set(MO_GP0_IO, 1);
Michael Krufkyf1798492005-07-07 17:58:39 -07001140 mdelay(200);
Michael Krufky0ccef6d2005-07-27 11:45:55 -07001141
1142 /* Select RF connector callback */
Michael Krufky6ddcc912005-07-27 11:46:00 -07001143 fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set;
Steven Toth363c35f2008-10-11 11:05:50 -03001144 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001145 &fusionhdtv_3_gold,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001146 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001147 if (fe0->dvb.frontend != NULL) {
1148 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001149 &core->i2c_adap, 0x61,
1150 TUNER_MICROTUNE_4042FI5))
1151 goto frontend_detach;
Michael Krufkyf1798492005-07-07 17:58:39 -07001152 }
1153 break;
Michael Krufky0d723c02005-07-07 17:58:42 -07001154 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T:
1155 dev->ts_gen_cntrl = 0x08;
Michael Krufky0d723c02005-07-07 17:58:42 -07001156
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001157 /* Do a hardware reset of chip before using it. */
Michael Krufky0d723c02005-07-07 17:58:42 -07001158 cx_clear(MO_GP0_IO, 1);
1159 mdelay(100);
Michael Krufkyd9758722005-07-27 11:45:56 -07001160 cx_set(MO_GP0_IO, 9);
Michael Krufky0d723c02005-07-07 17:58:42 -07001161 mdelay(200);
Steven Toth363c35f2008-10-11 11:05:50 -03001162 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001163 &fusionhdtv_3_gold,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001164 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001165 if (fe0->dvb.frontend != NULL) {
1166 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001167 &core->i2c_adap, 0x61,
1168 TUNER_THOMSON_DTT761X))
1169 goto frontend_detach;
Michael Krufky0d723c02005-07-07 17:58:42 -07001170 }
1171 break;
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -07001172 case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
1173 dev->ts_gen_cntrl = 0x08;
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -07001174
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001175 /* Do a hardware reset of chip before using it. */
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -07001176 cx_clear(MO_GP0_IO, 1);
1177 mdelay(100);
1178 cx_set(MO_GP0_IO, 1);
1179 mdelay(200);
Steven Toth363c35f2008-10-11 11:05:50 -03001180 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001181 &fusionhdtv_5_gold,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001182 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001183 if (fe0->dvb.frontend != NULL) {
1184 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001185 &core->i2c_adap, 0x61,
1186 TUNER_LG_TDVS_H06XF))
1187 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001188 if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001189 &core->i2c_adap, 0x43))
1190 goto frontend_detach;
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -07001191 }
1192 break;
Rusty Scottda215d22006-04-07 02:21:31 -03001193 case CX88_BOARD_PCHDTV_HD5500:
1194 dev->ts_gen_cntrl = 0x08;
Rusty Scottda215d22006-04-07 02:21:31 -03001195
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001196 /* Do a hardware reset of chip before using it. */
Rusty Scottda215d22006-04-07 02:21:31 -03001197 cx_clear(MO_GP0_IO, 1);
1198 mdelay(100);
1199 cx_set(MO_GP0_IO, 1);
1200 mdelay(200);
Steven Toth363c35f2008-10-11 11:05:50 -03001201 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001202 &pchdtv_hd5500,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001203 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001204 if (fe0->dvb.frontend != NULL) {
1205 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001206 &core->i2c_adap, 0x61,
1207 TUNER_LG_TDVS_H06XF))
1208 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001209 if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001210 &core->i2c_adap, 0x43))
1211 goto frontend_detach;
Rusty Scottda215d22006-04-07 02:21:31 -03001212 }
1213 break;
Kirk Laprayfde6d312005-11-08 21:38:18 -08001214 case CX88_BOARD_ATI_HDTVWONDER:
Steven Toth363c35f2008-10-11 11:05:50 -03001215 fe0->dvb.frontend = dvb_attach(nxt200x_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001216 &ati_hdtvwonder,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001217 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001218 if (fe0->dvb.frontend != NULL) {
1219 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001220 &core->i2c_adap, 0x61,
1221 TUNER_PHILIPS_TUV1236D))
1222 goto frontend_detach;
Andrew de Quinceyf54376e2006-04-18 17:56:10 -03001223 }
Kirk Laprayfde6d312005-11-08 21:38:18 -08001224 break;
Steven Toth0fa14aa2006-01-09 15:25:02 -02001225 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
1226 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
Steven Toth363c35f2008-10-11 11:05:50 -03001227 fe0->dvb.frontend = dvb_attach(cx24123_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001228 &hauppauge_novas_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001229 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001230 if (fe0->dvb.frontend) {
1231 if (!dvb_attach(isl6421_attach, fe0->dvb.frontend,
Steven Toth83fe92e2008-09-13 19:22:15 -03001232 &core->i2c_adap, 0x08, ISL6421_DCL, 0x00))
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001233 goto frontend_detach;
Andrew de Quinceycd20ca92006-05-12 20:31:51 -03001234 }
Steven Toth0fa14aa2006-01-09 15:25:02 -02001235 break;
Vadim Catana0e0351e2006-01-09 15:25:02 -02001236 case CX88_BOARD_KWORLD_DVBS_100:
Steven Toth363c35f2008-10-11 11:05:50 -03001237 fe0->dvb.frontend = dvb_attach(cx24123_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001238 &kworld_dvbs_100_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001239 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001240 if (fe0->dvb.frontend) {
1241 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1242 fe0->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
Andrew de Quinceycd20ca92006-05-12 20:31:51 -03001243 }
Vadim Catana0e0351e2006-01-09 15:25:02 -02001244 break;
Saqeb Akhterc02a34f2006-06-29 20:29:33 -03001245 case CX88_BOARD_GENIATECH_DVBS:
Steven Toth363c35f2008-10-11 11:05:50 -03001246 fe0->dvb.frontend = dvb_attach(cx24123_attach,
Michael Krufkyf7b54b12006-08-08 15:48:08 -03001247 &geniatech_dvbs_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001248 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001249 if (fe0->dvb.frontend) {
1250 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1251 fe0->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;
Saqeb Akhterc02a34f2006-06-29 20:29:33 -03001252 }
1253 break;
Steven Toth60464da2008-01-05 16:53:01 -03001254 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
Steven Toth363c35f2008-10-11 11:05:50 -03001255 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
Steven Toth60464da2008-01-05 16:53:01 -03001256 &pinnacle_pctv_hd_800i_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001257 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001258 if (fe0->dvb.frontend != NULL) {
1259 if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001260 &core->i2c_adap,
Michael Krufky30650962008-09-06 14:56:58 -03001261 &pinnacle_pctv_hd_800i_tuner_config))
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001262 goto frontend_detach;
Steven Toth60464da2008-01-05 16:53:01 -03001263 }
1264 break;
Steven Toth5c00fac2008-04-22 14:45:14 -03001265 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
Steven Toth363c35f2008-10-11 11:05:50 -03001266 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
Steven Toth5c00fac2008-04-22 14:45:14 -03001267 &dvico_hdtv5_pci_nano_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001268 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001269 if (fe0->dvb.frontend != NULL) {
Steven Toth5c00fac2008-04-22 14:45:14 -03001270 struct dvb_frontend *fe;
1271 struct xc2028_config cfg = {
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001272 .i2c_adap = &core->i2c_adap,
Steven Toth5c00fac2008-04-22 14:45:14 -03001273 .i2c_addr = 0x61,
Steven Toth5c00fac2008-04-22 14:45:14 -03001274 };
1275 static struct xc2028_ctrl ctl = {
Michael Krufkyef80bfe2008-09-16 02:15:30 -03001276 .fname = XC2028_DEFAULT_FIRMWARE,
Steven Toth5c00fac2008-04-22 14:45:14 -03001277 .max_len = 64,
Mauro Carvalho Chehab33e53162008-04-21 06:58:48 -03001278 .scode_table = XC3028_FE_OREN538,
Steven Toth5c00fac2008-04-22 14:45:14 -03001279 };
1280
1281 fe = dvb_attach(xc2028_attach,
Steven Toth363c35f2008-10-11 11:05:50 -03001282 fe0->dvb.frontend, &cfg);
Steven Toth5c00fac2008-04-22 14:45:14 -03001283 if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
1284 fe->ops.tuner_ops.set_config(fe, &ctl);
1285 }
1286 break;
Ricardo Maraschinid49f7a22010-04-06 02:40:43 -03001287 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
Miroslav Sustek3047a172009-05-31 16:47:28 -03001288 case CX88_BOARD_WINFAST_DTV1800H:
Steven Toth363c35f2008-10-11 11:05:50 -03001289 fe0->dvb.frontend = dvb_attach(zl10353_attach,
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001290 &cx88_pinnacle_hybrid_pctv,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001291 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001292 if (fe0->dvb.frontend) {
1293 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001294 if (attach_xc3028(0x61, dev) < 0)
1295 goto frontend_detach;
1296 }
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001297 break;
1298 case CX88_BOARD_GENIATECH_X8000_MT:
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03001299 dev->ts_gen_cntrl = 0x00;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001300
Steven Toth363c35f2008-10-11 11:05:50 -03001301 fe0->dvb.frontend = dvb_attach(zl10353_attach,
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001302 &cx88_geniatech_x8000_mt,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001303 &core->i2c_adap);
Mauro Carvalho Chehab23fb3482008-04-22 14:45:30 -03001304 if (attach_xc3028(0x61, dev) < 0)
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001305 goto frontend_detach;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001306 break;
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03001307 case CX88_BOARD_KWORLD_ATSC_120:
Steven Toth363c35f2008-10-11 11:05:50 -03001308 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03001309 &kworld_atsc_120_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001310 &core->i2c_adap);
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03001311 if (attach_xc3028(0x61, dev) < 0)
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001312 goto frontend_detach;
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03001313 break;
Steven Tothd893d5d2008-04-25 03:46:43 -03001314 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
Steven Toth363c35f2008-10-11 11:05:50 -03001315 fe0->dvb.frontend = dvb_attach(s5h1411_attach,
Steven Tothd893d5d2008-04-25 03:46:43 -03001316 &dvico_fusionhdtv7_config,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001317 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001318 if (fe0->dvb.frontend != NULL) {
1319 if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001320 &core->i2c_adap,
Michael Krufky30650962008-09-06 14:56:58 -03001321 &dvico_fusionhdtv7_tuner_config))
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001322 goto frontend_detach;
Steven Tothd893d5d2008-04-25 03:46:43 -03001323 }
1324 break;
Steven Toth5bd1b662008-09-04 01:17:33 -03001325 case CX88_BOARD_HAUPPAUGE_HVR4000:
Darron Broad60a5a922008-11-11 08:48:27 -03001326 /* MFE frontend 1 */
1327 mfe_shared = 1;
1328 dev->frontends.gate = 2;
Steven Toth363c35f2008-10-11 11:05:50 -03001329 /* DVB-S/S2 Init */
1330 fe0->dvb.frontend = dvb_attach(cx24116_attach,
Darron Broad60a5a922008-11-11 08:48:27 -03001331 &hauppauge_hvr4000_config,
1332 &dev->core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001333 if (fe0->dvb.frontend) {
Darron Broad60a5a922008-11-11 08:48:27 -03001334 if (!dvb_attach(isl6421_attach,
1335 fe0->dvb.frontend,
1336 &dev->core->i2c_adap,
1337 0x08, ISL6421_DCL, 0x00))
1338 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001339 }
Darron Broad60a5a922008-11-11 08:48:27 -03001340 /* MFE frontend 2 */
Steven Toth363c35f2008-10-11 11:05:50 -03001341 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
Darron Broad60a5a922008-11-11 08:48:27 -03001342 if (!fe1)
1343 goto frontend_detach;
1344 /* DVB-T Init */
1345 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1346 &hauppauge_hvr_config,
1347 &dev->core->i2c_adap);
1348 if (fe1->dvb.frontend) {
1349 fe1->dvb.frontend->id = 1;
1350 if (!dvb_attach(simple_tuner_attach,
1351 fe1->dvb.frontend,
1352 &dev->core->i2c_adap,
1353 0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1354 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001355 }
1356 break;
1357 case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
1358 fe0->dvb.frontend = dvb_attach(cx24116_attach,
Darron Broad60a5a922008-11-11 08:48:27 -03001359 &hauppauge_hvr4000_config,
1360 &dev->core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001361 if (fe0->dvb.frontend) {
Darron Broad60a5a922008-11-11 08:48:27 -03001362 if (!dvb_attach(isl6421_attach,
1363 fe0->dvb.frontend,
1364 &dev->core->i2c_adap,
1365 0x08, ISL6421_DCL, 0x00))
1366 goto frontend_detach;
Steven Toth5bd1b662008-09-04 01:17:33 -03001367 }
1368 break;
Igor M. Liplianincd3cde12008-11-09 15:26:25 -03001369 case CX88_BOARD_PROF_6200:
Igor M. Liplianin4b296312008-11-09 15:25:31 -03001370 case CX88_BOARD_TBS_8910:
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001371 case CX88_BOARD_TEVII_S420:
Steven Toth363c35f2008-10-11 11:05:50 -03001372 fe0->dvb.frontend = dvb_attach(stv0299_attach,
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001373 &tevii_tuner_sharp_config,
1374 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001375 if (fe0->dvb.frontend != NULL) {
1376 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001377 &core->i2c_adap, DVB_PLL_OPERA1))
1378 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001379 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1380 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001381
1382 } else {
Steven Toth363c35f2008-10-11 11:05:50 -03001383 fe0->dvb.frontend = dvb_attach(stv0288_attach,
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001384 &tevii_tuner_earda_config,
1385 &core->i2c_adap);
Steven Toth363c35f2008-10-11 11:05:50 -03001386 if (fe0->dvb.frontend != NULL) {
1387 if (!dvb_attach(stb6000_attach, fe0->dvb.frontend, 0x61,
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001388 &core->i2c_adap))
1389 goto frontend_detach;
Steven Toth363c35f2008-10-11 11:05:50 -03001390 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1391 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001392 }
1393 }
1394 break;
Igor M. Liplianinaf832622008-09-04 17:24:14 -03001395 case CX88_BOARD_TEVII_S460:
Steven Toth363c35f2008-10-11 11:05:50 -03001396 fe0->dvb.frontend = dvb_attach(cx24116_attach,
Igor M. Liplianinaf832622008-09-04 17:24:14 -03001397 &tevii_s460_config,
1398 &core->i2c_adap);
Igor M. Liplianin93f26c12008-11-09 14:59:33 -03001399 if (fe0->dvb.frontend != NULL)
Steven Toth363c35f2008-10-11 11:05:50 -03001400 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
Igor M. Liplianinaf832622008-09-04 17:24:14 -03001401 break;
Igor M. Liplianin0cb73632011-02-25 18:41:24 -03001402 case CX88_BOARD_TEVII_S464:
1403 fe0->dvb.frontend = dvb_attach(ds3000_attach,
1404 &tevii_ds3000_config,
1405 &core->i2c_adap);
1406 if (fe0->dvb.frontend != NULL)
1407 fe0->dvb.frontend->ops.set_voltage =
1408 tevii_dvbs_set_voltage;
1409 break;
Oleg Roitburd4cd7fb82008-09-17 11:30:21 -03001410 case CX88_BOARD_OMICOM_SS4_PCI:
Oleg Roitburdee730422008-09-17 11:58:33 -03001411 case CX88_BOARD_TBS_8920:
Oleg Roitburd57f51db2008-10-08 06:48:08 -03001412 case CX88_BOARD_PROF_7300:
Igor M. Liplianin4b296312008-11-09 15:25:31 -03001413 case CX88_BOARD_SATTRADE_ST4200:
Steven Toth363c35f2008-10-11 11:05:50 -03001414 fe0->dvb.frontend = dvb_attach(cx24116_attach,
Oleg Roitburdee730422008-09-17 11:58:33 -03001415 &hauppauge_hvr4000_config,
1416 &core->i2c_adap);
Igor M. Liplianin93f26c12008-11-09 14:59:33 -03001417 if (fe0->dvb.frontend != NULL)
Steven Toth363c35f2008-10-11 11:05:50 -03001418 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
Oleg Roitburdee730422008-09-17 11:58:33 -03001419 break;
Stephan Wienczny70101a22009-03-10 19:08:06 -03001420 case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
1421 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1422 &cx88_terratec_cinergy_ht_pci_mkii_config,
1423 &core->i2c_adap);
1424 if (fe0->dvb.frontend) {
1425 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1426 if (attach_xc3028(0x61, dev) < 0)
1427 goto frontend_detach;
1428 }
1429 break;
Igor M. Liplianinb699c272009-11-16 22:22:32 -03001430 case CX88_BOARD_PROF_7301:{
1431 struct dvb_tuner_ops *tuner_ops = NULL;
1432
1433 fe0->dvb.frontend = dvb_attach(stv0900_attach,
1434 &prof_7301_stv0900_config,
1435 &core->i2c_adap, 0);
1436 if (fe0->dvb.frontend != NULL) {
1437 if (!dvb_attach(stb6100_attach, fe0->dvb.frontend,
1438 &prof_7301_stb6100_config,
1439 &core->i2c_adap))
1440 goto frontend_detach;
1441
1442 tuner_ops = &fe0->dvb.frontend->ops.tuner_ops;
1443 tuner_ops->set_frequency = stb6100_set_freq;
1444 tuner_ops->get_frequency = stb6100_get_freq;
1445 tuner_ops->set_bandwidth = stb6100_set_bandw;
1446 tuner_ops->get_bandwidth = stb6100_get_bandw;
1447
1448 core->prev_set_voltage =
1449 fe0->dvb.frontend->ops.set_voltage;
1450 fe0->dvb.frontend->ops.set_voltage =
1451 tevii_dvbs_set_voltage;
1452 }
1453 break;
1454 }
Dirk Herrendoerfer4f3ca2f12010-02-11 18:06:34 -03001455 case CX88_BOARD_SAMSUNG_SMT_7020:
1456 dev->ts_gen_cntrl = 0x08;
1457
Dirk Herrendoerfer4f3ca2f12010-02-11 18:06:34 -03001458 cx_set(MO_GP0_IO, 0x0101);
1459
1460 cx_clear(MO_GP0_IO, 0x01);
1461 mdelay(100);
1462 cx_set(MO_GP0_IO, 0x01);
1463 mdelay(200);
1464
1465 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1466 &samsung_stv0299_config,
1467 &dev->core->i2c_adap);
1468 if (fe0->dvb.frontend) {
1469 fe0->dvb.frontend->ops.tuner_ops.set_params =
1470 samsung_smt_7020_tuner_set_params;
1471 fe0->dvb.frontend->tuner_priv =
1472 &dev->core->i2c_adap;
1473 fe0->dvb.frontend->ops.set_voltage =
1474 samsung_smt_7020_set_voltage;
1475 fe0->dvb.frontend->ops.set_tone =
1476 samsung_smt_7020_set_tone;
1477 }
1478
1479 break;
Sergey Ivanov111ac842010-08-09 10:18:32 -03001480 case CX88_BOARD_TWINHAN_VP1027_DVBS:
1481 dev->ts_gen_cntrl = 0x00;
1482 fe0->dvb.frontend = dvb_attach(mb86a16_attach,
1483 &twinhan_vp1027,
1484 &core->i2c_adap);
1485 if (fe0->dvb.frontend) {
1486 core->prev_set_voltage =
1487 fe0->dvb.frontend->ops.set_voltage;
1488 fe0->dvb.frontend->ops.set_voltage =
1489 vp1027_set_voltage;
1490 }
1491 break;
Dirk Herrendoerfer4f3ca2f12010-02-11 18:06:34 -03001492
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493 default:
Trent Piepho5772f812007-08-15 14:41:59 -03001494 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001495 core->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 break;
1497 }
Steven Toth363c35f2008-10-11 11:05:50 -03001498
Mauro Carvalho Chehab2c9bcea2008-11-10 23:35:00 -02001499 if ( (NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend) ) {
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001500 printk(KERN_ERR
1501 "%s/2: frontend initialization failed\n",
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001502 core->name);
Darron Broad60a5a922008-11-11 08:48:27 -03001503 goto frontend_detach;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001504 }
Michael Krufkyd7cba042008-09-12 13:31:45 -03001505 /* define general-purpose callback pointer */
Steven Toth363c35f2008-10-11 11:05:50 -03001506 fe0->dvb.frontend->callback = cx88_tuner_callback;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001507
Steven Toth6c5be742006-12-02 21:15:51 -02001508 /* Ensure all frontends negotiate bus access */
Steven Toth363c35f2008-10-11 11:05:50 -03001509 fe0->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1510 if (fe1)
1511 fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512
Mauro Carvalho Chehab93352f52005-09-13 01:25:42 -07001513 /* Put the analog decoder in standby to keep it quiet */
Laurent Pinchart622b8282009-10-05 10:48:17 -03001514 call_all(core, core, s_power, 0);
Mauro Carvalho Chehab93352f52005-09-13 01:25:42 -07001515
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 /* register everything */
Steven Toth363c35f2008-10-11 11:05:50 -03001517 return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
Michael Krufky9133aee2009-05-23 18:00:59 -03001518 &dev->pci->dev, adapter_nr, mfe_shared, NULL);
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001519
1520frontend_detach:
Mauro Carvalho Chehabe32fadc2009-01-06 16:06:07 -03001521 core->gate_ctrl = NULL;
Darron Broadbecd4302008-10-21 11:47:50 -03001522 videobuf_dvb_dealloc_frontends(&dev->frontends);
Mauro Carvalho Chehab0590d912008-04-30 18:14:36 -03001523 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524}
1525
1526/* ----------------------------------------------------------- */
1527
Steven Toth6c5be742006-12-02 21:15:51 -02001528/* CX8802 MPEG -> mini driver - We have been given the hardware */
1529static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530{
Steven Toth6c5be742006-12-02 21:15:51 -02001531 struct cx88_core *core = drv->core;
1532 int err = 0;
Harvey Harrison32d83ef2008-04-08 23:20:00 -03001533 dprintk( 1, "%s\n", __func__);
Steven Toth6c5be742006-12-02 21:15:51 -02001534
Trent Piepho6a59d642007-08-15 14:41:57 -03001535 switch (core->boardnr) {
Steven Toth6c5be742006-12-02 21:15:51 -02001536 case CX88_BOARD_HAUPPAUGE_HVR1300:
1537 /* We arrive here with either the cx23416 or the cx22702
1538 * on the bus. Take the bus from the cx23416 and enable the
1539 * cx22702 demod
1540 */
Darron Broad79392732008-12-18 06:28:35 -03001541 /* Toggle reset on cx22702 leaving i2c active */
1542 cx_set(MO_GP0_IO, 0x00000080);
1543 udelay(1000);
1544 cx_clear(MO_GP0_IO, 0x00000080);
1545 udelay(50);
1546 cx_set(MO_GP0_IO, 0x00000080);
1547 udelay(1000);
1548 /* enable the cx22702 pins */
Steven Toth6c5be742006-12-02 21:15:51 -02001549 cx_clear(MO_GP0_IO, 0x00000004);
1550 udelay(1000);
1551 break;
Steven Toth363c35f2008-10-11 11:05:50 -03001552
Darron Broad92abe9e2008-10-11 11:18:53 -03001553 case CX88_BOARD_HAUPPAUGE_HVR3000:
Steven Toth363c35f2008-10-11 11:05:50 -03001554 case CX88_BOARD_HAUPPAUGE_HVR4000:
Darron Broad79392732008-12-18 06:28:35 -03001555 /* Toggle reset on cx22702 leaving i2c active */
1556 cx_set(MO_GP0_IO, 0x00000080);
1557 udelay(1000);
1558 cx_clear(MO_GP0_IO, 0x00000080);
1559 udelay(50);
1560 cx_set(MO_GP0_IO, 0x00000080);
1561 udelay(1000);
1562 switch (core->dvbdev->frontends.active_fe_id) {
1563 case 1: /* DVB-S/S2 Enabled */
1564 /* tri-state the cx22702 pins */
1565 cx_set(MO_GP0_IO, 0x00000004);
1566 /* Take the cx24116/cx24123 out of reset */
1567 cx_write(MO_SRST_IO, 1);
Steven Toth363c35f2008-10-11 11:05:50 -03001568 core->dvbdev->ts_gen_cntrl = 0x02; /* Parallel IO */
Darron Broad79392732008-12-18 06:28:35 -03001569 break;
1570 case 2: /* DVB-T Enabled */
Steven Toth363c35f2008-10-11 11:05:50 -03001571 /* Put the cx24116/cx24123 into reset */
1572 cx_write(MO_SRST_IO, 0);
Darron Broad79392732008-12-18 06:28:35 -03001573 /* enable the cx22702 pins */
Steven Toth363c35f2008-10-11 11:05:50 -03001574 cx_clear(MO_GP0_IO, 0x00000004);
1575 core->dvbdev->ts_gen_cntrl = 0x0c; /* Serial IO */
Darron Broad79392732008-12-18 06:28:35 -03001576 break;
Steven Toth363c35f2008-10-11 11:05:50 -03001577 }
Darron Broad79392732008-12-18 06:28:35 -03001578 udelay(1000);
Steven Toth363c35f2008-10-11 11:05:50 -03001579 break;
1580
Steven Toth6c5be742006-12-02 21:15:51 -02001581 default:
1582 err = -ENODEV;
1583 }
1584 return err;
1585}
1586
1587/* CX8802 MPEG -> mini driver - We no longer have the hardware */
1588static int cx8802_dvb_advise_release(struct cx8802_driver *drv)
1589{
1590 struct cx88_core *core = drv->core;
1591 int err = 0;
Harvey Harrison32d83ef2008-04-08 23:20:00 -03001592 dprintk( 1, "%s\n", __func__);
Steven Toth6c5be742006-12-02 21:15:51 -02001593
Trent Piepho6a59d642007-08-15 14:41:57 -03001594 switch (core->boardnr) {
Steven Toth6c5be742006-12-02 21:15:51 -02001595 case CX88_BOARD_HAUPPAUGE_HVR1300:
1596 /* Do Nothing, leave the cx22702 on the bus. */
1597 break;
Steven Toth363c35f2008-10-11 11:05:50 -03001598 case CX88_BOARD_HAUPPAUGE_HVR3000:
1599 case CX88_BOARD_HAUPPAUGE_HVR4000:
1600 break;
Steven Toth6c5be742006-12-02 21:15:51 -02001601 default:
1602 err = -ENODEV;
1603 }
1604 return err;
1605}
1606
1607static int cx8802_dvb_probe(struct cx8802_driver *drv)
1608{
1609 struct cx88_core *core = drv->core;
1610 struct cx8802_dev *dev = drv->core->dvbdev;
Darron Broadcbd82442008-10-30 05:07:44 -03001611 int err;
Andy Walls6e0e12f2009-01-11 21:18:04 -03001612 struct videobuf_dvb_frontend *fe;
1613 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614
Harvey Harrison32d83ef2008-04-08 23:20:00 -03001615 dprintk( 1, "%s\n", __func__);
Steven Toth6c5be742006-12-02 21:15:51 -02001616 dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
Trent Piepho6a59d642007-08-15 14:41:57 -03001617 core->boardnr,
Steven Toth6c5be742006-12-02 21:15:51 -02001618 core->name,
1619 core->pci_bus,
1620 core->pci_slot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621
1622 err = -ENODEV;
Trent Piepho6a59d642007-08-15 14:41:57 -03001623 if (!(core->board.mpeg & CX88_MPEG_DVB))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 goto fail_core;
1625
Trent Piephoecf854d2007-05-05 20:11:32 -03001626 /* If vp3054 isn't enabled, a stub will just return 0 */
Chris Pascoefc40b262006-01-09 15:25:35 -02001627 err = vp3054_i2c_probe(dev);
1628 if (0 != err)
Andy Walls6e0e12f2009-01-11 21:18:04 -03001629 goto fail_core;
Chris Pascoefc40b262006-01-09 15:25:35 -02001630
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 /* dvb stuff */
Trent Piepho5772f812007-08-15 14:41:59 -03001632 printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
Steven Toth363c35f2008-10-11 11:05:50 -03001633 dev->ts_gen_cntrl = 0x0c;
1634
Andy Walls6e0e12f2009-01-11 21:18:04 -03001635 err = cx8802_alloc_frontends(dev);
1636 if (err)
1637 goto fail_core;
Darron Broadcbd82442008-10-30 05:07:44 -03001638
Andy Walls6e0e12f2009-01-11 21:18:04 -03001639 err = -ENODEV;
1640 for (i = 1; i <= core->board.num_frontends; i++) {
1641 fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
1642 if (fe == NULL) {
1643 printk(KERN_ERR "%s() failed to get frontend(%d)\n",
Darron Broadcbd82442008-10-30 05:07:44 -03001644 __func__, i);
Andy Walls6e0e12f2009-01-11 21:18:04 -03001645 goto fail_probe;
1646 }
1647 videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
Darron Broadcbd82442008-10-30 05:07:44 -03001648 &dev->pci->dev, &dev->slock,
1649 V4L2_BUF_TYPE_VIDEO_CAPTURE,
1650 V4L2_FIELD_TOP,
1651 sizeof(struct cx88_buffer),
Hans Verkuil08bff032010-09-20 17:39:46 -03001652 dev, NULL);
Andy Walls6e0e12f2009-01-11 21:18:04 -03001653 /* init struct videobuf_dvb */
1654 fe->dvb.name = dev->core->name;
Steven Toth363c35f2008-10-11 11:05:50 -03001655 }
Andy Walls6e0e12f2009-01-11 21:18:04 -03001656
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657 err = dvb_register(dev);
Darron Broadcbd82442008-10-30 05:07:44 -03001658 if (err)
1659 /* frontends/adapter de-allocated in dvb_register */
Trent Piepho5772f812007-08-15 14:41:59 -03001660 printk(KERN_ERR "%s/2: dvb_register failed (err = %d)\n",
1661 core->name, err);
Darron Broadcbd82442008-10-30 05:07:44 -03001662 return err;
1663fail_probe:
1664 videobuf_dvb_dealloc_frontends(&core->dvbdev->frontends);
Darron Broad92abe9e2008-10-11 11:18:53 -03001665fail_core:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 return err;
1667}
1668
Steven Toth6c5be742006-12-02 21:15:51 -02001669static int cx8802_dvb_remove(struct cx8802_driver *drv)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670{
Darron Broad0fcd4882008-10-21 11:18:47 -03001671 struct cx88_core *core = drv->core;
Steven Toth6c5be742006-12-02 21:15:51 -02001672 struct cx8802_dev *dev = drv->core->dvbdev;
Steven Toth611900c2006-01-09 15:25:12 -02001673
Darron Broad0fcd4882008-10-21 11:18:47 -03001674 dprintk( 1, "%s\n", __func__);
1675
Steven Toth363c35f2008-10-11 11:05:50 -03001676 videobuf_dvb_unregister_bus(&dev->frontends);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677
Chris Pascoefc40b262006-01-09 15:25:35 -02001678 vp3054_i2c_remove(dev);
Chris Pascoefc40b262006-01-09 15:25:35 -02001679
Mauro Carvalho Chehabe32fadc2009-01-06 16:06:07 -03001680 core->gate_ctrl = NULL;
1681
Steven Toth6c5be742006-12-02 21:15:51 -02001682 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683}
1684
Steven Toth6c5be742006-12-02 21:15:51 -02001685static struct cx8802_driver cx8802_dvb_driver = {
1686 .type_id = CX88_MPEG_DVB,
1687 .hw_access = CX8802_DRVCTL_SHARED,
1688 .probe = cx8802_dvb_probe,
1689 .remove = cx8802_dvb_remove,
1690 .advise_acquire = cx8802_dvb_advise_acquire,
1691 .advise_release = cx8802_dvb_advise_release,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001692};
1693
Peter Huewe31d0f842009-07-17 01:00:01 +02001694static int __init dvb_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695{
Trent Piepho5772f812007-08-15 14:41:59 -03001696 printk(KERN_INFO "cx88/2: cx2388x dvb driver version %d.%d.%d loaded\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 (CX88_VERSION_CODE >> 16) & 0xff,
1698 (CX88_VERSION_CODE >> 8) & 0xff,
1699 CX88_VERSION_CODE & 0xff);
1700#ifdef SNAPSHOT
1701 printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",
1702 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
1703#endif
Steven Toth6c5be742006-12-02 21:15:51 -02001704 return cx8802_register_driver(&cx8802_dvb_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705}
1706
Peter Huewe31d0f842009-07-17 01:00:01 +02001707static void __exit dvb_fini(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708{
Steven Toth6c5be742006-12-02 21:15:51 -02001709 cx8802_unregister_driver(&cx8802_dvb_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001710}
1711
1712module_init(dvb_init);
1713module_exit(dvb_fini);
1714
1715/*
1716 * Local variables:
1717 * c-basic-offset: 8
1718 * compile-command: "make DVB=1"
1719 * End:
1720 */