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
335a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "dvb_ca_en50221.h"
34d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "s5h1409.h"
3552b5045078b76ee86e210210601d45670eab22f1Michael Krufky#include "s5h1411.h"
36d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "mt2131.h"
373ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky#include "tda8290.h"
384041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky#include "tda18271.h"
399bc37caadffe8327683980b2323371691fa182e3Michael Krufky#include "lgdt330x.h"
400cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu#include "xc4000.h"
41d1987d55a1eda774dfbab240a432607c17241d07Steven Toth#include "xc5000.h"
42ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong#include "max2165.h"
43b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth#include "tda10048.h"
4407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky#include "tuner-xc2028.h"
45827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky#include "tuner-simple.h"
466676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dib7000p.h"
476676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dibx000_common.h"
48aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth#include "zl10353.h"
495a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "stv0900.h"
50f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin#include "stv0900_reg.h"
515a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "stv6110.h"
525a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "lnbh24.h"
5396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin#include "cx24116.h"
545a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "cimax2.h"
55493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong#include "lgs8gxx.h"
565a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "netup-eeprom.h"
575a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "netup-init.h"
58a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky#include "lgdt3305.h"
59ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong#include "atbm8830.h"
6009ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin#include "ds3000.h"
6109ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin#include "cx23885-f300.h"
6278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin#include "altera-ci.h"
6378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin#include "stv0367.h"
64722c90eb761195c09b776314f331341095273204Stefan Ringel#include "drxk.h"
65722c90eb761195c09b776314f331341095273204Stefan Ringel#include "mt2063.h"
66d19770e5178a4bc49641711246360c25781d20a4Steven Toth
674513fc696e273d64ea32f2366748aed810316eccSteven Tothstatic unsigned int debug;
68d19770e5178a4bc49641711246360c25781d20a4Steven Toth
694513fc696e273d64ea32f2366748aed810316eccSteven Toth#define dprintk(level, fmt, arg...)\
704513fc696e273d64ea32f2366748aed810316eccSteven Toth	do { if (debug >= level)\
714513fc696e273d64ea32f2366748aed810316eccSteven Toth		printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
724513fc696e273d64ea32f2366748aed810316eccSteven Toth	} while (0)
73d19770e5178a4bc49641711246360c25781d20a4Steven Toth
74d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* ------------------------------------------------------------------ */
75d19770e5178a4bc49641711246360c25781d20a4Steven Toth
763ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic unsigned int alt_tuner;
773ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkymodule_param(alt_tuner, int, 0644);
783ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael KrufkyMODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");
793ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
8078e92006f410a4044f8c1760c25ac9d11d259aa2Janne GrunauDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
8178e92006f410a4044f8c1760c25ac9d11d259aa2Janne Grunau
823ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky/* ------------------------------------------------------------------ */
833ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
84d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_buf_setup(struct videobuf_queue *q,
85d19770e5178a4bc49641711246360c25781d20a4Steven Toth			 unsigned int *count, unsigned int *size)
86d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
87d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
88d19770e5178a4bc49641711246360c25781d20a4Steven Toth
89d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_size  = 188 * 4;
90d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_count = 32;
91d19770e5178a4bc49641711246360c25781d20a4Steven Toth
92d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*size  = port->ts_packet_size * port->ts_packet_count;
93d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*count = 32;
94d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
95d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
96d19770e5178a4bc49641711246360c25781d20a4Steven Toth
9744a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic int dvb_buf_prepare(struct videobuf_queue *q,
9844a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			   struct videobuf_buffer *vb, enum v4l2_field field)
99d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
100d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
1019c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	return cx23885_buf_prepare(q, port, (struct cx23885_buffer *)vb, field);
102d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
103d19770e5178a4bc49641711246360c25781d20a4Steven Toth
104d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
105d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
106d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
1079c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	cx23885_buf_queue(port, (struct cx23885_buffer *)vb);
108d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
109d19770e5178a4bc49641711246360c25781d20a4Steven Toth
11044a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic void dvb_buf_release(struct videobuf_queue *q,
11144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    struct videobuf_buffer *vb)
112d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
1139c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	cx23885_free_buffer(q, (struct cx23885_buffer *)vb);
114d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
115d19770e5178a4bc49641711246360c25781d20a4Steven Toth
116a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehabstatic int cx23885_dvb_set_frontend(struct dvb_frontend *fe);
117a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab
11878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianinstatic void cx23885_dvb_gate_ctrl(struct cx23885_tsport  *port, int open)
11978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin{
12078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	struct videobuf_dvb_frontends *f;
12178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	struct videobuf_dvb_frontend *fe;
12278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
12378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	f = &port->frontends;
12478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
12578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (f->gate <= 1) /* undefined or fe0 */
12678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe = videobuf_dvb_get_frontend(f, 1);
12778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	else
12878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe = videobuf_dvb_get_frontend(f, f->gate);
12978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
13078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (fe && fe->dvb.frontend && fe->dvb.frontend->ops.i2c_gate_ctrl)
13178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe->dvb.frontend->ops.i2c_gate_ctrl(fe->dvb.frontend, open);
132a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab
133a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab	/*
134a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab	 * FIXME: Improve this path to avoid calling the
135a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab	 * cx23885_dvb_set_frontend() every time it passes here.
136a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab	 */
137a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab	cx23885_dvb_set_frontend(fe->dvb.frontend);
13878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin}
13978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
140d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic struct videobuf_queue_ops dvb_qops = {
141d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_setup    = dvb_buf_setup,
142d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_prepare  = dvb_buf_prepare,
143d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_queue    = dvb_buf_queue,
144d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_release  = dvb_buf_release,
145d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
146d19770e5178a4bc49641711246360c25781d20a4Steven Toth
14786184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct s5h1409_config hauppauge_generic_config = {
148d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.demod_address = 0x32 >> 1,
149d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
150fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.gpio          = S5H1409_GPIO_ON,
1512b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
152fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.inversion     = S5H1409_INVERSION_OFF,
153dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
154dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
155fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth};
156fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth
157b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda10048_config hauppauge_hvr1200_config = {
158b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.demod_address    = 0x10 >> 1,
159b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.output_mode      = TDA10048_SERIAL_OUTPUT,
160b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
161484d9e0577c12f9c66a7eab799858ad9617da4bfSteven Toth	.inversion        = TDA10048_INVERSION_ON,
1628816bef53cfaf21fcce47fe5fd403d2e39ba6d2dSteven Toth	.dtv6_if_freq_khz = TDA10048_IF_3300,
1638816bef53cfaf21fcce47fe5fd403d2e39ba6d2dSteven Toth	.dtv7_if_freq_khz = TDA10048_IF_3800,
1648816bef53cfaf21fcce47fe5fd403d2e39ba6d2dSteven Toth	.dtv8_if_freq_khz = TDA10048_IF_4300,
165484d9e0577c12f9c66a7eab799858ad9617da4bfSteven Toth	.clk_freq_khz     = TDA10048_CLK_16000,
166b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth};
167b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth
1686b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufkystatic struct tda10048_config hauppauge_hvr1210_config = {
1696b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.demod_address    = 0x10 >> 1,
1706b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.output_mode      = TDA10048_SERIAL_OUTPUT,
1716b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
1726b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.inversion        = TDA10048_INVERSION_ON,
173c27586e4d647c5c07c81e766d34ceef6ba5a316dMichael Krufky	.dtv6_if_freq_khz = TDA10048_IF_3300,
174c27586e4d647c5c07c81e766d34ceef6ba5a316dMichael Krufky	.dtv7_if_freq_khz = TDA10048_IF_3500,
175c27586e4d647c5c07c81e766d34ceef6ba5a316dMichael Krufky	.dtv8_if_freq_khz = TDA10048_IF_4000,
1766b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.clk_freq_khz     = TDA10048_CLK_16000,
1776b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky};
1786b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky
1793ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic struct s5h1409_config hauppauge_ezqam_config = {
1803ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.demod_address = 0x32 >> 1,
1813ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
1823ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
1833ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.qam_if        = 4000,
1843ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.inversion     = S5H1409_INVERSION_ON,
185dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
186dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
1873ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky};
1883ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
189fc959befe0f0e4647bb4e326e3ae55875401888aSteven Tothstatic struct s5h1409_config hauppauge_hvr1800lp_config = {
190fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.demod_address = 0x32 >> 1,
191fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
192d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.gpio          = S5H1409_GPIO_OFF,
1932b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
194fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
195dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
196dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
197d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
198d19770e5178a4bc49641711246360c25781d20a4Steven Toth
19907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic struct s5h1409_config hauppauge_hvr1500_config = {
20007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.demod_address = 0x32 >> 1,
20107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
20207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
20307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.inversion     = S5H1409_INVERSION_OFF,
204dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
205dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
20607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky};
20707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
20886184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct mt2131_config hauppauge_generic_tunerconfig = {
209a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	0x61
210a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth};
211a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth
2129bc37caadffe8327683980b2323371691fa182e3Michael Krufkystatic struct lgdt330x_config fusionhdtv_5_express = {
2139bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_address = 0x0e,
2149bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_chip = LGDT3303,
2159bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.serial_mpeg = 0x40,
2169bc37caadffe8327683980b2323371691fa182e3Michael Krufky};
2179bc37caadffe8327683980b2323371691fa182e3Michael Krufky
218d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct s5h1409_config hauppauge_hvr1500q_config = {
219d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.demod_address = 0x32 >> 1,
220d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
221d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.gpio          = S5H1409_GPIO_ON,
222d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.qam_if        = 44000,
223d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
224dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
225dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
226d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
227d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
228335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct s5h1409_config dvico_s5h1409_config = {
229335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.demod_address = 0x32 >> 1,
230335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
231335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.gpio          = S5H1409_GPIO_ON,
232335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.qam_if        = 44000,
233335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.inversion     = S5H1409_INVERSION_OFF,
234335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.status_mode   = S5H1409_DEMODLOCKING,
235335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
236335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky};
237335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
23852b5045078b76ee86e210210601d45670eab22f1Michael Krufkystatic struct s5h1411_config dvico_s5h1411_config = {
23952b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.output_mode   = S5H1411_SERIAL_OUTPUT,
24052b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.gpio          = S5H1411_GPIO_ON,
24152b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.qam_if        = S5H1411_IF_44000,
24252b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.vsb_if        = S5H1411_IF_44000,
24352b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.inversion     = S5H1411_INVERSION_OFF,
24452b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.status_mode   = S5H1411_DEMODLOCKING,
24552b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
24652b5045078b76ee86e210210601d45670eab22f1Michael Krufky};
24752b5045078b76ee86e210210601d45670eab22f1Michael Krufky
24819bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufkystatic struct s5h1411_config hcw_s5h1411_config = {
24919bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.output_mode   = S5H1411_SERIAL_OUTPUT,
25019bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.gpio          = S5H1411_GPIO_OFF,
25119bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.vsb_if        = S5H1411_IF_44000,
25219bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.qam_if        = S5H1411_IF_4000,
25319bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.inversion     = S5H1411_INVERSION_ON,
25419bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.status_mode   = S5H1411_DEMODLOCKING,
25519bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
25619bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky};
25719bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky
258d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
259e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.i2c_address      = 0x61,
260e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.if_khz           = 5380,
261d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
262d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
263335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct xc5000_config dvico_xc5000_tunerconfig = {
264335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.i2c_address      = 0x64,
265335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.if_khz           = 5380,
266335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky};
267335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
2684041f1a58774249f5f26163e68b844521ece1fb4Michael Krufkystatic struct tda829x_config tda829x_no_probe = {
2694041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky	.probe_tuner = TDA829X_DONT_PROBE,
2704041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky};
2714041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky
272f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_std_map hauppauge_tda18271_std_map = {
273c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky	.atsc_6   = { .if_freq = 5380, .agc_mode = 3, .std = 3,
274c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky		      .if_lvl = 6, .rfagc_top = 0x37 },
275c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
276c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky		      .if_lvl = 6, .rfagc_top = 0x37 },
277f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
278f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
279b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufkystatic struct tda18271_std_map hauppauge_hvr1200_tda18271_std_map = {
280b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.dvbt_6   = { .if_freq = 3300, .agc_mode = 3, .std = 4,
281b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky		      .if_lvl = 1, .rfagc_top = 0x37, },
282b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.dvbt_7   = { .if_freq = 3800, .agc_mode = 3, .std = 5,
283b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky		      .if_lvl = 1, .rfagc_top = 0x37, },
284b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.dvbt_8   = { .if_freq = 4300, .agc_mode = 3, .std = 6,
285b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky		      .if_lvl = 1, .rfagc_top = 0x37, },
286b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky};
287b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky
288f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_config hauppauge_tda18271_config = {
289f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.std_map = &hauppauge_tda18271_std_map,
290f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.gate    = TDA18271_GATE_ANALOG,
29104a68baa20d8faa0fb5f2924a1169280961be643Michael Krufky	.output_opt = TDA18271_OUTPUT_LT_OFF,
292f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
293f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
294b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda18271_config hauppauge_hvr1200_tuner_config = {
295b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.std_map = &hauppauge_hvr1200_tda18271_std_map,
296b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.gate    = TDA18271_GATE_ANALOG,
29704a68baa20d8faa0fb5f2924a1169280961be643Michael Krufky	.output_opt = TDA18271_OUTPUT_LT_OFF,
298b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth};
299b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth
3006b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufkystatic struct tda18271_config hauppauge_hvr1210_tuner_config = {
3016b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.gate    = TDA18271_GATE_DIGITAL,
30204a68baa20d8faa0fb5f2924a1169280961be643Michael Krufky	.output_opt = TDA18271_OUTPUT_LT_OFF,
3036b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky};
3046b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky
305247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufkystatic struct tda18271_std_map hauppauge_hvr127x_std_map = {
306a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
307a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		      .if_lvl = 1, .rfagc_top = 0x58 },
308a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
309a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		      .if_lvl = 1, .rfagc_top = 0x58 },
310a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky};
311a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky
312247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufkystatic struct tda18271_config hauppauge_hvr127x_config = {
313247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufky	.std_map = &hauppauge_hvr127x_std_map,
31404a68baa20d8faa0fb5f2924a1169280961be643Michael Krufky	.output_opt = TDA18271_OUTPUT_LT_OFF,
315a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky};
316a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky
317247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufkystatic struct lgdt3305_config hauppauge_lgdt3305_config = {
318a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.i2c_addr           = 0x0e,
319a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.mpeg_mode          = LGDT3305_MPEG_SERIAL,
320a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
321a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
322a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.deny_i2c_rptr      = 1,
323a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.spectral_inversion = 1,
324a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.qam_if_khz         = 4000,
325a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.vsb_if_khz         = 3250,
326a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky};
327a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky
328b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_agc_config xc3028_agc_config = {
3296676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	BAND_VHF | BAND_UHF,	/* band_caps */
3306676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3316676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
3326676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
3336676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0,
3346676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_nb_est=2, P_agc_write=0
3356676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 */
3366676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
3376676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		(3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
3386676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3396676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	712,	/* inv_gain */
3406676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	21,	/* time_stabiliz */
3416676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3426676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* alpha_level */
3436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	118,	/* thlock */
3446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3456676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* wbd_inv */
3466676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	2867,	/* wbd_ref */
3476676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* wbd_sel */
3486676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	2,	/* wbd_alpha */
3496676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3506676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_max */
3516676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_min */
3526676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	39718,	/* agc2_max */
3536676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	9930,	/* agc2_min */
3546676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt1 */
3556676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt2 */
3566676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt3 */
3576676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_slope1 */
3586676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_slope2 */
3596676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc2_pt1 */
3606676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	128,	/* agc2_pt2 */
3616676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	29,	/* agc2_slope1 */
3626676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	29,	/* agc2_slope2 */
3636676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3646676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	17,	/* alpha_mant */
3656676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	27,	/* alpha_exp */
3666676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	23,	/* beta_mant */
3676676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	51,	/* beta_exp */
3686676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3696676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* perform_agc_softsplit */
3706676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
3716676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3726676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth/* PLL Configuration for COFDM BW_MHz = 8.000000
3736676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * With external clock = 30.000000 */
374b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_bandwidth_config xc3028_bw_config = {
3756676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	60000,	/* internal */
3766676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	30000,	/* sampling */
3776676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* pll_cfg: prediv */
3786676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	8,	/* pll_cfg: ratio */
3796676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	3,	/* pll_cfg: range */
3806676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* pll_cfg: reset */
3816676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* pll_cfg: bypass */
3826676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: refdiv */
3836676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: bypclk_div */
3846676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* misc: IO_CLK_en_core */
3856676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* misc: ADClkSrc */
3866676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: modulo */
3876676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
3886676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
3896676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	20452225, /* timf */
3906676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	30000000  /* xtal_hz */
3916676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
3926676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3936676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Tothstatic struct dib7000p_config hauppauge_hvr1400_dib7000_config = {
3946676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.output_mpeg2_in_188_bytes = 1,
3956676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.hostbus_diversity = 1,
3966676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.tuner_is_baseband = 0,
3976676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.update_lna  = NULL,
3986676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3996676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc_config_count = 1,
4006676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc = &xc3028_agc_config,
4016676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.bw  = &xc3028_bw_config,
4026676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
4036676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
4046676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
4056676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
4066676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
4076676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.pwm_freq_div = 0,
4086676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc_control  = NULL,
4096676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.spur_protect = 0,
4106676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
4116676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.output_mode = OUTMODE_MPEG2_SERIAL,
4126676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
4136676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
414aef2d186e381816733fa15d67ad63bd99254cb9eSteven Tothstatic struct zl10353_config dvico_fusionhdtv_xc3028 = {
415aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.demod_address = 0x0f,
416aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.if2           = 45600,
417aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.no_tuner      = 1,
418d4dc673da9a94716ca2410306c1b36b5faf6c4ccChristopher Pascoe	.disable_i2c_gate_ctrl = 1,
419aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth};
420aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
421f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianinstatic struct stv0900_reg stv0900_ts_regs[] = {
422f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_TSGENERAL, 0x00 },
423f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSSPEED, 0x40 },
424f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSSPEED, 0x40 },
425f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSCFGM, 0xc0 },
426f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSCFGM, 0xc0 },
427f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSCFGH, 0xe0 },
428f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSCFGH, 0xe0 },
429f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSCFGL, 0x20 },
430f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSCFGL, 0x20 },
431f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ 0xffff, 0xff }, /* terminate */
432f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin};
433f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin
4345a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianinstatic struct stv0900_config netup_stv0900_config = {
4355a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.demod_address = 0x68,
43629372a8daec4c1dca83e294006488b1d47dd965cIgor M. Liplianin	.demod_mode = 1, /* dual */
437644c7ef0b9a9c4f4dec4a44249b7047452654722Abylay Ospan	.xtal = 8000000,
4385a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
4395a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.diseqc_mode = 2,/* 2/3 PWM */
440f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	.ts_config_regs = stv0900_ts_regs,
4415a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun1_maddress = 0,/* 0x60 */
4425a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun2_maddress = 3,/* 0x63 */
4435a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun1_adc = 1,/* 1 Vpp */
4445a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun2_adc = 1,/* 1 Vpp */
4455a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin};
4465a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
4475a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianinstatic struct stv6110_config netup_stv6110_tunerconfig_a = {
4485a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.i2c_address = 0x60,
449644c7ef0b9a9c4f4dec4a44249b7047452654722Abylay Ospan	.mclk = 16000000,
450644c7ef0b9a9c4f4dec4a44249b7047452654722Abylay Ospan	.clk_div = 1,
451873688cd30294412e185ba39f8487e3eed0f692dAbylay Ospan	.gain = 8, /* +16 dB  - maximum gain */
4525a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin};
4535a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
4545a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianinstatic struct stv6110_config netup_stv6110_tunerconfig_b = {
4555a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.i2c_address = 0x63,
456644c7ef0b9a9c4f4dec4a44249b7047452654722Abylay Ospan	.mclk = 16000000,
457644c7ef0b9a9c4f4dec4a44249b7047452654722Abylay Ospan	.clk_div = 1,
458873688cd30294412e185ba39f8487e3eed0f692dAbylay Ospan	.gain = 8, /* +16 dB  - maximum gain */
4595a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin};
4605a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
46196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic struct cx24116_config tbs_cx24116_config = {
46209ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin	.demod_address = 0x55,
46396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin};
46496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
46509ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianinstatic struct ds3000_config tevii_ds3000_config = {
46609ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin	.demod_address = 0x68,
467579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin};
468579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
469c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianinstatic struct cx24116_config dvbworld_cx24116_config = {
470c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin	.demod_address = 0x05,
471c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin};
472c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin
473493b7127aa56d0a5c041797639bf543d96f6261bDavid Wongstatic struct lgs8gxx_config mygica_x8506_lgs8gl5_config = {
474493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.prod = LGS8GXX_PROD_LGS8GL5,
475493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.demod_address = 0x19,
476493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.serial_ts = 0,
477493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.ts_clk_pol = 1,
478493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.ts_clk_gated = 1,
479493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_clk_freq = 30400, /* 30.4 MHz */
480493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_freq = 5380, /* 5.38 MHz */
481493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_neg_center = 1,
482493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.ext_adc = 0,
483493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.adc_signed = 0,
484493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_neg_edge = 0,
485493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong};
486493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong
487493b7127aa56d0a5c041797639bf543d96f6261bDavid Wongstatic struct xc5000_config mygica_x8506_xc5000_config = {
488493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.i2c_address = 0x61,
489493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_khz = 5380,
490493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong};
491493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong
492a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehabstatic int cx23885_dvb_set_frontend(struct dvb_frontend *fe)
493f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky{
494a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
495f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	struct cx23885_tsport *port = fe->dvb->priv;
496f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	struct cx23885_dev *dev = port->dev;
497f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky
498f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	switch (dev->board) {
499f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1275:
500a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab		switch (p->modulation) {
501f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		case VSB_8:
502f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			cx23885_gpio_clear(dev, GPIO_5);
503f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			break;
504f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		case QAM_64:
505f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		case QAM_256:
506f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		default:
507f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			cx23885_gpio_set(dev, GPIO_5);
508f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			break;
509f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		}
510f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		break;
5116f0d8c020ecff4acb959627109d3b81ded211b70David T.L. Wong	case CX23885_BOARD_MYGICA_X8506:
5126f0d8c020ecff4acb959627109d3b81ded211b70David T.L. Wong	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
5136f0d8c020ecff4acb959627109d3b81ded211b70David T.L. Wong		/* Select Digital TV */
5146f0d8c020ecff4acb959627109d3b81ded211b70David T.L. Wong		cx23885_gpio_set(dev, GPIO_0);
5156f0d8c020ecff4acb959627109d3b81ded211b70David T.L. Wong		break;
516f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	}
5175bdd39621eb139630683b52c8e71202a2cc08291Michael Krufky	return 0;
518f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky}
519f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky
5202365b2d307ee0323062c674ea0495584085e8c24David Wongstatic struct lgs8gxx_config magicpro_prohdtve2_lgs8g75_config = {
5212365b2d307ee0323062c674ea0495584085e8c24David Wong	.prod = LGS8GXX_PROD_LGS8G75,
5222365b2d307ee0323062c674ea0495584085e8c24David Wong	.demod_address = 0x19,
5232365b2d307ee0323062c674ea0495584085e8c24David Wong	.serial_ts = 0,
5242365b2d307ee0323062c674ea0495584085e8c24David Wong	.ts_clk_pol = 1,
5252365b2d307ee0323062c674ea0495584085e8c24David Wong	.ts_clk_gated = 1,
5262365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_clk_freq = 30400, /* 30.4 MHz */
5272365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_freq = 6500, /* 6.50 MHz */
5282365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_neg_center = 1,
5292365b2d307ee0323062c674ea0495584085e8c24David Wong	.ext_adc = 0,
5302365b2d307ee0323062c674ea0495584085e8c24David Wong	.adc_signed = 1,
5312365b2d307ee0323062c674ea0495584085e8c24David Wong	.adc_vpp = 2, /* 1.6 Vpp */
5322365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_neg_edge = 1,
5332365b2d307ee0323062c674ea0495584085e8c24David Wong};
5342365b2d307ee0323062c674ea0495584085e8c24David Wong
5352365b2d307ee0323062c674ea0495584085e8c24David Wongstatic struct xc5000_config magicpro_prohdtve2_xc5000_config = {
5362365b2d307ee0323062c674ea0495584085e8c24David Wong	.i2c_address = 0x61,
5372365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_khz = 6500,
5382365b2d307ee0323062c674ea0495584085e8c24David Wong};
5392365b2d307ee0323062c674ea0495584085e8c24David Wong
540ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wongstatic struct atbm8830_config mygica_x8558pro_atbm8830_cfg1 = {
541ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.prod = ATBM8830_PROD_8830,
542ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.demod_address = 0x44,
543ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.serial_ts = 0,
544ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.ts_sampling_edge = 1,
545ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.ts_clk_gated = 0,
546ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.osc_clk_freq = 30400, /* in kHz */
547ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.if_freq = 0, /* zero IF */
548ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.zif_swap_iq = 1,
549c245c75c41b9693bcbd6c95e25af324188b4dce1David Wong	.agc_min = 0x2E,
550c245c75c41b9693bcbd6c95e25af324188b4dce1David Wong	.agc_max = 0xFF,
551c245c75c41b9693bcbd6c95e25af324188b4dce1David Wong	.agc_hold_loop = 0,
552ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong};
553ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong
554ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wongstatic struct max2165_config mygic_x8558pro_max2165_cfg1 = {
555ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.i2c_address = 0x60,
556ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.osc_clk = 20
557ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong};
558ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong
559ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wongstatic struct atbm8830_config mygica_x8558pro_atbm8830_cfg2 = {
560ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.prod = ATBM8830_PROD_8830,
561ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.demod_address = 0x44,
562ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.serial_ts = 1,
563ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.ts_sampling_edge = 1,
564ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.ts_clk_gated = 0,
565ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.osc_clk_freq = 30400, /* in kHz */
566ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.if_freq = 0, /* zero IF */
567ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.zif_swap_iq = 1,
568c245c75c41b9693bcbd6c95e25af324188b4dce1David Wong	.agc_min = 0x2E,
569c245c75c41b9693bcbd6c95e25af324188b4dce1David Wong	.agc_max = 0xFF,
570c245c75c41b9693bcbd6c95e25af324188b4dce1David Wong	.agc_hold_loop = 0,
571ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong};
572ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong
573ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wongstatic struct max2165_config mygic_x8558pro_max2165_cfg2 = {
574ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.i2c_address = 0x60,
575ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	.osc_clk = 20
576ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong};
57778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianinstatic struct stv0367_config netup_stv0367_config[] = {
57878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	{
57978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.demod_address = 0x1c,
58078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.xtal = 27000000,
58178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.if_khz = 4500,
58278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.if_iq_mode = 0,
58378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.ts_mode = 1,
58478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.clk_pol = 0,
58578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	}, {
58678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.demod_address = 0x1d,
58778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.xtal = 27000000,
58878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.if_khz = 4500,
58978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.if_iq_mode = 0,
59078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.ts_mode = 1,
59178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.clk_pol = 0,
59278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	},
59378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin};
59478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
59578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianinstatic struct xc5000_config netup_xc5000_config[] = {
59678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	{
59778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.i2c_address = 0x61,
59878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.if_khz = 4500,
59978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	}, {
60078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.i2c_address = 0x64,
60178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		.if_khz = 4500,
60278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	},
60378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin};
60478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
605722c90eb761195c09b776314f331341095273204Stefan Ringelstatic struct drxk_config terratec_drxk_config[] = {
606722c90eb761195c09b776314f331341095273204Stefan Ringel	{
607722c90eb761195c09b776314f331341095273204Stefan Ringel		.adr = 0x29,
608722c90eb761195c09b776314f331341095273204Stefan Ringel		.no_i2c_bridge = 1,
609722c90eb761195c09b776314f331341095273204Stefan Ringel	}, {
610722c90eb761195c09b776314f331341095273204Stefan Ringel		.adr = 0x2a,
611722c90eb761195c09b776314f331341095273204Stefan Ringel		.no_i2c_bridge = 1,
612722c90eb761195c09b776314f331341095273204Stefan Ringel	},
613722c90eb761195c09b776314f331341095273204Stefan Ringel};
614722c90eb761195c09b776314f331341095273204Stefan Ringel
615722c90eb761195c09b776314f331341095273204Stefan Ringelstatic struct mt2063_config terratec_mt2063_config[] = {
616722c90eb761195c09b776314f331341095273204Stefan Ringel	{
617722c90eb761195c09b776314f331341095273204Stefan Ringel		.tuner_address = 0x60,
618722c90eb761195c09b776314f331341095273204Stefan Ringel	}, {
619722c90eb761195c09b776314f331341095273204Stefan Ringel		.tuner_address = 0x67,
620722c90eb761195c09b776314f331341095273204Stefan Ringel	},
621722c90eb761195c09b776314f331341095273204Stefan Ringel};
622722c90eb761195c09b776314f331341095273204Stefan Ringel
62378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianinint netup_altera_fpga_rw(void *device, int flag, int data, int read)
62478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin{
62578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	struct cx23885_dev *dev = (struct cx23885_dev *)device;
62678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	unsigned long timeout = jiffies + msecs_to_jiffies(1);
627d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan	uint32_t mem = 0;
62878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
629d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan	mem = cx_read(MC417_RWD);
63078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (read)
63178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		cx_set(MC417_OEN, ALT_DATA);
63278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	else {
63378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		cx_clear(MC417_OEN, ALT_DATA);/* D0-D7 out */
63478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		mem &= ~ALT_DATA;
63578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		mem |= (data & ALT_DATA);
63678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	}
63778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
63878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (flag)
639d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan		mem |= ALT_AD_RG;
64078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	else
641d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan		mem &= ~ALT_AD_RG;
64278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
643d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan	mem &= ~ALT_CS;
64478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (read)
645d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan		mem = (mem & ~ALT_RD) | ALT_WR;
64678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	else
647d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan		mem = (mem & ~ALT_WR) | ALT_RD;
648d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan
649d164460f897e2ae8c48ca28c763bb1233d180e7eAbylay Ospan	cx_write(MC417_RWD, mem);  /* start RW cycle */
65078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
65178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	for (;;) {
65278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		mem = cx_read(MC417_RWD);
65378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		if ((mem & ALT_RDY) == 0)
65478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			break;
65578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		if (time_after(jiffies, timeout))
65678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			break;
65778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		udelay(1);
65878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	}
65978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
66078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	cx_set(MC417_RWD, ALT_RD | ALT_WR | ALT_CS);
66178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (read)
66278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		return mem & ALT_DATA;
66378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
66478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	return 0;
66578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin};
666ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong
667d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_register(struct cx23885_tsport *port)
668d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
669d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
670493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	struct cx23885_i2c *i2c_bus = NULL, *i2c_bus2 = NULL;
67178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
67278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	int mfe_shared = 0; /* bus not shared by default */
6735a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	int ret;
674363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
675f972e0bd9361594071d3e68e2342c53b51a1d42bDarron Broad	/* Get the first frontend */
67692abe9ee374599179033f039b095864a9cf74593Darron Broad	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
677363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (!fe0)
678363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		return -EINVAL;
679d19770e5178a4bc49641711246360c25781d20a4Steven Toth
680d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init struct videobuf_dvb */
681363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	fe0->dvb.name = dev->name;
682d19770e5178a4bc49641711246360c25781d20a4Steven Toth
68378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	/* multi-frontend gate control is undefined or defaults to fe0 */
68478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	port->frontends.gate = 0;
68578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
68678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	/* Sets the gate control callback to be used by i2c command calls */
68778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	port->gate_ctrl = cx23885_dvb_gate_ctrl;
68878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
689d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init frontend */
690d19770e5178a4bc49641711246360c25781d20a4Steven Toth	switch (dev->board) {
691a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1250:
692f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
693363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
69486184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth						&hauppauge_generic_config,
695f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
696363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
697363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(mt2131_attach, fe0->dvb.frontend,
698f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
69986184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth				   &hauppauge_generic_tunerconfig, 0);
700d19770e5178a4bc49641711246360c25781d20a4Steven Toth		}
701d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
702a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1270:
703d099becb0bd7ee01a13d58371b4ea5a2f7052c04Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1275:
704a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		i2c_bus = &dev->i2c_bus[0];
705a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
706247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufky					       &hauppauge_lgdt3305_config,
707a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky					       &i2c_bus->i2c_adap);
708a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		if (fe0->dvb.frontend != NULL) {
709a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky			dvb_attach(tda18271_attach, fe0->dvb.frontend,
710a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky				   0x60, &dev->i2c_bus[1].i2c_adap,
711247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufky				   &hauppauge_hvr127x_config);
712a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		}
713a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		break;
71419bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1255:
71519bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		i2c_bus = &dev->i2c_bus[0];
71619bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
71719bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky					       &hcw_s5h1411_config,
71819bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky					       &i2c_bus->i2c_adap);
71919bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		if (fe0->dvb.frontend != NULL) {
72019bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky			dvb_attach(tda18271_attach, fe0->dvb.frontend,
72119bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky				   0x60, &dev->i2c_bus[1].i2c_adap,
72219bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky				   &hauppauge_tda18271_config);
72319bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		}
72419bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		break;
7253ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1800:
7263ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		i2c_bus = &dev->i2c_bus[0];
72792abe9ee374599179033f039b095864a9cf74593Darron Broad		switch (alt_tuner) {
7283ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 1:
729363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend =
7303ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
7313ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_ezqam_config,
7323ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
733363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			if (fe0->dvb.frontend != NULL) {
734363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(tda829x_attach, fe0->dvb.frontend,
7353ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &dev->i2c_bus[1].i2c_adap, 0x42,
7364041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   &tda829x_no_probe);
737363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(tda18271_attach, fe0->dvb.frontend,
7384041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   0x60, &dev->i2c_bus[1].i2c_adap,
739f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky					   &hauppauge_tda18271_config);
7403ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			}
7413ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
7423ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 0:
7433ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		default:
744363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend =
7453ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
7463ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_config,
7473ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
748363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			if (fe0->dvb.frontend != NULL)
749363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(mt2131_attach, fe0->dvb.frontend,
7503ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap,
7513ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_tunerconfig, 0);
7523ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
7533ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		}
7543ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		break;
755fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
756f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
757363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
758fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth						&hauppauge_hvr1800lp_config,
759f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
760363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
761363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(mt2131_attach, fe0->dvb.frontend,
762f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
763fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth				   &hauppauge_generic_tunerconfig, 0);
764fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		}
765fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		break;
7669bc37caadffe8327683980b2323371691fa182e3Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
767f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
768363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
7699bc37caadffe8327683980b2323371691fa182e3Michael Krufky						&fusionhdtv_5_express,
770f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
771363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
772363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
773827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky				   &i2c_bus->i2c_adap, 0x61,
774827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky				   TUNER_LG_TDVS_H06XF);
7759bc37caadffe8327683980b2323371691fa182e3Michael Krufky		}
7769bc37caadffe8327683980b2323371691fa182e3Michael Krufky		break;
777d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
778d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		i2c_bus = &dev->i2c_bus[1];
779363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
780d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&hauppauge_hvr1500q_config,
781d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&dev->i2c_bus[0].i2c_adap);
782363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL)
783363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(xc5000_attach, fe0->dvb.frontend,
78430650961907368b1077cade35455fe931b14da6bMichael Krufky				   &i2c_bus->i2c_adap,
78530650961907368b1077cade35455fe931b14da6bMichael Krufky				   &hauppauge_hvr1500q_tunerconfig);
786d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		break;
78707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1500:
78807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		i2c_bus = &dev->i2c_bus[1];
789363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
79007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&hauppauge_hvr1500_config,
79107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&dev->i2c_bus[0].i2c_adap);
792363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
79307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct dvb_frontend *fe;
79407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct xc2028_config cfg = {
79507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_adap  = &i2c_bus->i2c_adap,
79607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_addr  = 0x61,
79707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
79807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			static struct xc2028_ctrl ctl = {
799ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
80007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.max_len     = 64,
80152c3d29cfa2fa02f525a01abf28abf48f49801bfSteven Toth				.demod       = XC3028_FE_OREN538,
80207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
80307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
80407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			fe = dvb_attach(xc2028_attach,
805363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth					fe0->dvb.frontend, &cfg);
80607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
80707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				fe->ops.tuner_ops.set_config(fe, &ctl);
80807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		}
80907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
810b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1200:
811a780a31cee55e01e7b479244e7907ba842c120a0Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1700:
812b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		i2c_bus = &dev->i2c_bus[0];
813363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(tda10048_attach,
814b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth			&hauppauge_hvr1200_config,
815b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth			&i2c_bus->i2c_adap);
816363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
817363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(tda829x_attach, fe0->dvb.frontend,
818b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&dev->i2c_bus[1].i2c_adap, 0x42,
819b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&tda829x_no_probe);
820363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(tda18271_attach, fe0->dvb.frontend,
821b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				0x60, &dev->i2c_bus[1].i2c_adap,
822b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&hauppauge_hvr1200_tuner_config);
8236b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		}
8246b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		break;
8256b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1210:
8266b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		i2c_bus = &dev->i2c_bus[0];
8276b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		fe0->dvb.frontend = dvb_attach(tda10048_attach,
8286b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky			&hauppauge_hvr1210_config,
8296b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky			&i2c_bus->i2c_adap);
8306b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		if (fe0->dvb.frontend != NULL) {
8316b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky			dvb_attach(tda18271_attach, fe0->dvb.frontend,
8326b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky				0x60, &dev->i2c_bus[1].i2c_adap,
8336b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky				&hauppauge_hvr1210_tuner_config);
834b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		}
835b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		break;
8366676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1400:
8376676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		i2c_bus = &dev->i2c_bus[0];
838363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(dib7000p_attach,
8396676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			&i2c_bus->i2c_adap,
8406676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			0x12, &hauppauge_hvr1400_dib7000_config);
841363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
8426676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			struct dvb_frontend *fe;
8436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			struct xc2028_config cfg = {
8446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
8456676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.i2c_addr  = 0x64,
8466676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			};
8476676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			static struct xc2028_ctrl ctl = {
848ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname   = XC3028L_DEFAULT_FIRMWARE,
8496676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.max_len = 64,
8509bed77ee2fb46b74782d0d9d14b92e9d07f3df6eMauro Carvalho Chehab				.demod   = XC3028_FE_DIBCOM52,
8519c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth				/* This is true for all demods with
8529c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth					v36 firmware? */
8530975fc68719c75cbe14132c6f0dead57cd4d5210Mauro Carvalho Chehab				.type    = XC2028_D2633,
8546676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			};
8556676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
8566676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			fe = dvb_attach(xc2028_attach,
857363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth					fe0->dvb.frontend, &cfg);
8586676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
8596676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
8606676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		}
8616676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		break;
862335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
863335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky		i2c_bus = &dev->i2c_bus[port->nr - 1];
864335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
865363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
866335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky						&dvico_s5h1409_config,
867335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky						&i2c_bus->i2c_adap);
868363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend == NULL)
869363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend = dvb_attach(s5h1411_attach,
87052b5045078b76ee86e210210601d45670eab22f1Michael Krufky							&dvico_s5h1411_config,
87152b5045078b76ee86e210210601d45670eab22f1Michael Krufky							&i2c_bus->i2c_adap);
872363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL)
873363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(xc5000_attach, fe0->dvb.frontend,
87430650961907368b1077cade35455fe931b14da6bMichael Krufky				   &i2c_bus->i2c_adap,
87530650961907368b1077cade35455fe931b14da6bMichael Krufky				   &dvico_xc5000_tunerconfig);
876335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky		break;
877aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: {
878aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		i2c_bus = &dev->i2c_bus[port->nr - 1];
879aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
880363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(zl10353_attach,
881aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					       &dvico_fusionhdtv_xc3028,
882aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					       &i2c_bus->i2c_adap);
883363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
884aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			struct dvb_frontend      *fe;
885aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			struct xc2028_config	  cfg = {
886aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.i2c_adap  = &i2c_bus->i2c_adap,
887aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.i2c_addr  = 0x61,
888aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			};
889aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			static struct xc2028_ctrl ctl = {
890ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
891aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.max_len     = 64,
892aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.demod       = XC3028_FE_ZARLINK456,
893aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			};
894aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
895363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
896aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					&cfg);
897aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
898aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
899aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		}
900aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		break;
901aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	}
9024c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
9039bb1b7e879091f09fc677dca10c5e132b68a9da3Igor M. Liplianin	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
90434e383dd13edf402e87bf0a87f4a19b193b4bd7aVladimir Geroy	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
9054c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		i2c_bus = &dev->i2c_bus[0];
9064c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth
907363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(zl10353_attach,
9084c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			&dvico_fusionhdtv_xc3028,
9094c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			&i2c_bus->i2c_adap);
910363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
9114c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			struct dvb_frontend      *fe;
9124c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			struct xc2028_config	  cfg = {
9134c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
9144c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.i2c_addr  = 0x61,
9154c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			};
9164c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			static struct xc2028_ctrl ctl = {
917ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
9184c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.max_len     = 64,
9194c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.demod       = XC3028_FE_ZARLINK456,
9204c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			};
9214c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth
922363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
9234c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				&cfg);
9244c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
9254c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
9264c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		}
9274c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		break;
9280cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
9290cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu		i2c_bus = &dev->i2c_bus[0];
9300cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu
9310cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu		fe0->dvb.frontend = dvb_attach(zl10353_attach,
9320cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu					       &dvico_fusionhdtv_xc3028,
9330cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu					       &i2c_bus->i2c_adap);
9340cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu		if (fe0->dvb.frontend != NULL) {
9350cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu			struct dvb_frontend	*fe;
9360cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu			struct xc4000_config	cfg = {
9370cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu				.i2c_address	  = 0x61,
9380cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu				.default_pm	  = 0,
9390cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu				.dvb_amplitude	  = 134,
9400cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu				.set_smoothedcvbs = 1,
9410cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu				.if_khz		  = 4560
9420cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu			};
9430cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu
9440cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu			fe = dvb_attach(xc4000_attach, fe0->dvb.frontend,
9450cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu					&dev->i2c_bus[1].i2c_adap, &cfg);
946a7c8aadad39428b64d26c3971d967f8314e2397dMiroslav Slugen			if (!fe) {
947a7c8aadad39428b64d26c3971d967f8314e2397dMiroslav Slugen				printk(KERN_ERR "%s/2: xc4000 attach failed\n",
948a7c8aadad39428b64d26c3971d967f8314e2397dMiroslav Slugen				       dev->name);
949a7c8aadad39428b64d26c3971d967f8314e2397dMiroslav Slugen				goto frontend_detach;
950a7c8aadad39428b64d26c3971d967f8314e2397dMiroslav Slugen			}
9510cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu		}
9520cf8af57f1865148efcb40a43ddd04d5a709820eistvan_v@mailbox.hu		break;
95396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	case CX23885_BOARD_TBS_6920:
95409ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
95596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
95696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
95709ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin					&tbs_cx24116_config,
95809ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin					&i2c_bus->i2c_adap);
95996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		if (fe0->dvb.frontend != NULL)
96009ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin			fe0->dvb.frontend->ops.set_voltage = f300_set_voltage;
96196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
96296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		break;
963579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin	case CX23885_BOARD_TEVII_S470:
964579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
965579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
96609ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin		fe0->dvb.frontend = dvb_attach(ds3000_attach,
96709ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin					&tevii_ds3000_config,
96809ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin					&i2c_bus->i2c_adap);
969579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		if (fe0->dvb.frontend != NULL)
97009ea33e5c696958e8b1ae6d5ab184476b16592f1Igor M. Liplianin			fe0->dvb.frontend->ops.set_voltage = f300_set_voltage;
971579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
972579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		break;
973c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin	case CX23885_BOARD_DVBWORLD_2005:
974c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
975c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin
976c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
977c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin			&dvbworld_cx24116_config,
978c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin			&i2c_bus->i2c_adap);
979c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		break;
9805a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
9815a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		i2c_bus = &dev->i2c_bus[0];
9825a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		switch (port->nr) {
9835a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		/* port B */
9845a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		case 1:
9855a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			fe0->dvb.frontend = dvb_attach(stv0900_attach,
9865a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&netup_stv0900_config,
9875a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap, 0);
9885a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			if (fe0->dvb.frontend != NULL) {
9895a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				if (dvb_attach(stv6110_attach,
9905a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						fe0->dvb.frontend,
9915a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&netup_stv6110_tunerconfig_a,
9925a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&i2c_bus->i2c_adap)) {
9935a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin					if (!dvb_attach(lnbh24_attach,
9945a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							fe0->dvb.frontend,
9955a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap,
9969329fb5b731cd535a7c7d0690d30e872f29a33d3Abylay Ospan							LNBH24_PCL | LNBH24_TTX,
9979329fb5b731cd535a7c7d0690d30e872f29a33d3Abylay Ospan							LNBH24_TEN, 0x09))
9985a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						printk(KERN_ERR
9995a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							"No LNBH24 found!\n");
10005a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
10015a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				}
10025a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			}
10035a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			break;
10045a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		/* port C */
10055a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		case 2:
10065a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			fe0->dvb.frontend = dvb_attach(stv0900_attach,
10075a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&netup_stv0900_config,
10085a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap, 1);
10095a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			if (fe0->dvb.frontend != NULL) {
10105a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				if (dvb_attach(stv6110_attach,
10115a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						fe0->dvb.frontend,
10125a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&netup_stv6110_tunerconfig_b,
10135a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&i2c_bus->i2c_adap)) {
10145a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin					if (!dvb_attach(lnbh24_attach,
10155a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							fe0->dvb.frontend,
10165a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap,
10179329fb5b731cd535a7c7d0690d30e872f29a33d3Abylay Ospan							LNBH24_PCL | LNBH24_TTX,
10189329fb5b731cd535a7c7d0690d30e872f29a33d3Abylay Ospan							LNBH24_TEN, 0x0a))
10195a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						printk(KERN_ERR
10205a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							"No LNBH24 found!\n");
10215a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
10225a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				}
10235a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			}
10245a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			break;
10255a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		}
10265a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		break;
1027493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	case CX23885_BOARD_MYGICA_X8506:
1028493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		i2c_bus = &dev->i2c_bus[0];
1029493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		i2c_bus2 = &dev->i2c_bus[1];
1030493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
1031493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong			&mygica_x8506_lgs8gl5_config,
1032493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong			&i2c_bus->i2c_adap);
1033493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		if (fe0->dvb.frontend != NULL) {
1034493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong			dvb_attach(xc5000_attach,
1035493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong				fe0->dvb.frontend,
1036493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong				&i2c_bus2->i2c_adap,
1037493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong				&mygica_x8506_xc5000_config);
1038493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		}
1039493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		break;
10402365b2d307ee0323062c674ea0495584085e8c24David Wong	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
10412365b2d307ee0323062c674ea0495584085e8c24David Wong		i2c_bus = &dev->i2c_bus[0];
10422365b2d307ee0323062c674ea0495584085e8c24David Wong		i2c_bus2 = &dev->i2c_bus[1];
10432365b2d307ee0323062c674ea0495584085e8c24David Wong		fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
10442365b2d307ee0323062c674ea0495584085e8c24David Wong			&magicpro_prohdtve2_lgs8g75_config,
10452365b2d307ee0323062c674ea0495584085e8c24David Wong			&i2c_bus->i2c_adap);
10462365b2d307ee0323062c674ea0495584085e8c24David Wong		if (fe0->dvb.frontend != NULL) {
10472365b2d307ee0323062c674ea0495584085e8c24David Wong			dvb_attach(xc5000_attach,
10482365b2d307ee0323062c674ea0495584085e8c24David Wong				fe0->dvb.frontend,
10492365b2d307ee0323062c674ea0495584085e8c24David Wong				&i2c_bus2->i2c_adap,
10502365b2d307ee0323062c674ea0495584085e8c24David Wong				&magicpro_prohdtve2_xc5000_config);
10512365b2d307ee0323062c674ea0495584085e8c24David Wong		}
10522365b2d307ee0323062c674ea0495584085e8c24David Wong		break;
10531369738023900302ef9677c90c4da873b5593ee7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1850:
1054350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth		i2c_bus = &dev->i2c_bus[0];
1055350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1056350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth			&hcw_s5h1411_config,
1057350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth			&i2c_bus->i2c_adap);
1058350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth		if (fe0->dvb.frontend != NULL)
1059350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth			dvb_attach(tda18271_attach, fe0->dvb.frontend,
1060350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth				0x60, &dev->i2c_bus[0].i2c_adap,
1061350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth				&hauppauge_tda18271_config);
1062350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth
1063350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth		tda18271_attach(&dev->ts1.analog_fe,
1064350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth			0x60, &dev->i2c_bus[1].i2c_adap,
1065350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth			&hauppauge_tda18271_config);
1066350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth
1067350451375d6d8e9b124eacad67e221a0fdff0ac9Steven Toth		break;
1068aee0b24c05f6e9615115748a8ea5042d8ee0e6a0Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1290:
10691369738023900302ef9677c90c4da873b5593ee7Steven Toth		i2c_bus = &dev->i2c_bus[0];
10701369738023900302ef9677c90c4da873b5593ee7Steven Toth		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
10711369738023900302ef9677c90c4da873b5593ee7Steven Toth			&hcw_s5h1411_config,
10721369738023900302ef9677c90c4da873b5593ee7Steven Toth			&i2c_bus->i2c_adap);
10731369738023900302ef9677c90c4da873b5593ee7Steven Toth		if (fe0->dvb.frontend != NULL)
10741369738023900302ef9677c90c4da873b5593ee7Steven Toth			dvb_attach(tda18271_attach, fe0->dvb.frontend,
10751369738023900302ef9677c90c4da873b5593ee7Steven Toth				0x60, &dev->i2c_bus[0].i2c_adap,
10761369738023900302ef9677c90c4da873b5593ee7Steven Toth				&hauppauge_tda18271_config);
10771369738023900302ef9677c90c4da873b5593ee7Steven Toth		break;
1078ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong	case CX23885_BOARD_MYGICA_X8558PRO:
1079ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		switch (port->nr) {
1080ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		/* port B */
1081ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		case 1:
1082ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			i2c_bus = &dev->i2c_bus[0];
1083ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			fe0->dvb.frontend = dvb_attach(atbm8830_attach,
1084ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong				&mygica_x8558pro_atbm8830_cfg1,
1085ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong				&i2c_bus->i2c_adap);
1086ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			if (fe0->dvb.frontend != NULL) {
1087ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong				dvb_attach(max2165_attach,
1088ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong					fe0->dvb.frontend,
1089ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong					&i2c_bus->i2c_adap,
1090ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong					&mygic_x8558pro_max2165_cfg1);
1091ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			}
1092ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			break;
1093ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		/* port C */
1094ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		case 2:
1095ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			i2c_bus = &dev->i2c_bus[1];
1096ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			fe0->dvb.frontend = dvb_attach(atbm8830_attach,
1097ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong				&mygica_x8558pro_atbm8830_cfg2,
1098ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong				&i2c_bus->i2c_adap);
1099ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			if (fe0->dvb.frontend != NULL) {
1100ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong				dvb_attach(max2165_attach,
1101ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong					fe0->dvb.frontend,
1102ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong					&i2c_bus->i2c_adap,
1103ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong					&mygic_x8558pro_max2165_cfg2);
1104ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			}
1105ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong			break;
1106ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		}
1107ea5697fe9ed6a1d534de436eff3138041e3c8aa9David T. L. Wong		break;
110878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
110978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		i2c_bus = &dev->i2c_bus[0];
111078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		mfe_shared = 1;/* MFE */
111178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		port->frontends.gate = 0;/* not clear for me yet */
111278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		/* ports B, C */
111378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		/* MFE frontend 1 DVB-T */
111478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe0->dvb.frontend = dvb_attach(stv0367ter_attach,
111578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&netup_stv0367_config[port->nr - 1],
111678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&i2c_bus->i2c_adap);
11174174ebf5ebd7a09589ff8ff3bc3246ea0a9bd356Abylay Ospan		if (fe0->dvb.frontend != NULL) {
111878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			if (NULL == dvb_attach(xc5000_attach,
111978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					fe0->dvb.frontend,
112078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&i2c_bus->i2c_adap,
112178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&netup_xc5000_config[port->nr - 1]))
112278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin				goto frontend_detach;
11234174ebf5ebd7a09589ff8ff3bc3246ea0a9bd356Abylay Ospan			/* load xc5000 firmware */
11244174ebf5ebd7a09589ff8ff3bc3246ea0a9bd356Abylay Ospan			fe0->dvb.frontend->ops.tuner_ops.init(fe0->dvb.frontend);
11254174ebf5ebd7a09589ff8ff3bc3246ea0a9bd356Abylay Ospan		}
112678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		/* MFE frontend 2 */
112778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe1 = videobuf_dvb_get_frontend(&port->frontends, 2);
112878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		if (fe1 == NULL)
112978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			goto frontend_detach;
113078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		/* DVB-C init */
113178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe1->dvb.frontend = dvb_attach(stv0367cab_attach,
113278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&netup_stv0367_config[port->nr - 1],
113378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&i2c_bus->i2c_adap);
113478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		if (fe1->dvb.frontend != NULL) {
113578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			fe1->dvb.frontend->id = 1;
113678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			if (NULL == dvb_attach(xc5000_attach,
113778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					fe1->dvb.frontend,
113878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&i2c_bus->i2c_adap,
113978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&netup_xc5000_config[port->nr - 1]))
114078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin				goto frontend_detach;
114178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		}
114278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		break;
1143722c90eb761195c09b776314f331341095273204Stefan Ringel	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1144722c90eb761195c09b776314f331341095273204Stefan Ringel		i2c_bus = &dev->i2c_bus[0];
1145722c90eb761195c09b776314f331341095273204Stefan Ringel		i2c_bus2 = &dev->i2c_bus[1];
1146722c90eb761195c09b776314f331341095273204Stefan Ringel
1147722c90eb761195c09b776314f331341095273204Stefan Ringel		switch (port->nr) {
1148722c90eb761195c09b776314f331341095273204Stefan Ringel		/* port b */
1149722c90eb761195c09b776314f331341095273204Stefan Ringel		case 1:
1150722c90eb761195c09b776314f331341095273204Stefan Ringel			fe0->dvb.frontend = dvb_attach(drxk_attach,
1151722c90eb761195c09b776314f331341095273204Stefan Ringel					&terratec_drxk_config[0],
1152722c90eb761195c09b776314f331341095273204Stefan Ringel					&i2c_bus->i2c_adap);
1153722c90eb761195c09b776314f331341095273204Stefan Ringel			if (fe0->dvb.frontend != NULL) {
1154722c90eb761195c09b776314f331341095273204Stefan Ringel				if (!dvb_attach(mt2063_attach,
1155722c90eb761195c09b776314f331341095273204Stefan Ringel						fe0->dvb.frontend,
1156722c90eb761195c09b776314f331341095273204Stefan Ringel						&terratec_mt2063_config[0],
1157722c90eb761195c09b776314f331341095273204Stefan Ringel						&i2c_bus2->i2c_adap))
1158722c90eb761195c09b776314f331341095273204Stefan Ringel					goto frontend_detach;
1159722c90eb761195c09b776314f331341095273204Stefan Ringel			}
1160722c90eb761195c09b776314f331341095273204Stefan Ringel			break;
1161722c90eb761195c09b776314f331341095273204Stefan Ringel		/* port c */
1162722c90eb761195c09b776314f331341095273204Stefan Ringel		case 2:
1163722c90eb761195c09b776314f331341095273204Stefan Ringel			fe0->dvb.frontend = dvb_attach(drxk_attach,
1164722c90eb761195c09b776314f331341095273204Stefan Ringel					&terratec_drxk_config[1],
1165722c90eb761195c09b776314f331341095273204Stefan Ringel					&i2c_bus->i2c_adap);
1166722c90eb761195c09b776314f331341095273204Stefan Ringel			if (fe0->dvb.frontend != NULL) {
1167722c90eb761195c09b776314f331341095273204Stefan Ringel				if (!dvb_attach(mt2063_attach,
1168722c90eb761195c09b776314f331341095273204Stefan Ringel						fe0->dvb.frontend,
1169722c90eb761195c09b776314f331341095273204Stefan Ringel						&terratec_mt2063_config[1],
1170722c90eb761195c09b776314f331341095273204Stefan Ringel						&i2c_bus2->i2c_adap))
1171722c90eb761195c09b776314f331341095273204Stefan Ringel					goto frontend_detach;
1172722c90eb761195c09b776314f331341095273204Stefan Ringel			}
1173722c90eb761195c09b776314f331341095273204Stefan Ringel			break;
1174722c90eb761195c09b776314f331341095273204Stefan Ringel		}
1175722c90eb761195c09b776314f331341095273204Stefan Ringel		break;
1176d19770e5178a4bc49641711246360c25781d20a4Steven Toth	default:
11779c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_INFO "%s: The frontend of your DVB/ATSC card "
11789c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			" isn't supported yet\n",
1179d19770e5178a4bc49641711246360c25781d20a4Steven Toth		       dev->name);
1180d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
1181d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
118278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
118378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if ((NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend)) {
11849c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_ERR "%s: frontend initialization failed\n",
118578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		       dev->name);
118678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		goto frontend_detach;
1187d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
118878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
1189d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufky	/* define general-purpose callback pointer */
1190363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	fe0->dvb.frontend->callback = cx23885_tuner_callback;
119178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (fe1)
119278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe1->dvb.frontend->callback = cx23885_tuner_callback;
119378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin#if 0
119478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	/* Ensure all frontends negotiate bus access */
119578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	fe0->dvb.frontend->ops.ts_bus_ctrl = cx23885_dvb_bus_ctrl;
119678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	if (fe1)
119778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		fe1->dvb.frontend->ops.ts_bus_ctrl = cx23885_dvb_bus_ctrl;
119878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin#endif
1199d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1200d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* Put the analog decoder in standby to keep it quiet */
1201622b828ab795580903e79acb33fb44f5c9ce7b0fLaurent Pinchart	call_all(dev, core, s_power, 0);
1202d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1203363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (fe0->dvb.frontend->ops.analog_ops.standby)
1204363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend);
12053ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
1206d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* register everything */
12075a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	ret = videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port,
120878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin					&dev->pci->dev, adapter_nr, mfe_shared,
1209a7d44baaed0a8c7d4c4fb47938455cb3fc2bb1ebMauro Carvalho Chehab					NULL);
1210bee30192feeba6d69db45434e7818d532d1b8d33Abylay Ospan	if (ret)
121178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		goto frontend_detach;
1212363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
12135a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	/* init CI & MAC */
12145a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	switch (dev->board) {
12155a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: {
12165a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		static struct netup_card_info cinfo;
12175a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
12185a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
12195a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		memcpy(port->frontends.adapter.proposed_mac,
12205a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				cinfo.port[port->nr - 1].mac, 6);
1221be39515758f382e8b1d0d0012cd59008e9970dechartleys		printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC=%pM\n",
1222be39515758f382e8b1d0d0012cd59008e9970dechartleys			port->nr, port->frontends.adapter.proposed_mac);
12235a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
12245a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		netup_ci_init(port);
12255a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		break;
12265a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		}
122778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: {
122878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		struct altera_ci_config netup_ci_cfg = {
122978db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			.dev = dev,/* magic number to identify*/
123078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			.adapter = &port->frontends.adapter,/* for CI */
123178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			.demux = &fe0->dvb.demux,/* for hw pid filter */
123278db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin			.fpga_rw = netup_altera_fpga_rw,
123378db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		};
123478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
123578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		altera_ci_init(&netup_ci_cfg, port->nr);
123678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		break;
123778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		}
123816bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier	case CX23885_BOARD_TEVII_S470: {
123916bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		u8 eeprom[256]; /* 24C02 i2c eeprom */
124016bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier
124116bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		if (port->nr != 1)
124216bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier			break;
124316bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier
124416bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		/* Read entire EEPROM */
124516bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1;
124616bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom));
12475cac1f665fd18c75c9914ecd3fe808cebfe639f0Andy Shevchenko		printk(KERN_INFO "TeVii S470 MAC= %pM\n", eeprom + 0xa0);
124816bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0, 6);
124916bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		break;
125016bfdaa41be85512432212382f2600fcdf7c1c37Pierre Gronlier		}
12515a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	}
12525a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
12535a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	return ret;
125478db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
125578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianinfrontend_detach:
125678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	port->gate_ctrl = NULL;
125778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	videobuf_dvb_dealloc_frontends(&port->frontends);
125878db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	return -EINVAL;
1259d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
1260d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1261d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_register(struct cx23885_tsport *port)
1262d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
1263363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
1264363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
1265d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
1266eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	int err, i;
1267eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth
1268eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	/* Here we need to allocate the correct number of frontends,
1269af901ca181d92aac3a7dc265144a9081a86d8f39André Goddard Rosa	 * as reflected in the cards struct. The reality is that currently
1270eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * no cx23885 boards support this - yet. But, if we don't modify this
1271eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * code then the second frontend would never be allocated (later)
1272eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * and fail with error before the attach in dvb_register().
1273eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * Without these changes we risk an OOPS later. The changes here
1274eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * are for safety, and should provide a good foundation for the
1275eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * future addition of any multi-frontend cx23885 based boards.
1276eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 */
1277eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
1278eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		port->num_frontends);
1279d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1280eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	for (i = 1; i <= port->num_frontends; i++) {
128196b7a1a838fb5b8746fc22f4ff3cef358bf59f35Darron Broad		if (videobuf_dvb_alloc_frontend(
12829c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			&port->frontends, i) == NULL) {
1283eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			printk(KERN_ERR "%s() failed to alloc\n", __func__);
1284eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			return -ENOMEM;
1285eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		}
1286eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth
1287eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		fe0 = videobuf_dvb_get_frontend(&port->frontends, i);
1288eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		if (!fe0)
1289eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			err = -EINVAL;
1290363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
1291eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		dprintk(1, "%s\n", __func__);
12929c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		dprintk(1, " ->probed by Card=%d Name=%s, PCI %02x:%02x\n",
1293eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->board,
1294eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->name,
1295eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->pci_bus,
1296eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->pci_slot);
1297d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1298eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		err = -ENODEV;
1299d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1300eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		/* dvb stuff */
1301eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		/* We have to init the queue for each frontend on a port. */
13029c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_INFO "%s: cx23885 based dvb card\n", dev->name);
13039c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		videobuf_queue_sg_init(&fe0->dvb.dvbq, &dvb_qops,
13049c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			    &dev->pci->dev, &port->slock,
130544a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
130608bff03ed697a583612b62a6ac566bd5bce98012Hans Verkuil			    sizeof(struct cx23885_buffer), port, NULL);
1307eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	}
1308d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = dvb_register(port);
1309d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (err != 0)
13109c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_ERR "%s() dvb_register failed err = %d\n",
13119c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			__func__, err);
1312d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1313d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return err;
1314d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
1315d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1316d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_unregister(struct cx23885_tsport *port)
1317d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
1318363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
1319363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
1320eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	/* FIXME: in an error condition where the we have
1321eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * an expected number of frontends (attach problem)
1322eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * then this might not clean up correctly, if 1
1323eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * is invalid.
1324eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * This comment only applies to future boards IF they
1325eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * implement MFE support.
1326eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 */
132792abe9ee374599179033f039b095864a9cf74593Darron Broad	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
1328e66131cee501ee720b7b58a4b87073b8fbaaaba6Abylay Ospan	if (fe0 && fe0->dvb.frontend)
1329363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		videobuf_dvb_unregister_bus(&port->frontends);
1330d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1331afd96668d8491f762e35c16ce65781da820a67faHans Verkuil	switch (port->dev->board) {
1332afd96668d8491f762e35c16ce65781da820a67faHans Verkuil	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1333afd96668d8491f762e35c16ce65781da820a67faHans Verkuil		netup_ci_exit(port);
1334afd96668d8491f762e35c16ce65781da820a67faHans Verkuil		break;
133578db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
133678db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		altera_ci_release(port->dev, port->nr);
133778db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin		break;
1338afd96668d8491f762e35c16ce65781da820a67faHans Verkuil	}
13395a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
134078db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin	port->gate_ctrl = NULL;
134178db854757aa4110f9c6873d1529b851037a3405Igor M. Liplianin
1342d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
1343d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
134444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky
1345