cx23885-dvb.c revision 0705135e59f8503e4dade4b3580fed77b1743b7c
1d19770e5178a4bc49641711246360c25781d20a4Steven Toth/*
2d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  Driver for the Conexant CX23885 PCIe bridge
3d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
4d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  Copyright (c) 2006 Steven Toth <stoth@hauppauge.com>
5d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
6d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  This program is free software; you can redistribute it and/or modify
7d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  it under the terms of the GNU General Public License as published by
8d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  the Free Software Foundation; either version 2 of the License, or
9d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  (at your option) any later version.
10d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
11d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  This program is distributed in the hope that it will be useful,
12d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
15d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  GNU General Public License for more details.
16d19770e5178a4bc49641711246360c25781d20a4Steven Toth *
17d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  You should have received a copy of the GNU General Public License
18d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  along with this program; if not, write to the Free Software
19d19770e5178a4bc49641711246360c25781d20a4Steven Toth *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20d19770e5178a4bc49641711246360c25781d20a4Steven Toth */
21d19770e5178a4bc49641711246360c25781d20a4Steven Toth
22d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/module.h>
23d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/init.h>
24d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/device.h>
25d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/fs.h>
26d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/kthread.h>
27d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/file.h>
28d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/suspend.h>
29d19770e5178a4bc49641711246360c25781d20a4Steven Toth
30d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "cx23885.h"
31d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <media/v4l2-common.h>
32d19770e5178a4bc49641711246360c25781d20a4Steven Toth
33d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "s5h1409.h"
34d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "mt2131.h"
353ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky#include "tda8290.h"
364041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky#include "tda18271.h"
379bc37caadffe8327683980b2323371691fa182e3Michael Krufky#include "lgdt330x.h"
38d1987d55a1eda774dfbab240a432607c17241d07Steven Toth#include "xc5000.h"
399bc37caadffe8327683980b2323371691fa182e3Michael Krufky#include "dvb-pll.h"
4007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky#include "tuner-xc2028.h"
4107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky#include "tuner-xc2028-types.h"
42d19770e5178a4bc49641711246360c25781d20a4Steven Toth
434513fc696e273d64ea32f2366748aed810316eccSteven Tothstatic unsigned int debug;
44d19770e5178a4bc49641711246360c25781d20a4Steven Toth
454513fc696e273d64ea32f2366748aed810316eccSteven Toth#define dprintk(level, fmt, arg...)\
464513fc696e273d64ea32f2366748aed810316eccSteven Toth	do { if (debug >= level)\
474513fc696e273d64ea32f2366748aed810316eccSteven Toth		printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
484513fc696e273d64ea32f2366748aed810316eccSteven Toth	} while (0)
49d19770e5178a4bc49641711246360c25781d20a4Steven Toth
50d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* ------------------------------------------------------------------ */
51d19770e5178a4bc49641711246360c25781d20a4Steven Toth
523ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic unsigned int alt_tuner;
533ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkymodule_param(alt_tuner, int, 0644);
543ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael KrufkyMODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");
553ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
563ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky/* ------------------------------------------------------------------ */
573ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
58d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_buf_setup(struct videobuf_queue *q,
59d19770e5178a4bc49641711246360c25781d20a4Steven Toth			 unsigned int *count, unsigned int *size)
60d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
61d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
62d19770e5178a4bc49641711246360c25781d20a4Steven Toth
63d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_size  = 188 * 4;
64d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_count = 32;
65d19770e5178a4bc49641711246360c25781d20a4Steven Toth
66d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*size  = port->ts_packet_size * port->ts_packet_count;
67d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*count = 32;
68d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
69d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
70d19770e5178a4bc49641711246360c25781d20a4Steven Toth
7144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic int dvb_buf_prepare(struct videobuf_queue *q,
7244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			   struct videobuf_buffer *vb, enum v4l2_field field)
73d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
74d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
7544a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	return cx23885_buf_prepare(q, port, (struct cx23885_buffer*)vb, field);
76d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
77d19770e5178a4bc49641711246360c25781d20a4Steven Toth
78d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
79d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
80d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
81d19770e5178a4bc49641711246360c25781d20a4Steven Toth	cx23885_buf_queue(port, (struct cx23885_buffer*)vb);
82d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
83d19770e5178a4bc49641711246360c25781d20a4Steven Toth
8444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic void dvb_buf_release(struct videobuf_queue *q,
8544a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    struct videobuf_buffer *vb)
86d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
87d19770e5178a4bc49641711246360c25781d20a4Steven Toth	cx23885_free_buffer(q, (struct cx23885_buffer*)vb);
88d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
89d19770e5178a4bc49641711246360c25781d20a4Steven Toth
90d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic struct videobuf_queue_ops dvb_qops = {
91d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_setup    = dvb_buf_setup,
92d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_prepare  = dvb_buf_prepare,
93d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_queue    = dvb_buf_queue,
94d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_release  = dvb_buf_release,
95d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
96d19770e5178a4bc49641711246360c25781d20a4Steven Toth
9786184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct s5h1409_config hauppauge_generic_config = {
98d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.demod_address = 0x32 >> 1,
99d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
100fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.gpio          = S5H1409_GPIO_ON,
1012b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
102fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.inversion     = S5H1409_INVERSION_OFF,
103dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
104dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
105fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth};
106fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth
1073ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic struct s5h1409_config hauppauge_ezqam_config = {
1083ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.demod_address = 0x32 >> 1,
1093ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
1103ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
1113ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.qam_if        = 4000,
1123ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.inversion     = S5H1409_INVERSION_ON,
113dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
114dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
1153ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky};
1163ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
117fc959befe0f0e4647bb4e326e3ae55875401888aSteven Tothstatic struct s5h1409_config hauppauge_hvr1800lp_config = {
118fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.demod_address = 0x32 >> 1,
119fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
120d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.gpio          = S5H1409_GPIO_OFF,
1212b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
122fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
123dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
124dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
125d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
126d19770e5178a4bc49641711246360c25781d20a4Steven Toth
12707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic struct s5h1409_config hauppauge_hvr1500_config = {
12807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.demod_address = 0x32 >> 1,
12907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
13007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
13107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.inversion     = S5H1409_INVERSION_OFF,
132dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
133dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
13407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky};
13507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
13686184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct mt2131_config hauppauge_generic_tunerconfig = {
137a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	0x61
138a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth};
139a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth
1409bc37caadffe8327683980b2323371691fa182e3Michael Krufkystatic struct lgdt330x_config fusionhdtv_5_express = {
1419bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_address = 0x0e,
1429bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_chip = LGDT3303,
1439bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.serial_mpeg = 0x40,
1449bc37caadffe8327683980b2323371691fa182e3Michael Krufky};
1459bc37caadffe8327683980b2323371691fa182e3Michael Krufky
146d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct s5h1409_config hauppauge_hvr1500q_config = {
147d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.demod_address = 0x32 >> 1,
148d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
149d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.gpio          = S5H1409_GPIO_ON,
150d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.qam_if        = 44000,
151d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
152dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.status_mode   = S5H1409_DEMODLOCKING,
153dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
154d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
155d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
156d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
157e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.i2c_address      = 0x61,
158e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.if_khz           = 5380,
1598c70017f5793e68ea48085a65008d713c9a85ddeSteven Toth	.tuner_callback   = cx23885_tuner_callback
160d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
161d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
1624041f1a58774249f5f26163e68b844521ece1fb4Michael Krufkystatic struct tda829x_config tda829x_no_probe = {
1634041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky	.probe_tuner = TDA829X_DONT_PROBE,
1644041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky};
1654041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky
166f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_std_map hauppauge_tda18271_std_map = {
1672ba65d517b91ebb30f4f2a88f1e1beeabd8d8ee6Michael Krufky	.atsc_6   = { .if_freq = 5380, .std_bits = 0x1b },
1682ba65d517b91ebb30f4f2a88f1e1beeabd8d8ee6Michael Krufky	.qam_6    = { .if_freq = 4000, .std_bits = 0x18 },
169f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
170f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
171f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_config hauppauge_tda18271_config = {
172f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.std_map = &hauppauge_tda18271_std_map,
173f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky	.gate    = TDA18271_GATE_ANALOG,
174f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky};
175f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky
17607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic int cx23885_hvr1500_xc3028_callback(void *ptr, int command, int arg)
17707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky{
17807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	struct cx23885_tsport *port = ptr;
17907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	struct cx23885_dev *dev = port->dev;
18007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
18107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	switch (command) {
18207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case XC2028_TUNER_RESET:
18307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		/* Send the tuner in then out of reset */
18407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		/* GPIO-2 xc3028 tuner */
18507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		dprintk(1, "%s: XC2028_TUNER_RESET %d\n", __FUNCTION__, arg);
18607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
18707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		cx_set(GP0_IO, 0x00040000);
18807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		cx_clear(GP0_IO, 0x00000004);
18907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		msleep(5);
19007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
19107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		cx_set(GP0_IO, 0x00040004);
19207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		msleep(5);
19307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
19407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case XC2028_RESET_CLK:
19507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		dprintk(1, "%s: XC2028_RESET_CLK %d\n", __FUNCTION__, arg);
19607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
19707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	default:
19807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		dprintk(1, "%s: unknown command %d, arg %d\n", __FUNCTION__,
19907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			command, arg);
20007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		return -EINVAL;
20107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	}
20207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
20307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	return 0;
20407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky}
20507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
206d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_register(struct cx23885_tsport *port)
207d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
208d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
209f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky	struct cx23885_i2c *i2c_bus = NULL;
210d19770e5178a4bc49641711246360c25781d20a4Steven Toth
211d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init struct videobuf_dvb */
212d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->dvb.name = dev->name;
213d19770e5178a4bc49641711246360c25781d20a4Steven Toth
214d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init frontend */
215d19770e5178a4bc49641711246360c25781d20a4Steven Toth	switch (dev->board) {
216a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1250:
217f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
218d19770e5178a4bc49641711246360c25781d20a4Steven Toth		port->dvb.frontend = dvb_attach(s5h1409_attach,
21986184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth						&hauppauge_generic_config,
220f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
221d19770e5178a4bc49641711246360c25781d20a4Steven Toth		if (port->dvb.frontend != NULL) {
22244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			dvb_attach(mt2131_attach, port->dvb.frontend,
223f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
22486184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth				   &hauppauge_generic_tunerconfig, 0);
225d19770e5178a4bc49641711246360c25781d20a4Steven Toth		}
226d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
2273ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1800:
2283ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		i2c_bus = &dev->i2c_bus[0];
2293ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		switch (alt_tuner) {
2303ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 1:
2313ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			port->dvb.frontend =
2323ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
2333ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_ezqam_config,
2343ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
2353ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			if (port->dvb.frontend != NULL) {
2363ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(tda829x_attach, port->dvb.frontend,
2373ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &dev->i2c_bus[1].i2c_adap, 0x42,
2384041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   &tda829x_no_probe);
2394041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky				dvb_attach(tda18271_attach, port->dvb.frontend,
2404041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   0x60, &dev->i2c_bus[1].i2c_adap,
241f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky					   &hauppauge_tda18271_config);
2423ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			}
2433ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
2443ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 0:
2453ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		default:
2463ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			port->dvb.frontend =
2473ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
2483ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_config,
2493ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
2503ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			if (port->dvb.frontend != NULL)
2513ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(mt2131_attach, port->dvb.frontend,
2523ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap,
2533ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_tunerconfig, 0);
2543ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
2553ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		}
2563ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		break;
257fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
258f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
259fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		port->dvb.frontend = dvb_attach(s5h1409_attach,
260fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth						&hauppauge_hvr1800lp_config,
261f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
262fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		if (port->dvb.frontend != NULL) {
263fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth			dvb_attach(mt2131_attach, port->dvb.frontend,
264f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
265fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth				   &hauppauge_generic_tunerconfig, 0);
266fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		}
267fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		break;
2689bc37caadffe8327683980b2323371691fa182e3Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
269f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
2709bc37caadffe8327683980b2323371691fa182e3Michael Krufky		port->dvb.frontend = dvb_attach(lgdt330x_attach,
2719bc37caadffe8327683980b2323371691fa182e3Michael Krufky						&fusionhdtv_5_express,
272f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
2739bc37caadffe8327683980b2323371691fa182e3Michael Krufky		if (port->dvb.frontend != NULL) {
274f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky			dvb_attach(dvb_pll_attach, port->dvb.frontend, 0x61,
275f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap, DVB_PLL_LG_TDVS_H06XF);
2769bc37caadffe8327683980b2323371691fa182e3Michael Krufky		}
2779bc37caadffe8327683980b2323371691fa182e3Michael Krufky		break;
278d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
279d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		i2c_bus = &dev->i2c_bus[1];
280d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		port->dvb.frontend = dvb_attach(s5h1409_attach,
281d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&hauppauge_hvr1500q_config,
282d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&dev->i2c_bus[0].i2c_adap);
283d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		if (port->dvb.frontend != NULL) {
28473c993a8294077ae1b724286da8ac323c25d90dbSteven Toth			hauppauge_hvr1500q_tunerconfig.priv = i2c_bus;
285d1987d55a1eda774dfbab240a432607c17241d07Steven Toth			dvb_attach(xc5000_attach, port->dvb.frontend,
286d1987d55a1eda774dfbab240a432607c17241d07Steven Toth				&i2c_bus->i2c_adap,
287d1987d55a1eda774dfbab240a432607c17241d07Steven Toth				&hauppauge_hvr1500q_tunerconfig);
288d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		}
289d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		break;
29007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1500:
29107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		i2c_bus = &dev->i2c_bus[1];
29207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		port->dvb.frontend = dvb_attach(s5h1409_attach,
29307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&hauppauge_hvr1500_config,
29407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&dev->i2c_bus[0].i2c_adap);
29507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		if (port->dvb.frontend != NULL) {
29607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct dvb_frontend *fe;
29707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct xc2028_config cfg = {
29807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_adap  = &i2c_bus->i2c_adap,
29907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_addr  = 0x61,
30007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.video_dev = port,
30107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.callback  = cx23885_hvr1500_xc3028_callback,
30207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
30307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			static struct xc2028_ctrl ctl = {
30407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.fname       = "xc3028-v27.fw",
30507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.max_len     = 64,
30607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.scode_table = OREN538,
30707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
30807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
30907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			fe = dvb_attach(xc2028_attach,
31007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky					port->dvb.frontend, &cfg);
31107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
31207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				fe->ops.tuner_ops.set_config(fe, &ctl);
31307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		}
31407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
315d19770e5178a4bc49641711246360c25781d20a4Steven Toth	default:
316d19770e5178a4bc49641711246360c25781d20a4Steven Toth		printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n",
317d19770e5178a4bc49641711246360c25781d20a4Steven Toth		       dev->name);
318d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
319d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
320d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (NULL == port->dvb.frontend) {
321d19770e5178a4bc49641711246360c25781d20a4Steven Toth		printk("%s: frontend initialization failed\n", dev->name);
322d19770e5178a4bc49641711246360c25781d20a4Steven Toth		return -1;
323d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
324d19770e5178a4bc49641711246360c25781d20a4Steven Toth
325d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* Put the analog decoder in standby to keep it quiet */
326f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky	cx23885_call_i2c_clients(i2c_bus, TUNER_SET_STANDBY, NULL);
327d19770e5178a4bc49641711246360c25781d20a4Steven Toth
3283ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	if (port->dvb.frontend->ops.analog_ops.standby)
3293ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		port->dvb.frontend->ops.analog_ops.standby(port->dvb.frontend);
3303ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
331d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* register everything */
33244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	return videobuf_dvb_register(&port->dvb, THIS_MODULE, port,
33344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky				     &dev->pci->dev);
334d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
335d19770e5178a4bc49641711246360c25781d20a4Steven Toth
336d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_register(struct cx23885_tsport *port)
337d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
338d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
339d19770e5178a4bc49641711246360c25781d20a4Steven Toth	int err;
340d19770e5178a4bc49641711246360c25781d20a4Steven Toth
34144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	dprintk(1, "%s\n", __FUNCTION__);
34244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	dprintk(1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
343d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->board,
344d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->name,
345d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->pci_bus,
346d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->pci_slot);
347d19770e5178a4bc49641711246360c25781d20a4Steven Toth
348d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = -ENODEV;
349d19770e5178a4bc49641711246360c25781d20a4Steven Toth
350d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* dvb stuff */
351d19770e5178a4bc49641711246360c25781d20a4Steven Toth	printk("%s: cx23885 based dvb card\n", dev->name);
3520705135e59f8503e4dade4b3580fed77b1743b7cGuennadi Liakhovetski	videobuf_queue_sg_init(&port->dvb.dvbq, &dvb_qops, &dev->pci->dev, &port->slock,
35344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
35444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    sizeof(struct cx23885_buffer), port);
355d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = dvb_register(port);
356d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (err != 0)
357d19770e5178a4bc49641711246360c25781d20a4Steven Toth		printk("%s() dvb_register failed err = %d\n", __FUNCTION__, err);
358d19770e5178a4bc49641711246360c25781d20a4Steven Toth
359d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return err;
360d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
361d19770e5178a4bc49641711246360c25781d20a4Steven Toth
362d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_unregister(struct cx23885_tsport *port)
363d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
364d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* dvb */
365d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if(port->dvb.frontend)
366d19770e5178a4bc49641711246360c25781d20a4Steven Toth		videobuf_dvb_unregister(&port->dvb);
367d19770e5178a4bc49641711246360c25781d20a4Steven Toth
368d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
369d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
37044a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky
37144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky/*
37244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * Local variables:
37344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * c-basic-offset: 8
37444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * End:
37544a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off
37644a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky*/
377