cx23885-dvb.c revision c9b8b04b267f9a7e472daa06cdf6d4963d503d1f
1d19770e5178a4bc49641711246360c25781d20a4Steven Toth/*
2d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  Driver for the Conexant CX23885 PCIe bridge
3d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
46d8976164dd7d10d25fe940b8546265f60ad52cdSteven Toth *  Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
5d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
6d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  This program is free software; you can redistribute it and/or modify
7d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  it under the terms of the GNU General Public License as published by
8d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  the Free Software Foundation; either version 2 of the License, or
9d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  (at your option) any later version.
10d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
11d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  This program is distributed in the hope that it will be useful,
12d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
15d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  GNU General Public License for more details.
16d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
17d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  You should have received a copy of the GNU General Public License
18d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  along with this program; if not, write to the Free Software
19d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20d19770e5178a4bc49641711246360c25781d20a4Steven Toth */
21d19770e5178a4bc49641711246360c25781d20a4Steven Toth
22d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/module.h>
23d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/init.h>
24d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/device.h>
25d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/fs.h>
26d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/kthread.h>
27d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/file.h>
28d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/suspend.h>
29d19770e5178a4bc49641711246360c25781d20a4Steven Toth
30d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "cx23885.h"
31d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <media/v4l2-common.h>
32d19770e5178a4bc49641711246360c25781d20a4Steven Toth
33d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "s5h1409.h"
3452b5045078b76ee86e210210601d45670eab22f1Michael Krufky#include "s5h1411.h"
35d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "mt2131.h"
363ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky#include "tda8290.h"
374041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky#include "tda18271.h"
389bc37caadffe8327683980b2323371691fa182e3Michael Krufky#include "lgdt330x.h"
39d1987d55a1eda774dfbab240a432607c17241d07Steven Toth#include "xc5000.h"
40b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth#include "tda10048.h"
4107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky#include "tuner-xc2028.h"
42827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky#include "tuner-simple.h"
436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dib7000p.h"
446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dibx000_common.h"
45aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth#include "zl10353.h"
4696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin#include "cx24116.h"
47d19770e5178a4bc49641711246360c25781d20a4Steven Toth
484513fc696e273d64ea32f2366748aed810316eccSteven Tothstatic unsigned int debug;
49d19770e5178a4bc49641711246360c25781d20a4Steven Toth
504513fc696e273d64ea32f2366748aed810316eccSteven Toth#define dprintk(level, fmt, arg...)\
514513fc696e273d64ea32f2366748aed810316eccSteven Toth	do { if (debug >= level)\
524513fc696e273d64ea32f2366748aed810316eccSteven Toth		printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
534513fc696e273d64ea32f2366748aed810316eccSteven Toth	} while (0)
54d19770e5178a4bc49641711246360c25781d20a4Steven Toth
55d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* ------------------------------------------------------------------ */
56d19770e5178a4bc49641711246360c25781d20a4Steven Toth
573ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic unsigned int alt_tuner;
583ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkymodule_param(alt_tuner, int, 0644);
593ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael KrufkyMODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");
603ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
6178e92006f410a4044f8c1760c25ac9d11d259aa2Janne GrunauDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
6278e92006f410a4044f8c1760c25ac9d11d259aa2Janne Grunau
633ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky/* ------------------------------------------------------------------ */
643ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
65d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_buf_setup(struct videobuf_queue *q,
66d19770e5178a4bc49641711246360c25781d20a4Steven Toth			 unsigned int *count, unsigned int *size)
67d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
68d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
69d19770e5178a4bc49641711246360c25781d20a4Steven Toth
70d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_size  = 188 * 4;
71d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_count = 32;
72d19770e5178a4bc49641711246360c25781d20a4Steven Toth
73d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*size  = port->ts_packet_size * port->ts_packet_count;
74d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*count = 32;
75d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
76d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
77d19770e5178a4bc49641711246360c25781d20a4Steven Toth
7844a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic int dvb_buf_prepare(struct videobuf_queue *q,
7944a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			   struct videobuf_buffer *vb, enum v4l2_field field)
80d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
81d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
829c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	return cx23885_buf_prepare(q, port, (struct cx23885_buffer *)vb, field);
83d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
84d19770e5178a4bc49641711246360c25781d20a4Steven Toth
85d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
86d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
87d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
889c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	cx23885_buf_queue(port, (struct cx23885_buffer *)vb);
89d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
90d19770e5178a4bc49641711246360c25781d20a4Steven Toth
9144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic void dvb_buf_release(struct videobuf_queue *q,
9244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    struct videobuf_buffer *vb)
93d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
949c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	cx23885_free_buffer(q, (struct cx23885_buffer *)vb);
95d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
96d19770e5178a4bc49641711246360c25781d20a4Steven Toth
97d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic struct videobuf_queue_ops dvb_qops = {
98d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_setup    = dvb_buf_setup,
99d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_prepare  = dvb_buf_prepare,
100d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_queue    = dvb_buf_queue,
101d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_release  = dvb_buf_release,
102d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
103d19770e5178a4bc49641711246360c25781d20a4Steven Toth
10486184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct s5h1409_config hauppauge_generic_config = {
105d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.demod_address = 0x32 >> 1,
106d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
107fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.gpio          = S5H1409_GPIO_ON,
1082b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
109fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.inversion     = S5H1409_INVERSION_OFF,
110dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
111dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
112fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth};
113fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth
114b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda10048_config hauppauge_hvr1200_config = {
115b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.demod_address    = 0x10 >> 1,
116b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.output_mode      = TDA10048_SERIAL_OUTPUT,
117b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
118b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.inversion        = TDA10048_INVERSION_ON
119b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth};
120b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth
1213ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic struct s5h1409_config hauppauge_ezqam_config = {
1223ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.demod_address = 0x32 >> 1,
1233ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
1243ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
1253ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.qam_if        = 4000,
1263ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.inversion     = S5H1409_INVERSION_ON,
127dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
128dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
1293ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky};
1303ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
131fc959befe0f0e4647bb4e326e3ae55875401888aSteven Tothstatic struct s5h1409_config hauppauge_hvr1800lp_config = {
132fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.demod_address = 0x32 >> 1,
133fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
134d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.gpio          = S5H1409_GPIO_OFF,
1352b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
136fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
137dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
138dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
139d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
140d19770e5178a4bc49641711246360c25781d20a4Steven Toth
14107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic struct s5h1409_config hauppauge_hvr1500_config = {
14207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.demod_address = 0x32 >> 1,
14307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
14407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
14507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.inversion     = S5H1409_INVERSION_OFF,
146dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
147dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
14807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky};
14907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
15086184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct mt2131_config hauppauge_generic_tunerconfig = {
151a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	0x61
152a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth};
153a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth
1549bc37caadffe8327683980b2323371691fa182e3Michael Krufkystatic struct lgdt330x_config fusionhdtv_5_express = {
1559bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_address = 0x0e,
1569bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_chip = LGDT3303,
1579bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.serial_mpeg = 0x40,
1589bc37caadffe8327683980b2323371691fa182e3Michael Krufky};
1599bc37caadffe8327683980b2323371691fa182e3Michael Krufky
160d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct s5h1409_config hauppauge_hvr1500q_config = {
161d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.demod_address = 0x32 >> 1,
162d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
163d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.gpio          = S5H1409_GPIO_ON,
164d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.qam_if        = 44000,
165d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
166dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
167dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
168d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
169d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
170335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct s5h1409_config dvico_s5h1409_config = {
171335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.demod_address = 0x32 >> 1,
172335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
173335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.gpio          = S5H1409_GPIO_ON,
174335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.qam_if        = 44000,
175335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.inversion     = S5H1409_INVERSION_OFF,
176335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.status_mode   = S5H1409_DEMODLOCKING,
177335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
178335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky};
179335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
18052b5045078b76ee86e210210601d45670eab22f1Michael Krufkystatic struct s5h1411_config dvico_s5h1411_config = {
18152b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.output_mode   = S5H1411_SERIAL_OUTPUT,
18252b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.gpio          = S5H1411_GPIO_ON,
18352b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.qam_if        = S5H1411_IF_44000,
18452b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.vsb_if        = S5H1411_IF_44000,
18552b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.inversion     = S5H1411_INVERSION_OFF,
18652b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.status_mode   = S5H1411_DEMODLOCKING,
18752b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
18852b5045078b76ee86e210210601d45670eab22f1Michael Krufky};
18952b5045078b76ee86e210210601d45670eab22f1Michael Krufky
190d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
191e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.i2c_address      = 0x61,
192e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.if_khz           = 5380,
193d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
194d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
195335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct xc5000_config dvico_xc5000_tunerconfig = {
196335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.i2c_address      = 0x64,
197335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.if_khz           = 5380,
198335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky};
199335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
2004041f1a58774249f5f26163e68b844521ece1fb4Michael Krufkystatic struct tda829x_config tda829x_no_probe = {
2014041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky	.probe_tuner = TDA829X_DONT_PROBE,
2024041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky};
2034041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky
204f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_std_map hauppauge_tda18271_std_map = {
205c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky	.atsc_6   = { .if_freq = 5380, .agc_mode = 3, .std = 3,
206c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky		      .if_lvl = 6, .rfagc_top = 0x37 },
207c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
208c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky		      .if_lvl = 6, .rfagc_top = 0x37 },
209f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
210f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
211f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_config hauppauge_tda18271_config = {
212f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.std_map = &hauppauge_tda18271_std_map,
213f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.gate    = TDA18271_GATE_ANALOG,
214f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
215f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
216b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda18271_config hauppauge_hvr1200_tuner_config = {
217b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.gate    = TDA18271_GATE_ANALOG,
218b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth};
219b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth
220b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_agc_config xc3028_agc_config = {
2216676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	BAND_VHF | BAND_UHF,	/* band_caps */
2226676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2236676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
2246676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
2256676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0,
2266676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_nb_est=2, P_agc_write=0
2276676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 */
2286676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
2296676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		(3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
2306676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2316676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	712,	/* inv_gain */
2326676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	21,	/* time_stabiliz */
2336676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2346676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* alpha_level */
2356676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	118,	/* thlock */
2366676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2376676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* wbd_inv */
2386676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	2867,	/* wbd_ref */
2396676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* wbd_sel */
2406676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	2,	/* wbd_alpha */
2416676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2426676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_max */
2436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_min */
2446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	39718,	/* agc2_max */
2456676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	9930,	/* agc2_min */
2466676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt1 */
2476676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt2 */
2486676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt3 */
2496676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_slope1 */
2506676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_slope2 */
2516676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc2_pt1 */
2526676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	128,	/* agc2_pt2 */
2536676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	29,	/* agc2_slope1 */
2546676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	29,	/* agc2_slope2 */
2556676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2566676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	17,	/* alpha_mant */
2576676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	27,	/* alpha_exp */
2586676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	23,	/* beta_mant */
2596676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	51,	/* beta_exp */
2606676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2616676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* perform_agc_softsplit */
2626676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
2636676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2646676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth/* PLL Configuration for COFDM BW_MHz = 8.000000
2656676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * With external clock = 30.000000 */
266b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_bandwidth_config xc3028_bw_config = {
2676676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	60000,	/* internal */
2686676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	30000,	/* sampling */
2696676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* pll_cfg: prediv */
2706676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	8,	/* pll_cfg: ratio */
2716676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	3,	/* pll_cfg: range */
2726676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* pll_cfg: reset */
2736676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* pll_cfg: bypass */
2746676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: refdiv */
2756676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: bypclk_div */
2766676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* misc: IO_CLK_en_core */
2776676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* misc: ADClkSrc */
2786676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: modulo */
2796676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
2806676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
2816676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	20452225, /* timf */
2826676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	30000000  /* xtal_hz */
2836676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
2846676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2856676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Tothstatic struct dib7000p_config hauppauge_hvr1400_dib7000_config = {
2866676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.output_mpeg2_in_188_bytes = 1,
2876676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.hostbus_diversity = 1,
2886676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.tuner_is_baseband = 0,
2896676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.update_lna  = NULL,
2906676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2916676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc_config_count = 1,
2926676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc = &xc3028_agc_config,
2936676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.bw  = &xc3028_bw_config,
2946676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2956676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2966676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
2976676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
2986676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2996676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.pwm_freq_div = 0,
3006676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc_control  = NULL,
3016676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.spur_protect = 0,
3026676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3036676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.output_mode = OUTMODE_MPEG2_SERIAL,
3046676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
3056676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
306aef2d186e381816733fa15d67ad63bd99254cb9eSteven Tothstatic struct zl10353_config dvico_fusionhdtv_xc3028 = {
307aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.demod_address = 0x0f,
308aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.if2           = 45600,
309aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.no_tuner      = 1,
310aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth};
311aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
31296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
31396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin{
31496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	struct cx23885_tsport *port = fe->dvb->priv;
31596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	struct cx23885_dev *dev = port->dev;
31696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
31796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	if (voltage == SEC_VOLTAGE_18)
31896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		cx_write(MC417_RWD, 0x00001e00);/* GPIO-13 high */
31996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	else if (voltage == SEC_VOLTAGE_13)
32096318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		cx_write(MC417_RWD, 0x00001a00);/* GPIO-13 low */
32196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	else
32296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		cx_write(MC417_RWD, 0x00001800);/* GPIO-12 low */
32396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	return 0;
32496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin}
32596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
32696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic struct cx24116_config tbs_cx24116_config = {
32796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	.demod_address = 0x05,
32896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin};
32996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
330579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianinstatic struct cx24116_config tevii_cx24116_config = {
331579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin	.demod_address = 0x55,
332579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin};
333579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
334c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianinstatic struct cx24116_config dvbworld_cx24116_config = {
335c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin	.demod_address = 0x05,
336c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin};
337c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin
338d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_register(struct cx23885_tsport *port)
339d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
340d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
341f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky	struct cx23885_i2c *i2c_bus = NULL;
342363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
343363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
344f972e0bd9361594071d3e68e2342c53b51a1d42bDarron Broad	/* Get the first frontend */
34592abe9ee374599179033f039b095864a9cf74593Darron Broad	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
346363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (!fe0)
347363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		return -EINVAL;
348d19770e5178a4bc49641711246360c25781d20a4Steven Toth
349d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init struct videobuf_dvb */
350363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	fe0->dvb.name = dev->name;
351d19770e5178a4bc49641711246360c25781d20a4Steven Toth
352d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init frontend */
353d19770e5178a4bc49641711246360c25781d20a4Steven Toth	switch (dev->board) {
354a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1250:
355f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
356363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
35786184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth						&hauppauge_generic_config,
358f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
359363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
360363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(mt2131_attach, fe0->dvb.frontend,
361f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
36286184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth				   &hauppauge_generic_tunerconfig, 0);
363d19770e5178a4bc49641711246360c25781d20a4Steven Toth		}
364d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
3653ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1800:
3663ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		i2c_bus = &dev->i2c_bus[0];
36792abe9ee374599179033f039b095864a9cf74593Darron Broad		switch (alt_tuner) {
3683ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 1:
369363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend =
3703ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
3713ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_ezqam_config,
3723ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
373363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			if (fe0->dvb.frontend != NULL) {
374363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(tda829x_attach, fe0->dvb.frontend,
3753ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &dev->i2c_bus[1].i2c_adap, 0x42,
3764041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   &tda829x_no_probe);
377363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(tda18271_attach, fe0->dvb.frontend,
3784041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   0x60, &dev->i2c_bus[1].i2c_adap,
379f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky					   &hauppauge_tda18271_config);
3803ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			}
3813ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
3823ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 0:
3833ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		default:
384363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend =
3853ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
3863ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_config,
3873ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
388363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			if (fe0->dvb.frontend != NULL)
389363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(mt2131_attach, fe0->dvb.frontend,
3903ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap,
3913ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_tunerconfig, 0);
3923ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
3933ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		}
3943ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		break;
395fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
396f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
397363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
398fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth						&hauppauge_hvr1800lp_config,
399f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
400363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
401363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(mt2131_attach, fe0->dvb.frontend,
402f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
403fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth				   &hauppauge_generic_tunerconfig, 0);
404fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		}
405fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		break;
4069bc37caadffe8327683980b2323371691fa182e3Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
407f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
408363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
4099bc37caadffe8327683980b2323371691fa182e3Michael Krufky						&fusionhdtv_5_express,
410f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
411363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
412363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
413827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky				   &i2c_bus->i2c_adap, 0x61,
414827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky				   TUNER_LG_TDVS_H06XF);
4159bc37caadffe8327683980b2323371691fa182e3Michael Krufky		}
4169bc37caadffe8327683980b2323371691fa182e3Michael Krufky		break;
417d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
418d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		i2c_bus = &dev->i2c_bus[1];
419363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
420d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&hauppauge_hvr1500q_config,
421d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&dev->i2c_bus[0].i2c_adap);
422363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL)
423363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(xc5000_attach, fe0->dvb.frontend,
42430650961907368b1077cade35455fe931b14da6bMichael Krufky				   &i2c_bus->i2c_adap,
42530650961907368b1077cade35455fe931b14da6bMichael Krufky				   &hauppauge_hvr1500q_tunerconfig);
426d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		break;
42707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1500:
42807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		i2c_bus = &dev->i2c_bus[1];
429363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
43007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&hauppauge_hvr1500_config,
43107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&dev->i2c_bus[0].i2c_adap);
432363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
43307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct dvb_frontend *fe;
43407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct xc2028_config cfg = {
43507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_adap  = &i2c_bus->i2c_adap,
43607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_addr  = 0x61,
43707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
43807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			static struct xc2028_ctrl ctl = {
439ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
44007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.max_len     = 64,
44133e5316113b1a472f54579f014739e4a4a53d704Mauro Carvalho Chehab				.scode_table = XC3028_FE_OREN538,
44207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
44307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
44407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			fe = dvb_attach(xc2028_attach,
445363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth					fe0->dvb.frontend, &cfg);
44607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
44707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				fe->ops.tuner_ops.set_config(fe, &ctl);
44807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		}
44907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
450b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1200:
451a780a31cee55e01e7b479244e7907ba842c120a0Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1700:
452b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		i2c_bus = &dev->i2c_bus[0];
453363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(tda10048_attach,
454b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth			&hauppauge_hvr1200_config,
455b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth			&i2c_bus->i2c_adap);
456363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
457363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(tda829x_attach, fe0->dvb.frontend,
458b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&dev->i2c_bus[1].i2c_adap, 0x42,
459b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&tda829x_no_probe);
460363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(tda18271_attach, fe0->dvb.frontend,
461b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				0x60, &dev->i2c_bus[1].i2c_adap,
462b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&hauppauge_hvr1200_tuner_config);
463b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		}
464b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		break;
4656676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1400:
4666676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		i2c_bus = &dev->i2c_bus[0];
467363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(dib7000p_attach,
4686676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			&i2c_bus->i2c_adap,
4696676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			0x12, &hauppauge_hvr1400_dib7000_config);
470363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
4716676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			struct dvb_frontend *fe;
4726676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			struct xc2028_config cfg = {
4736676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
4746676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.i2c_addr  = 0x64,
4756676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			};
4766676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			static struct xc2028_ctrl ctl = {
477ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname   = XC3028L_DEFAULT_FIRMWARE,
4786676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.max_len = 64,
4796676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.demod   = 5000,
4809c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth				/* This is true for all demods with
4819c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth					v36 firmware? */
4820975fc68719c75cbe14132c6f0dead57cd4d5210Mauro Carvalho Chehab				.type    = XC2028_D2633,
4836676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			};
4846676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
4856676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			fe = dvb_attach(xc2028_attach,
486363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth					fe0->dvb.frontend, &cfg);
4876676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
4886676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
4896676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		}
4906676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		break;
491335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
492335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky		i2c_bus = &dev->i2c_bus[port->nr - 1];
493335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
494363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
495335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky						&dvico_s5h1409_config,
496335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky						&i2c_bus->i2c_adap);
497363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend == NULL)
498363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend = dvb_attach(s5h1411_attach,
49952b5045078b76ee86e210210601d45670eab22f1Michael Krufky							&dvico_s5h1411_config,
50052b5045078b76ee86e210210601d45670eab22f1Michael Krufky							&i2c_bus->i2c_adap);
501363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL)
502363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(xc5000_attach, fe0->dvb.frontend,
50330650961907368b1077cade35455fe931b14da6bMichael Krufky				   &i2c_bus->i2c_adap,
50430650961907368b1077cade35455fe931b14da6bMichael Krufky				   &dvico_xc5000_tunerconfig);
505335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky		break;
506aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: {
507aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		i2c_bus = &dev->i2c_bus[port->nr - 1];
508aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
509363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(zl10353_attach,
510aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					       &dvico_fusionhdtv_xc3028,
511aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					       &i2c_bus->i2c_adap);
512363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
513aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			struct dvb_frontend      *fe;
514aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			struct xc2028_config	  cfg = {
515aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.i2c_adap  = &i2c_bus->i2c_adap,
516aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.i2c_addr  = 0x61,
517aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			};
518aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			static struct xc2028_ctrl ctl = {
519ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
520aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.max_len     = 64,
521aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.demod       = XC3028_FE_ZARLINK456,
522aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			};
523aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
524363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
525aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					&cfg);
526aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
527aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
528aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		}
529aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		break;
530aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	}
5314c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
5329bb1b7e879091f09fc677dca10c5e132b68a9da3Igor M. Liplianin	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
5334c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		i2c_bus = &dev->i2c_bus[0];
5344c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth
535363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(zl10353_attach,
5364c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			&dvico_fusionhdtv_xc3028,
5374c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			&i2c_bus->i2c_adap);
538363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
5394c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			struct dvb_frontend      *fe;
5404c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			struct xc2028_config	  cfg = {
5414c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
5424c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.i2c_addr  = 0x61,
5434c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			};
5444c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			static struct xc2028_ctrl ctl = {
545ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
5464c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.max_len     = 64,
5474c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.demod       = XC3028_FE_ZARLINK456,
5484c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			};
5494c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth
550363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
5514c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				&cfg);
5524c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
5534c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
5544c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		}
5554c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		break;
55696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	case CX23885_BOARD_TBS_6920:
55796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		i2c_bus = &dev->i2c_bus[0];
55896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
55996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
56096318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin			&tbs_cx24116_config,
56196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin			&i2c_bus->i2c_adap);
56296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		if (fe0->dvb.frontend != NULL)
56396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin			fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage;
56496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
56596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		break;
566579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin	case CX23885_BOARD_TEVII_S470:
567579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
568579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
569579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
570579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin			&tevii_cx24116_config,
571579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin			&i2c_bus->i2c_adap);
572579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		if (fe0->dvb.frontend != NULL)
573579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin			fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage;
574579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
575579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		break;
576c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin	case CX23885_BOARD_DVBWORLD_2005:
577c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
578c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin
579c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
580c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin			&dvbworld_cx24116_config,
581c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin			&i2c_bus->i2c_adap);
582c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		break;
583d19770e5178a4bc49641711246360c25781d20a4Steven Toth	default:
5849c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_INFO "%s: The frontend of your DVB/ATSC card "
5859c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			" isn't supported yet\n",
586d19770e5178a4bc49641711246360c25781d20a4Steven Toth		       dev->name);
587d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
588d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
589363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (NULL == fe0->dvb.frontend) {
5909c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_ERR "%s: frontend initialization failed\n",
5919c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			dev->name);
592d19770e5178a4bc49641711246360c25781d20a4Steven Toth		return -1;
593d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
594d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufky	/* define general-purpose callback pointer */
595363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	fe0->dvb.frontend->callback = cx23885_tuner_callback;
596d19770e5178a4bc49641711246360c25781d20a4Steven Toth
597d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* Put the analog decoder in standby to keep it quiet */
598f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky	cx23885_call_i2c_clients(i2c_bus, TUNER_SET_STANDBY, NULL);
599d19770e5178a4bc49641711246360c25781d20a4Steven Toth
600363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (fe0->dvb.frontend->ops.analog_ops.standby)
601363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend);
6023ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
603d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* register everything */
604363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	return videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port,
60559b1842da1c6f33ad2e8da82d3dfb3445751d964Darron Broad		&dev->pci->dev, adapter_nr, 0);
606363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
607d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
608d19770e5178a4bc49641711246360c25781d20a4Steven Toth
609d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_register(struct cx23885_tsport *port)
610d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
611363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
612363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
613d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
614eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	int err, i;
615eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth
616eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	/* Here we need to allocate the correct number of frontends,
617eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * as reflected in the cards struct. The reality is that currrently
618eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * no cx23885 boards support this - yet. But, if we don't modify this
619eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * code then the second frontend would never be allocated (later)
620eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * and fail with error before the attach in dvb_register().
621eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * Without these changes we risk an OOPS later. The changes here
622eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * are for safety, and should provide a good foundation for the
623eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * future addition of any multi-frontend cx23885 based boards.
624eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 */
625eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
626eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		port->num_frontends);
627d19770e5178a4bc49641711246360c25781d20a4Steven Toth
628eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	for (i = 1; i <= port->num_frontends; i++) {
62996b7a1a838fb5b8746fc22f4ff3cef358bf59f35Darron Broad		if (videobuf_dvb_alloc_frontend(
6309c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			&port->frontends, i) == NULL) {
631eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			printk(KERN_ERR "%s() failed to alloc\n", __func__);
632eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			return -ENOMEM;
633eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		}
634eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth
635eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		fe0 = videobuf_dvb_get_frontend(&port->frontends, i);
636eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		if (!fe0)
637eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			err = -EINVAL;
638363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
639eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		dprintk(1, "%s\n", __func__);
6409c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		dprintk(1, " ->probed by Card=%d Name=%s, PCI %02x:%02x\n",
641eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->board,
642eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->name,
643eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->pci_bus,
644eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->pci_slot);
645d19770e5178a4bc49641711246360c25781d20a4Steven Toth
646eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		err = -ENODEV;
647d19770e5178a4bc49641711246360c25781d20a4Steven Toth
648eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		/* dvb stuff */
649eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		/* We have to init the queue for each frontend on a port. */
6509c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_INFO "%s: cx23885 based dvb card\n", dev->name);
6519c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		videobuf_queue_sg_init(&fe0->dvb.dvbq, &dvb_qops,
6529c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			    &dev->pci->dev, &port->slock,
65344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
65444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    sizeof(struct cx23885_buffer), port);
655eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	}
656d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = dvb_register(port);
657d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (err != 0)
6589c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_ERR "%s() dvb_register failed err = %d\n",
6599c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			__func__, err);
660d19770e5178a4bc49641711246360c25781d20a4Steven Toth
661d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return err;
662d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
663d19770e5178a4bc49641711246360c25781d20a4Steven Toth
664d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_unregister(struct cx23885_tsport *port)
665d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
666363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
667363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
668eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	/* FIXME: in an error condition where the we have
669eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * an expected number of frontends (attach problem)
670eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * then this might not clean up correctly, if 1
671eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * is invalid.
672eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * This comment only applies to future boards IF they
673eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * implement MFE support.
674eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 */
67592abe9ee374599179033f039b095864a9cf74593Darron Broad	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
6769c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	if (fe0->dvb.frontend)
677363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		videobuf_dvb_unregister_bus(&port->frontends);
678d19770e5178a4bc49641711246360c25781d20a4Steven Toth
679d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
680d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
68144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky
682