cx23885-dvb.c revision 1369738023900302ef9677c90c4da873b5593ee7
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"
40d1987d55a1eda774dfbab240a432607c17241d07Steven Toth#include "xc5000.h"
41b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth#include "tda10048.h"
4207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky#include "tuner-xc2028.h"
43827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky#include "tuner-simple.h"
446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dib7000p.h"
456676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dibx000_common.h"
46aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth#include "zl10353.h"
475a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "stv0900.h"
48f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin#include "stv0900_reg.h"
495a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "stv6110.h"
505a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "lnbh24.h"
5196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin#include "cx24116.h"
525a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "cimax2.h"
53493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong#include "lgs8gxx.h"
545a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "netup-eeprom.h"
555a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin#include "netup-init.h"
56a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky#include "lgdt3305.h"
57d19770e5178a4bc49641711246360c25781d20a4Steven Toth
584513fc696e273d64ea32f2366748aed810316eccSteven Tothstatic unsigned int debug;
59d19770e5178a4bc49641711246360c25781d20a4Steven Toth
604513fc696e273d64ea32f2366748aed810316eccSteven Toth#define dprintk(level, fmt, arg...)\
614513fc696e273d64ea32f2366748aed810316eccSteven Toth	do { if (debug >= level)\
624513fc696e273d64ea32f2366748aed810316eccSteven Toth		printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
634513fc696e273d64ea32f2366748aed810316eccSteven Toth	} while (0)
64d19770e5178a4bc49641711246360c25781d20a4Steven Toth
65d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* ------------------------------------------------------------------ */
66d19770e5178a4bc49641711246360c25781d20a4Steven Toth
673ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic unsigned int alt_tuner;
683ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkymodule_param(alt_tuner, int, 0644);
693ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael KrufkyMODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");
703ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
7178e92006f410a4044f8c1760c25ac9d11d259aa2Janne GrunauDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
7278e92006f410a4044f8c1760c25ac9d11d259aa2Janne Grunau
733ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky/* ------------------------------------------------------------------ */
743ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
75d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_buf_setup(struct videobuf_queue *q,
76d19770e5178a4bc49641711246360c25781d20a4Steven Toth			 unsigned int *count, unsigned int *size)
77d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
78d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
79d19770e5178a4bc49641711246360c25781d20a4Steven Toth
80d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_size  = 188 * 4;
81d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_count = 32;
82d19770e5178a4bc49641711246360c25781d20a4Steven Toth
83d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*size  = port->ts_packet_size * port->ts_packet_count;
84d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*count = 32;
85d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
86d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
87d19770e5178a4bc49641711246360c25781d20a4Steven Toth
8844a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic int dvb_buf_prepare(struct videobuf_queue *q,
8944a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			   struct videobuf_buffer *vb, enum v4l2_field field)
90d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
91d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
929c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	return cx23885_buf_prepare(q, port, (struct cx23885_buffer *)vb, field);
93d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
94d19770e5178a4bc49641711246360c25781d20a4Steven Toth
95d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
96d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
97d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
989c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	cx23885_buf_queue(port, (struct cx23885_buffer *)vb);
99d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
100d19770e5178a4bc49641711246360c25781d20a4Steven Toth
10144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic void dvb_buf_release(struct videobuf_queue *q,
10244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    struct videobuf_buffer *vb)
103d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
1049c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	cx23885_free_buffer(q, (struct cx23885_buffer *)vb);
105d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
106d19770e5178a4bc49641711246360c25781d20a4Steven Toth
107d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic struct videobuf_queue_ops dvb_qops = {
108d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_setup    = dvb_buf_setup,
109d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_prepare  = dvb_buf_prepare,
110d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_queue    = dvb_buf_queue,
111d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_release  = dvb_buf_release,
112d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
113d19770e5178a4bc49641711246360c25781d20a4Steven Toth
11486184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct s5h1409_config hauppauge_generic_config = {
115d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.demod_address = 0x32 >> 1,
116d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
117fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.gpio          = S5H1409_GPIO_ON,
1182b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
119fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.inversion     = S5H1409_INVERSION_OFF,
120dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
121dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
122fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth};
123fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth
124b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda10048_config hauppauge_hvr1200_config = {
125b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.demod_address    = 0x10 >> 1,
126b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.output_mode      = TDA10048_SERIAL_OUTPUT,
127b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
128484d9e0577c12f9c66a7eab799858ad9617da4bfSteven Toth	.inversion        = TDA10048_INVERSION_ON,
1298816bef53cfaf21fcce47fe5fd403d2e39ba6d2dSteven Toth	.dtv6_if_freq_khz = TDA10048_IF_3300,
1308816bef53cfaf21fcce47fe5fd403d2e39ba6d2dSteven Toth	.dtv7_if_freq_khz = TDA10048_IF_3800,
1318816bef53cfaf21fcce47fe5fd403d2e39ba6d2dSteven Toth	.dtv8_if_freq_khz = TDA10048_IF_4300,
132484d9e0577c12f9c66a7eab799858ad9617da4bfSteven Toth	.clk_freq_khz     = TDA10048_CLK_16000,
133b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth};
134b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth
1356b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufkystatic struct tda10048_config hauppauge_hvr1210_config = {
1366b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.demod_address    = 0x10 >> 1,
1376b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.output_mode      = TDA10048_SERIAL_OUTPUT,
1386b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
1396b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.inversion        = TDA10048_INVERSION_ON,
140c27586e4d647c5c07c81e766d34ceef6ba5a316dMichael Krufky	.dtv6_if_freq_khz = TDA10048_IF_3300,
141c27586e4d647c5c07c81e766d34ceef6ba5a316dMichael Krufky	.dtv7_if_freq_khz = TDA10048_IF_3500,
142c27586e4d647c5c07c81e766d34ceef6ba5a316dMichael Krufky	.dtv8_if_freq_khz = TDA10048_IF_4000,
1436b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.clk_freq_khz     = TDA10048_CLK_16000,
1446b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky};
1456b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky
1463ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic struct s5h1409_config hauppauge_ezqam_config = {
1473ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.demod_address = 0x32 >> 1,
1483ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
1493ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
1503ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.qam_if        = 4000,
1513ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.inversion     = S5H1409_INVERSION_ON,
152dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
153dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
1543ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky};
1553ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
156fc959befe0f0e4647bb4e326e3ae55875401888aSteven Tothstatic struct s5h1409_config hauppauge_hvr1800lp_config = {
157fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.demod_address = 0x32 >> 1,
158fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
159d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.gpio          = S5H1409_GPIO_OFF,
1602b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
161fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
162dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
163dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
164d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
165d19770e5178a4bc49641711246360c25781d20a4Steven Toth
16607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic struct s5h1409_config hauppauge_hvr1500_config = {
16707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.demod_address = 0x32 >> 1,
16807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
16907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
17007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.inversion     = S5H1409_INVERSION_OFF,
171dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
172dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
17307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky};
17407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
17586184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct mt2131_config hauppauge_generic_tunerconfig = {
176a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	0x61
177a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth};
178a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth
1799bc37caadffe8327683980b2323371691fa182e3Michael Krufkystatic struct lgdt330x_config fusionhdtv_5_express = {
1809bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_address = 0x0e,
1819bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_chip = LGDT3303,
1829bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.serial_mpeg = 0x40,
1839bc37caadffe8327683980b2323371691fa182e3Michael Krufky};
1849bc37caadffe8327683980b2323371691fa182e3Michael Krufky
185d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct s5h1409_config hauppauge_hvr1500q_config = {
186d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.demod_address = 0x32 >> 1,
187d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
188d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.gpio          = S5H1409_GPIO_ON,
189d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.qam_if        = 44000,
190d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
191dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
192dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
193d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
194d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
195335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct s5h1409_config dvico_s5h1409_config = {
196335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.demod_address = 0x32 >> 1,
197335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
198335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.gpio          = S5H1409_GPIO_ON,
199335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.qam_if        = 44000,
200335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.inversion     = S5H1409_INVERSION_OFF,
201335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.status_mode   = S5H1409_DEMODLOCKING,
202335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
203335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky};
204335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
20552b5045078b76ee86e210210601d45670eab22f1Michael Krufkystatic struct s5h1411_config dvico_s5h1411_config = {
20652b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.output_mode   = S5H1411_SERIAL_OUTPUT,
20752b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.gpio          = S5H1411_GPIO_ON,
20852b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.qam_if        = S5H1411_IF_44000,
20952b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.vsb_if        = S5H1411_IF_44000,
21052b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.inversion     = S5H1411_INVERSION_OFF,
21152b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.status_mode   = S5H1411_DEMODLOCKING,
21252b5045078b76ee86e210210601d45670eab22f1Michael Krufky	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
21352b5045078b76ee86e210210601d45670eab22f1Michael Krufky};
21452b5045078b76ee86e210210601d45670eab22f1Michael Krufky
21519bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufkystatic struct s5h1411_config hcw_s5h1411_config = {
21619bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.output_mode   = S5H1411_SERIAL_OUTPUT,
21719bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.gpio          = S5H1411_GPIO_OFF,
21819bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.vsb_if        = S5H1411_IF_44000,
21919bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.qam_if        = S5H1411_IF_4000,
22019bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.inversion     = S5H1411_INVERSION_ON,
22119bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.status_mode   = S5H1411_DEMODLOCKING,
22219bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
22319bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky};
22419bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky
225d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
226e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.i2c_address      = 0x61,
227e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.if_khz           = 5380,
228d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
229d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
230335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct xc5000_config dvico_xc5000_tunerconfig = {
231335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.i2c_address      = 0x64,
232335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	.if_khz           = 5380,
233335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky};
234335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
2354041f1a58774249f5f26163e68b844521ece1fb4Michael Krufkystatic struct tda829x_config tda829x_no_probe = {
2364041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky	.probe_tuner = TDA829X_DONT_PROBE,
2374041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky};
2384041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky
239f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_std_map hauppauge_tda18271_std_map = {
240c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky	.atsc_6   = { .if_freq = 5380, .agc_mode = 3, .std = 3,
241c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky		      .if_lvl = 6, .rfagc_top = 0x37 },
242c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
243c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky		      .if_lvl = 6, .rfagc_top = 0x37 },
244f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
245f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
246b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufkystatic struct tda18271_std_map hauppauge_hvr1200_tda18271_std_map = {
247b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.dvbt_6   = { .if_freq = 3300, .agc_mode = 3, .std = 4,
248b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky		      .if_lvl = 1, .rfagc_top = 0x37, },
249b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.dvbt_7   = { .if_freq = 3800, .agc_mode = 3, .std = 5,
250b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky		      .if_lvl = 1, .rfagc_top = 0x37, },
251b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.dvbt_8   = { .if_freq = 4300, .agc_mode = 3, .std = 6,
252b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky		      .if_lvl = 1, .rfagc_top = 0x37, },
253b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky};
254b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky
255f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_config hauppauge_tda18271_config = {
256f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.std_map = &hauppauge_tda18271_std_map,
257f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.gate    = TDA18271_GATE_ANALOG,
258f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
259f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
260b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda18271_config hauppauge_hvr1200_tuner_config = {
261b34cdc36c4aad10cf4eaadacf067835d6a622f1bMichael Krufky	.std_map = &hauppauge_hvr1200_tda18271_std_map,
262b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	.gate    = TDA18271_GATE_ANALOG,
263b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth};
264b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth
2656b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufkystatic struct tda18271_config hauppauge_hvr1210_tuner_config = {
2666b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	.gate    = TDA18271_GATE_DIGITAL,
2676b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky};
2686b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky
269247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufkystatic struct tda18271_std_map hauppauge_hvr127x_std_map = {
270a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
271a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		      .if_lvl = 1, .rfagc_top = 0x58 },
272a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
273a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		      .if_lvl = 1, .rfagc_top = 0x58 },
274a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky};
275a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky
276247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufkystatic struct tda18271_config hauppauge_hvr127x_config = {
277247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufky	.std_map = &hauppauge_hvr127x_std_map,
278a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky};
279a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky
280247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufkystatic struct lgdt3305_config hauppauge_lgdt3305_config = {
281a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.i2c_addr           = 0x0e,
282a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.mpeg_mode          = LGDT3305_MPEG_SERIAL,
283a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
284a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
285a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.deny_i2c_rptr      = 1,
286a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.spectral_inversion = 1,
287a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.qam_if_khz         = 4000,
288a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	.vsb_if_khz         = 3250,
289a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky};
290a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky
291b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_agc_config xc3028_agc_config = {
2926676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	BAND_VHF | BAND_UHF,	/* band_caps */
2936676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
2946676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
2956676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
2966676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0,
2976676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 * P_agc_nb_est=2, P_agc_write=0
2986676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	 */
2996676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
3006676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		(3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
3016676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3026676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	712,	/* inv_gain */
3036676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	21,	/* time_stabiliz */
3046676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3056676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* alpha_level */
3066676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	118,	/* thlock */
3076676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3086676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* wbd_inv */
3096676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	2867,	/* wbd_ref */
3106676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* wbd_sel */
3116676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	2,	/* wbd_alpha */
3126676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3136676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_max */
3146676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_min */
3156676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	39718,	/* agc2_max */
3166676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	9930,	/* agc2_min */
3176676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt1 */
3186676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt2 */
3196676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_pt3 */
3206676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_slope1 */
3216676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc1_slope2 */
3226676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* agc2_pt1 */
3236676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	128,	/* agc2_pt2 */
3246676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	29,	/* agc2_slope1 */
3256676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	29,	/* agc2_slope2 */
3266676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3276676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	17,	/* alpha_mant */
3286676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	27,	/* alpha_exp */
3296676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	23,	/* beta_mant */
3306676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	51,	/* beta_exp */
3316676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3326676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* perform_agc_softsplit */
3336676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
3346676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3356676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth/* PLL Configuration for COFDM BW_MHz = 8.000000
3366676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * With external clock = 30.000000 */
337b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_bandwidth_config xc3028_bw_config = {
3386676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	60000,	/* internal */
3396676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	30000,	/* sampling */
3406676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* pll_cfg: prediv */
3416676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	8,	/* pll_cfg: ratio */
3426676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	3,	/* pll_cfg: range */
3436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* pll_cfg: reset */
3446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* pll_cfg: bypass */
3456676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: refdiv */
3466676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: bypclk_div */
3476676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* misc: IO_CLK_en_core */
3486676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	1,	/* misc: ADClkSrc */
3496676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	0,	/* misc: modulo */
3506676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
3516676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	(1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
3526676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	20452225, /* timf */
3536676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	30000000  /* xtal_hz */
3546676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
3556676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3566676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Tothstatic struct dib7000p_config hauppauge_hvr1400_dib7000_config = {
3576676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.output_mpeg2_in_188_bytes = 1,
3586676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.hostbus_diversity = 1,
3596676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.tuner_is_baseband = 0,
3606676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.update_lna  = NULL,
3616676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3626676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc_config_count = 1,
3636676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc = &xc3028_agc_config,
3646676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.bw  = &xc3028_bw_config,
3656676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3666676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3676676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3686676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3696676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3706676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.pwm_freq_div = 0,
3716676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.agc_control  = NULL,
3726676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.spur_protect = 0,
3736676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
3746676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	.output_mode = OUTMODE_MPEG2_SERIAL,
3756676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth};
3766676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
377aef2d186e381816733fa15d67ad63bd99254cb9eSteven Tothstatic struct zl10353_config dvico_fusionhdtv_xc3028 = {
378aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.demod_address = 0x0f,
379aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.if2           = 45600,
380aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	.no_tuner      = 1,
381d4dc673da9a94716ca2410306c1b36b5faf6c4ccChristopher Pascoe	.disable_i2c_gate_ctrl = 1,
382aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth};
383aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
384f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianinstatic struct stv0900_reg stv0900_ts_regs[] = {
385f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_TSGENERAL, 0x00 },
386f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSSPEED, 0x40 },
387f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSSPEED, 0x40 },
388f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSCFGM, 0xc0 },
389f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSCFGM, 0xc0 },
390f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSCFGH, 0xe0 },
391f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSCFGH, 0xe0 },
392f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P1_TSCFGL, 0x20 },
393f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ R0900_P2_TSCFGL, 0x20 },
394f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	{ 0xffff, 0xff }, /* terminate */
395f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin};
396f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin
3975a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianinstatic struct stv0900_config netup_stv0900_config = {
3985a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.demod_address = 0x68,
3995a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.xtal = 27000000,
4005a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
4015a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.diseqc_mode = 2,/* 2/3 PWM */
402f867c3f4eab1d5006df4f3734fab1134feffbebaIgor M. Liplianin	.ts_config_regs = stv0900_ts_regs,
4035a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun1_maddress = 0,/* 0x60 */
4045a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun2_maddress = 3,/* 0x63 */
4055a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun1_adc = 1,/* 1 Vpp */
4065a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.tun2_adc = 1,/* 1 Vpp */
4075a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin};
4085a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
4095a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianinstatic struct stv6110_config netup_stv6110_tunerconfig_a = {
4105a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.i2c_address = 0x60,
4115a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.mclk = 27000000,
4125a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.iq_wiring = 0,
4135a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin};
4145a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
4155a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianinstatic struct stv6110_config netup_stv6110_tunerconfig_b = {
4165a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.i2c_address = 0x63,
4175a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.mclk = 27000000,
4185a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	.iq_wiring = 1,
4195a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin};
4205a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
42196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
42296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin{
42396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	struct cx23885_tsport *port = fe->dvb->priv;
42496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	struct cx23885_dev *dev = port->dev;
42596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
42696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	if (voltage == SEC_VOLTAGE_18)
42796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		cx_write(MC417_RWD, 0x00001e00);/* GPIO-13 high */
42896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	else if (voltage == SEC_VOLTAGE_13)
42996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		cx_write(MC417_RWD, 0x00001a00);/* GPIO-13 low */
43096318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	else
43196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		cx_write(MC417_RWD, 0x00001800);/* GPIO-12 low */
43296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	return 0;
43396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin}
43496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
43596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic struct cx24116_config tbs_cx24116_config = {
43696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	.demod_address = 0x05,
43796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin};
43896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
439579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianinstatic struct cx24116_config tevii_cx24116_config = {
440579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin	.demod_address = 0x55,
441579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin};
442579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
443c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianinstatic struct cx24116_config dvbworld_cx24116_config = {
444c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin	.demod_address = 0x05,
445c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin};
446c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin
447493b7127aa56d0a5c041797639bf543d96f6261bDavid Wongstatic struct lgs8gxx_config mygica_x8506_lgs8gl5_config = {
448493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.prod = LGS8GXX_PROD_LGS8GL5,
449493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.demod_address = 0x19,
450493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.serial_ts = 0,
451493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.ts_clk_pol = 1,
452493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.ts_clk_gated = 1,
453493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_clk_freq = 30400, /* 30.4 MHz */
454493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_freq = 5380, /* 5.38 MHz */
455493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_neg_center = 1,
456493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.ext_adc = 0,
457493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.adc_signed = 0,
458493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_neg_edge = 0,
459493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong};
460493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong
461493b7127aa56d0a5c041797639bf543d96f6261bDavid Wongstatic struct xc5000_config mygica_x8506_xc5000_config = {
462493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.i2c_address = 0x61,
463493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	.if_khz = 5380,
464493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong};
465493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong
466f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufkystatic int cx23885_dvb_set_frontend(struct dvb_frontend *fe,
467f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky				    struct dvb_frontend_parameters *param)
468f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky{
469f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	struct cx23885_tsport *port = fe->dvb->priv;
470f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	struct cx23885_dev *dev = port->dev;
471f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky
472f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	switch (dev->board) {
473f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1275:
474f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		switch (param->u.vsb.modulation) {
475f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		case VSB_8:
476f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			cx23885_gpio_clear(dev, GPIO_5);
477f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			break;
478f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		case QAM_64:
479f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		case QAM_256:
480f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		default:
481f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			cx23885_gpio_set(dev, GPIO_5);
482f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky			break;
483f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		}
484f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		break;
485f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	}
486f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky	return (port->set_frontend_save) ?
487f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		port->set_frontend_save(fe, param) : -ENODEV;
488f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky}
489f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky
4902365b2d307ee0323062c674ea0495584085e8c24David Wongstatic struct lgs8gxx_config magicpro_prohdtve2_lgs8g75_config = {
4912365b2d307ee0323062c674ea0495584085e8c24David Wong	.prod = LGS8GXX_PROD_LGS8G75,
4922365b2d307ee0323062c674ea0495584085e8c24David Wong	.demod_address = 0x19,
4932365b2d307ee0323062c674ea0495584085e8c24David Wong	.serial_ts = 0,
4942365b2d307ee0323062c674ea0495584085e8c24David Wong	.ts_clk_pol = 1,
4952365b2d307ee0323062c674ea0495584085e8c24David Wong	.ts_clk_gated = 1,
4962365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_clk_freq = 30400, /* 30.4 MHz */
4972365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_freq = 6500, /* 6.50 MHz */
4982365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_neg_center = 1,
4992365b2d307ee0323062c674ea0495584085e8c24David Wong	.ext_adc = 0,
5002365b2d307ee0323062c674ea0495584085e8c24David Wong	.adc_signed = 1,
5012365b2d307ee0323062c674ea0495584085e8c24David Wong	.adc_vpp = 2, /* 1.6 Vpp */
5022365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_neg_edge = 1,
5032365b2d307ee0323062c674ea0495584085e8c24David Wong};
5042365b2d307ee0323062c674ea0495584085e8c24David Wong
5052365b2d307ee0323062c674ea0495584085e8c24David Wongstatic struct xc5000_config magicpro_prohdtve2_xc5000_config = {
5062365b2d307ee0323062c674ea0495584085e8c24David Wong	.i2c_address = 0x61,
5072365b2d307ee0323062c674ea0495584085e8c24David Wong	.if_khz = 6500,
5082365b2d307ee0323062c674ea0495584085e8c24David Wong};
5092365b2d307ee0323062c674ea0495584085e8c24David Wong
510d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_register(struct cx23885_tsport *port)
511d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
512d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
513493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	struct cx23885_i2c *i2c_bus = NULL, *i2c_bus2 = NULL;
514363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
5155a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	int ret;
516363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
517f972e0bd9361594071d3e68e2342c53b51a1d42bDarron Broad	/* Get the first frontend */
51892abe9ee374599179033f039b095864a9cf74593Darron Broad	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
519363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (!fe0)
520363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		return -EINVAL;
521d19770e5178a4bc49641711246360c25781d20a4Steven Toth
522d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init struct videobuf_dvb */
523363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	fe0->dvb.name = dev->name;
524d19770e5178a4bc49641711246360c25781d20a4Steven Toth
525d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init frontend */
526d19770e5178a4bc49641711246360c25781d20a4Steven Toth	switch (dev->board) {
527a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1250:
528f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
529363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
53086184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth						&hauppauge_generic_config,
531f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
532363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
533363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(mt2131_attach, fe0->dvb.frontend,
534f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
53586184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth				   &hauppauge_generic_tunerconfig, 0);
536d19770e5178a4bc49641711246360c25781d20a4Steven Toth		}
537d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
538a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1270:
539d099becb0bd7ee01a13d58371b4ea5a2f7052c04Michael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1275:
540a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		i2c_bus = &dev->i2c_bus[0];
541a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
542247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufky					       &hauppauge_lgdt3305_config,
543a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky					       &i2c_bus->i2c_adap);
544a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		if (fe0->dvb.frontend != NULL) {
545a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky			dvb_attach(tda18271_attach, fe0->dvb.frontend,
546a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky				   0x60, &dev->i2c_bus[1].i2c_adap,
547247bc54053df81ede8de32074384c74b0e2eb79bMichael Krufky				   &hauppauge_hvr127x_config);
548a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		}
549f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky
550b179bc4579f67c6f1df524c48b28cacf0c7a1b91Michael Krufky		/* FIXME: temporary hack */
551f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		/* define bridge override to set_frontend */
552f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		port->set_frontend_save = fe0->dvb.frontend->ops.set_frontend;
553f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky		fe0->dvb.frontend->ops.set_frontend = cx23885_dvb_set_frontend;
554f35b9e8039c04f0cb9fe3a051ce941b1524a8798Michael Krufky
555a5dbf45766a378cc00f341f7179befab1edae573Michael Krufky		break;
55619bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1255:
55719bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		i2c_bus = &dev->i2c_bus[0];
55819bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
55919bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky					       &hcw_s5h1411_config,
56019bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky					       &i2c_bus->i2c_adap);
56119bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		if (fe0->dvb.frontend != NULL) {
56219bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky			dvb_attach(tda18271_attach, fe0->dvb.frontend,
56319bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky				   0x60, &dev->i2c_bus[1].i2c_adap,
56419bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky				   &hauppauge_tda18271_config);
56519bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		}
56619bc57968cc854c7da4846c21b3ef2a39e43f97dMichael Krufky		break;
5673ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1800:
5683ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		i2c_bus = &dev->i2c_bus[0];
56992abe9ee374599179033f039b095864a9cf74593Darron Broad		switch (alt_tuner) {
5703ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 1:
571363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend =
5723ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
5733ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_ezqam_config,
5743ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
575363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			if (fe0->dvb.frontend != NULL) {
576363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(tda829x_attach, fe0->dvb.frontend,
5773ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &dev->i2c_bus[1].i2c_adap, 0x42,
5784041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   &tda829x_no_probe);
579363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(tda18271_attach, fe0->dvb.frontend,
5804041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   0x60, &dev->i2c_bus[1].i2c_adap,
581f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky					   &hauppauge_tda18271_config);
5823ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			}
5833ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
5843ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 0:
5853ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		default:
586363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend =
5873ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
5883ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_config,
5893ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
590363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			if (fe0->dvb.frontend != NULL)
591363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth				dvb_attach(mt2131_attach, fe0->dvb.frontend,
5923ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap,
5933ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_tunerconfig, 0);
5943ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
5953ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		}
5963ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		break;
597fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
598f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
599363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
600fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth						&hauppauge_hvr1800lp_config,
601f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
602363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
603363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(mt2131_attach, fe0->dvb.frontend,
604f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
605fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth				   &hauppauge_generic_tunerconfig, 0);
606fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		}
607fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		break;
6089bc37caadffe8327683980b2323371691fa182e3Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
609f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
610363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
6119bc37caadffe8327683980b2323371691fa182e3Michael Krufky						&fusionhdtv_5_express,
612f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
613363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
614363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
615827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky				   &i2c_bus->i2c_adap, 0x61,
616827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky				   TUNER_LG_TDVS_H06XF);
6179bc37caadffe8327683980b2323371691fa182e3Michael Krufky		}
6189bc37caadffe8327683980b2323371691fa182e3Michael Krufky		break;
619d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
620d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		i2c_bus = &dev->i2c_bus[1];
621363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
622d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&hauppauge_hvr1500q_config,
623d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&dev->i2c_bus[0].i2c_adap);
624363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL)
625363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(xc5000_attach, fe0->dvb.frontend,
62630650961907368b1077cade35455fe931b14da6bMichael Krufky				   &i2c_bus->i2c_adap,
62730650961907368b1077cade35455fe931b14da6bMichael Krufky				   &hauppauge_hvr1500q_tunerconfig);
628d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		break;
62907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1500:
63007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		i2c_bus = &dev->i2c_bus[1];
631363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
63207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&hauppauge_hvr1500_config,
63307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&dev->i2c_bus[0].i2c_adap);
634363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
63507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct dvb_frontend *fe;
63607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct xc2028_config cfg = {
63707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_adap  = &i2c_bus->i2c_adap,
63807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_addr  = 0x61,
63907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
64007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			static struct xc2028_ctrl ctl = {
641ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
64207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.max_len     = 64,
64352c3d29cfa2fa02f525a01abf28abf48f49801bfSteven Toth				.demod       = XC3028_FE_OREN538,
64407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
64507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
64607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			fe = dvb_attach(xc2028_attach,
647363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth					fe0->dvb.frontend, &cfg);
64807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
64907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				fe->ops.tuner_ops.set_config(fe, &ctl);
65007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		}
65107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
652b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1200:
653a780a31cee55e01e7b479244e7907ba842c120a0Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1700:
654b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		i2c_bus = &dev->i2c_bus[0];
655363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(tda10048_attach,
656b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth			&hauppauge_hvr1200_config,
657b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth			&i2c_bus->i2c_adap);
658363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
659363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(tda829x_attach, fe0->dvb.frontend,
660b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&dev->i2c_bus[1].i2c_adap, 0x42,
661b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&tda829x_no_probe);
662363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(tda18271_attach, fe0->dvb.frontend,
663b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				0x60, &dev->i2c_bus[1].i2c_adap,
664b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth				&hauppauge_hvr1200_tuner_config);
6656b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		}
6666b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		break;
6676b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1210:
6686b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		i2c_bus = &dev->i2c_bus[0];
6696b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		fe0->dvb.frontend = dvb_attach(tda10048_attach,
6706b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky			&hauppauge_hvr1210_config,
6716b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky			&i2c_bus->i2c_adap);
6726b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky		if (fe0->dvb.frontend != NULL) {
6736b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky			dvb_attach(tda18271_attach, fe0->dvb.frontend,
6746b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky				0x60, &dev->i2c_bus[1].i2c_adap,
6756b926eca9824568b18825d3eade5fb39e3b5a9fbMichael Krufky				&hauppauge_hvr1210_tuner_config);
676b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		}
677b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth		break;
6786676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1400:
6796676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		i2c_bus = &dev->i2c_bus[0];
680363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(dib7000p_attach,
6816676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			&i2c_bus->i2c_adap,
6826676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			0x12, &hauppauge_hvr1400_dib7000_config);
683363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
6846676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			struct dvb_frontend *fe;
6856676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			struct xc2028_config cfg = {
6866676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
6876676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.i2c_addr  = 0x64,
6886676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			};
6896676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			static struct xc2028_ctrl ctl = {
690ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname   = XC3028L_DEFAULT_FIRMWARE,
6916676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.max_len = 64,
6926676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				.demod   = 5000,
6939c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth				/* This is true for all demods with
6949c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth					v36 firmware? */
6950975fc68719c75cbe14132c6f0dead57cd4d5210Mauro Carvalho Chehab				.type    = XC2028_D2633,
6966676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			};
6976676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth
6986676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			fe = dvb_attach(xc2028_attach,
699363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth					fe0->dvb.frontend, &cfg);
7006676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
7016676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
7026676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		}
7036676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth		break;
704335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
705335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky		i2c_bus = &dev->i2c_bus[port->nr - 1];
706335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky
707363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
708335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky						&dvico_s5h1409_config,
709335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky						&i2c_bus->i2c_adap);
710363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend == NULL)
711363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe0->dvb.frontend = dvb_attach(s5h1411_attach,
71252b5045078b76ee86e210210601d45670eab22f1Michael Krufky							&dvico_s5h1411_config,
71352b5045078b76ee86e210210601d45670eab22f1Michael Krufky							&i2c_bus->i2c_adap);
714363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL)
715363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			dvb_attach(xc5000_attach, fe0->dvb.frontend,
71630650961907368b1077cade35455fe931b14da6bMichael Krufky				   &i2c_bus->i2c_adap,
71730650961907368b1077cade35455fe931b14da6bMichael Krufky				   &dvico_xc5000_tunerconfig);
718335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky		break;
719aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: {
720aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		i2c_bus = &dev->i2c_bus[port->nr - 1];
721aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
722363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(zl10353_attach,
723aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					       &dvico_fusionhdtv_xc3028,
724aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					       &i2c_bus->i2c_adap);
725363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
726aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			struct dvb_frontend      *fe;
727aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			struct xc2028_config	  cfg = {
728aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.i2c_adap  = &i2c_bus->i2c_adap,
729aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.i2c_addr  = 0x61,
730aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			};
731aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			static struct xc2028_ctrl ctl = {
732ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
733aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.max_len     = 64,
734aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				.demod       = XC3028_FE_ZARLINK456,
735aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			};
736aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth
737363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
738aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth					&cfg);
739aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
740aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
741aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		}
742aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth		break;
743aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth	}
7444c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
7459bb1b7e879091f09fc677dca10c5e132b68a9da3Igor M. Liplianin	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
7464c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		i2c_bus = &dev->i2c_bus[0];
7474c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth
748363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend = dvb_attach(zl10353_attach,
7494c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			&dvico_fusionhdtv_xc3028,
7504c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			&i2c_bus->i2c_adap);
751363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		if (fe0->dvb.frontend != NULL) {
7524c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			struct dvb_frontend      *fe;
7534c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			struct xc2028_config	  cfg = {
7544c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
7554c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.i2c_addr  = 0x61,
7564c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			};
7574c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			static struct xc2028_ctrl ctl = {
758ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky				.fname       = XC2028_DEFAULT_FIRMWARE,
7594c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.max_len     = 64,
7604c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				.demod       = XC3028_FE_ZARLINK456,
7614c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			};
7624c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth
763363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
7644c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				&cfg);
7654c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
7664c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth				fe->ops.tuner_ops.set_config(fe, &ctl);
7674c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		}
7684c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth		break;
76996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin	case CX23885_BOARD_TBS_6920:
77096318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		i2c_bus = &dev->i2c_bus[0];
77196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
77296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
77396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin			&tbs_cx24116_config,
77496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin			&i2c_bus->i2c_adap);
77596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		if (fe0->dvb.frontend != NULL)
77696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin			fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage;
77796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin
77896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin		break;
779579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin	case CX23885_BOARD_TEVII_S470:
780579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
781579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
782579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
783579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin			&tevii_cx24116_config,
784579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin			&i2c_bus->i2c_adap);
785579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		if (fe0->dvb.frontend != NULL)
786579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin			fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage;
787579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin
788579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin		break;
789c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin	case CX23885_BOARD_DVBWORLD_2005:
790c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		i2c_bus = &dev->i2c_bus[1];
791c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin
792c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		fe0->dvb.frontend = dvb_attach(cx24116_attach,
793c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin			&dvbworld_cx24116_config,
794c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin			&i2c_bus->i2c_adap);
795c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin		break;
7965a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
7975a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		i2c_bus = &dev->i2c_bus[0];
7985a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		switch (port->nr) {
7995a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		/* port B */
8005a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		case 1:
8015a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			fe0->dvb.frontend = dvb_attach(stv0900_attach,
8025a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&netup_stv0900_config,
8035a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap, 0);
8045a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			if (fe0->dvb.frontend != NULL) {
8055a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				if (dvb_attach(stv6110_attach,
8065a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						fe0->dvb.frontend,
8075a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&netup_stv6110_tunerconfig_a,
8085a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&i2c_bus->i2c_adap)) {
8095a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin					if (!dvb_attach(lnbh24_attach,
8105a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							fe0->dvb.frontend,
8115a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap,
8120cde9b2533d6fe79307173f24209228aaf34bc98Igor M. Liplianin							LNBH24_PCL,
8130cde9b2533d6fe79307173f24209228aaf34bc98Igor M. Liplianin							LNBH24_TTX, 0x09))
8145a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						printk(KERN_ERR
8155a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							"No LNBH24 found!\n");
8165a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
8175a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				}
8185a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			}
8195a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			break;
8205a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		/* port C */
8215a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		case 2:
8225a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			fe0->dvb.frontend = dvb_attach(stv0900_attach,
8235a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&netup_stv0900_config,
8245a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap, 1);
8255a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			if (fe0->dvb.frontend != NULL) {
8265a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				if (dvb_attach(stv6110_attach,
8275a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						fe0->dvb.frontend,
8285a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&netup_stv6110_tunerconfig_b,
8295a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						&i2c_bus->i2c_adap)) {
8305a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin					if (!dvb_attach(lnbh24_attach,
8315a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							fe0->dvb.frontend,
8325a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							&i2c_bus->i2c_adap,
8330cde9b2533d6fe79307173f24209228aaf34bc98Igor M. Liplianin							LNBH24_PCL,
8340cde9b2533d6fe79307173f24209228aaf34bc98Igor M. Liplianin							LNBH24_TTX, 0x0a))
8355a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin						printk(KERN_ERR
8365a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin							"No LNBH24 found!\n");
8375a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
8385a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				}
8395a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			}
8405a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			break;
8415a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		}
8425a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		break;
843493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong	case CX23885_BOARD_MYGICA_X8506:
844493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		i2c_bus = &dev->i2c_bus[0];
845493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		i2c_bus2 = &dev->i2c_bus[1];
846493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
847493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong			&mygica_x8506_lgs8gl5_config,
848493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong			&i2c_bus->i2c_adap);
849493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		if (fe0->dvb.frontend != NULL) {
850493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong			dvb_attach(xc5000_attach,
851493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong				fe0->dvb.frontend,
852493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong				&i2c_bus2->i2c_adap,
853493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong				&mygica_x8506_xc5000_config);
854493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		}
855493b7127aa56d0a5c041797639bf543d96f6261bDavid Wong		break;
8562365b2d307ee0323062c674ea0495584085e8c24David Wong	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
8572365b2d307ee0323062c674ea0495584085e8c24David Wong		i2c_bus = &dev->i2c_bus[0];
8582365b2d307ee0323062c674ea0495584085e8c24David Wong		i2c_bus2 = &dev->i2c_bus[1];
8592365b2d307ee0323062c674ea0495584085e8c24David Wong		fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
8602365b2d307ee0323062c674ea0495584085e8c24David Wong			&magicpro_prohdtve2_lgs8g75_config,
8612365b2d307ee0323062c674ea0495584085e8c24David Wong			&i2c_bus->i2c_adap);
8622365b2d307ee0323062c674ea0495584085e8c24David Wong		if (fe0->dvb.frontend != NULL) {
8632365b2d307ee0323062c674ea0495584085e8c24David Wong			dvb_attach(xc5000_attach,
8642365b2d307ee0323062c674ea0495584085e8c24David Wong				fe0->dvb.frontend,
8652365b2d307ee0323062c674ea0495584085e8c24David Wong				&i2c_bus2->i2c_adap,
8662365b2d307ee0323062c674ea0495584085e8c24David Wong				&magicpro_prohdtve2_xc5000_config);
8672365b2d307ee0323062c674ea0495584085e8c24David Wong		}
8682365b2d307ee0323062c674ea0495584085e8c24David Wong		break;
8691369738023900302ef9677c90c4da873b5593ee7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1850:
8701369738023900302ef9677c90c4da873b5593ee7Steven Toth		i2c_bus = &dev->i2c_bus[0];
8711369738023900302ef9677c90c4da873b5593ee7Steven Toth		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
8721369738023900302ef9677c90c4da873b5593ee7Steven Toth			&hcw_s5h1411_config,
8731369738023900302ef9677c90c4da873b5593ee7Steven Toth			&i2c_bus->i2c_adap);
8741369738023900302ef9677c90c4da873b5593ee7Steven Toth		if (fe0->dvb.frontend != NULL)
8751369738023900302ef9677c90c4da873b5593ee7Steven Toth			dvb_attach(tda18271_attach, fe0->dvb.frontend,
8761369738023900302ef9677c90c4da873b5593ee7Steven Toth				0x60, &dev->i2c_bus[0].i2c_adap,
8771369738023900302ef9677c90c4da873b5593ee7Steven Toth				&hauppauge_tda18271_config);
8781369738023900302ef9677c90c4da873b5593ee7Steven Toth		break;
8791369738023900302ef9677c90c4da873b5593ee7Steven Toth
880d19770e5178a4bc49641711246360c25781d20a4Steven Toth	default:
8819c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_INFO "%s: The frontend of your DVB/ATSC card "
8829c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			" isn't supported yet\n",
883d19770e5178a4bc49641711246360c25781d20a4Steven Toth		       dev->name);
884d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
885d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
886363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (NULL == fe0->dvb.frontend) {
8879c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_ERR "%s: frontend initialization failed\n",
8889c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			dev->name);
889d19770e5178a4bc49641711246360c25781d20a4Steven Toth		return -1;
890d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
891d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufky	/* define general-purpose callback pointer */
892363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	fe0->dvb.frontend->callback = cx23885_tuner_callback;
893d19770e5178a4bc49641711246360c25781d20a4Steven Toth
894d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* Put the analog decoder in standby to keep it quiet */
8957c9fc9d50f97c9a6733ff1a22b6e31bcd91778e2Hans Verkuil	call_all(dev, tuner, s_standby);
896d19770e5178a4bc49641711246360c25781d20a4Steven Toth
897363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	if (fe0->dvb.frontend->ops.analog_ops.standby)
898363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend);
8993ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
900d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* register everything */
9015a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	ret = videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port,
90259b1842da1c6f33ad2e8da82d3dfb3445751d964Darron Broad		&dev->pci->dev, adapter_nr, 0);
903363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
9045a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	/* init CI & MAC */
9055a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	switch (dev->board) {
9065a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: {
9075a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		static struct netup_card_info cinfo;
9085a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
9095a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
9105a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		memcpy(port->frontends.adapter.proposed_mac,
9115a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin				cinfo.port[port->nr - 1].mac, 6);
9125a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC="
9135a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			"%02X:%02X:%02X:%02X:%02X:%02X\n",
9145a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->nr,
9155a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->frontends.adapter.proposed_mac[0],
9165a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->frontends.adapter.proposed_mac[1],
9175a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->frontends.adapter.proposed_mac[2],
9185a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->frontends.adapter.proposed_mac[3],
9195a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->frontends.adapter.proposed_mac[4],
9205a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin			port->frontends.adapter.proposed_mac[5]);
9215a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
9225a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		netup_ci_init(port);
9235a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		break;
9245a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin		}
9255a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	}
9265a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
9275a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin	return ret;
928d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
929d19770e5178a4bc49641711246360c25781d20a4Steven Toth
930d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_register(struct cx23885_tsport *port)
931d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
932363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
933363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
934d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
935eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	int err, i;
936eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth
937eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	/* Here we need to allocate the correct number of frontends,
938eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * as reflected in the cards struct. The reality is that currrently
939eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * no cx23885 boards support this - yet. But, if we don't modify this
940eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * code then the second frontend would never be allocated (later)
941eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * and fail with error before the attach in dvb_register().
942eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * Without these changes we risk an OOPS later. The changes here
943eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * are for safety, and should provide a good foundation for the
944eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * future addition of any multi-frontend cx23885 based boards.
945eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 */
946eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
947eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		port->num_frontends);
948d19770e5178a4bc49641711246360c25781d20a4Steven Toth
949eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	for (i = 1; i <= port->num_frontends; i++) {
95096b7a1a838fb5b8746fc22f4ff3cef358bf59f35Darron Broad		if (videobuf_dvb_alloc_frontend(
9519c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			&port->frontends, i) == NULL) {
952eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			printk(KERN_ERR "%s() failed to alloc\n", __func__);
953eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			return -ENOMEM;
954eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		}
955eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth
956eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		fe0 = videobuf_dvb_get_frontend(&port->frontends, i);
957eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		if (!fe0)
958eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			err = -EINVAL;
959363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
960eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		dprintk(1, "%s\n", __func__);
9619c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		dprintk(1, " ->probed by Card=%d Name=%s, PCI %02x:%02x\n",
962eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->board,
963eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->name,
964eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->pci_bus,
965eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth			dev->pci_slot);
966d19770e5178a4bc49641711246360c25781d20a4Steven Toth
967eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		err = -ENODEV;
968d19770e5178a4bc49641711246360c25781d20a4Steven Toth
969eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		/* dvb stuff */
970eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth		/* We have to init the queue for each frontend on a port. */
9719c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_INFO "%s: cx23885 based dvb card\n", dev->name);
9729c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		videobuf_queue_sg_init(&fe0->dvb.dvbq, &dvb_qops,
9739c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			    &dev->pci->dev, &port->slock,
97444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
97544a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    sizeof(struct cx23885_buffer), port);
976eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	}
977d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = dvb_register(port);
978d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (err != 0)
9799c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth		printk(KERN_ERR "%s() dvb_register failed err = %d\n",
9809c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth			__func__, err);
981d19770e5178a4bc49641711246360c25781d20a4Steven Toth
982d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return err;
983d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
984d19770e5178a4bc49641711246360c25781d20a4Steven Toth
985d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_unregister(struct cx23885_tsport *port)
986d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
987363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth	struct videobuf_dvb_frontend *fe0;
988363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth
989eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	/* FIXME: in an error condition where the we have
990eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * an expected number of frontends (attach problem)
991eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * then this might not clean up correctly, if 1
992eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * is invalid.
993eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * This comment only applies to future boards IF they
994eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 * implement MFE support.
995eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth	 */
99692abe9ee374599179033f039b095864a9cf74593Darron Broad	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
9979c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth	if (fe0->dvb.frontend)
998363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth		videobuf_dvb_unregister_bus(&port->frontends);
999d19770e5178a4bc49641711246360c25781d20a4Steven Toth
1000afd96668d8491f762e35c16ce65781da820a67faHans Verkuil	switch (port->dev->board) {
1001afd96668d8491f762e35c16ce65781da820a67faHans Verkuil	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1002afd96668d8491f762e35c16ce65781da820a67faHans Verkuil		netup_ci_exit(port);
1003afd96668d8491f762e35c16ce65781da820a67faHans Verkuil		break;
1004afd96668d8491f762e35c16ce65781da820a67faHans Verkuil	}
10055a23b0762c9095e137ce9a559cc7c37b2f8fd083Igor M. Liplianin
1006d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
1007d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
100844a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky
1009