cx23885-dvb.c revision 4041f1a58774249f5f26163e68b844521ece1fb4
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
432e52f215be1b3a0337788c8d3345bdf5e3894e19Steven Tothstatic unsigned int debug = 0;
44d19770e5178a4bc49641711246360c25781d20a4Steven Toth
45d19770e5178a4bc49641711246360c25781d20a4Steven Toth#define dprintk(level,fmt, arg...)	if (debug >= level) \
46d19770e5178a4bc49641711246360c25781d20a4Steven Toth	printk(KERN_DEBUG "%s: " fmt, dev->name, ## arg)
47d19770e5178a4bc49641711246360c25781d20a4Steven Toth
48d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* ------------------------------------------------------------------ */
49d19770e5178a4bc49641711246360c25781d20a4Steven Toth
503ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic unsigned int alt_tuner;
513ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkymodule_param(alt_tuner, int, 0644);
523ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael KrufkyMODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");
533ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
543ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky/* ------------------------------------------------------------------ */
553ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
56d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_buf_setup(struct videobuf_queue *q,
57d19770e5178a4bc49641711246360c25781d20a4Steven Toth			 unsigned int *count, unsigned int *size)
58d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
59d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
60d19770e5178a4bc49641711246360c25781d20a4Steven Toth
61d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_size  = 188 * 4;
62d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->ts_packet_count = 32;
63d19770e5178a4bc49641711246360c25781d20a4Steven Toth
64d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*size  = port->ts_packet_size * port->ts_packet_count;
65d19770e5178a4bc49641711246360c25781d20a4Steven Toth	*count = 32;
66d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
67d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
68d19770e5178a4bc49641711246360c25781d20a4Steven Toth
6944a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic int dvb_buf_prepare(struct videobuf_queue *q,
7044a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			   struct videobuf_buffer *vb, enum v4l2_field field)
71d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
72d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
7344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	return cx23885_buf_prepare(q, port, (struct cx23885_buffer*)vb, field);
74d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
75d19770e5178a4bc49641711246360c25781d20a4Steven Toth
76d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
77d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
78d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_tsport *port = q->priv_data;
79d19770e5178a4bc49641711246360c25781d20a4Steven Toth	cx23885_buf_queue(port, (struct cx23885_buffer*)vb);
80d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
81d19770e5178a4bc49641711246360c25781d20a4Steven Toth
8244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic void dvb_buf_release(struct videobuf_queue *q,
8344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    struct videobuf_buffer *vb)
84d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
85d19770e5178a4bc49641711246360c25781d20a4Steven Toth	cx23885_free_buffer(q, (struct cx23885_buffer*)vb);
86d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
87d19770e5178a4bc49641711246360c25781d20a4Steven Toth
88d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic int cx23885_request_firmware(struct dvb_frontend *fe,
89d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	const struct firmware **fw, char *name)
90d1987d55a1eda774dfbab240a432607c17241d07Steven Toth{
91d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	struct cx23885_tsport *port = fe->dvb->priv;
92d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	struct cx23885_dev *dev = port->dev;
93d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
94d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	dprintk(1, "%s(?,?,%s)\n", __FUNCTION__, name);
95d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
96d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	return request_firmware(fw, name, &dev->pci->dev);
97d1987d55a1eda774dfbab240a432607c17241d07Steven Toth}
98d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
99d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic int hauppauge_hvr1500q_tuner_reset(struct dvb_frontend *fe)
100d1987d55a1eda774dfbab240a432607c17241d07Steven Toth{
101d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	struct cx23885_tsport *port = fe->dvb->priv;
102d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	struct cx23885_dev *dev = port->dev;
103d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
104d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	dprintk(1, "%s()\n", __FUNCTION__);
105d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
106d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	/* Drive the tuner into reset back back */
107d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	cx_clear(GP0_IO, 0x00000004);
108d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	mdelay(200);
109d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	cx_set(GP0_IO, 0x00000004);
110d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
111d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	return 0;
112d1987d55a1eda774dfbab240a432607c17241d07Steven Toth}
113d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
114d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic struct videobuf_queue_ops dvb_qops = {
115d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_setup    = dvb_buf_setup,
116d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_prepare  = dvb_buf_prepare,
117d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_queue    = dvb_buf_queue,
118d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.buf_release  = dvb_buf_release,
119d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
120d19770e5178a4bc49641711246360c25781d20a4Steven Toth
12186184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct s5h1409_config hauppauge_generic_config = {
122d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.demod_address = 0x32 >> 1,
123d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
124fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.gpio          = S5H1409_GPIO_ON,
1252b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
126fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.inversion     = S5H1409_INVERSION_OFF,
127fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.status_mode   = S5H1409_DEMODLOCKING
128fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth};
129fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth
1303ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic struct s5h1409_config hauppauge_ezqam_config = {
1313ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.demod_address = 0x32 >> 1,
1323ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
1333ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
1343ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.qam_if        = 4000,
1353ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.inversion     = S5H1409_INVERSION_ON,
1363ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	.status_mode   = S5H1409_DEMODLOCKING
1373ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky};
1383ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
139fc959befe0f0e4647bb4e326e3ae55875401888aSteven Tothstatic struct s5h1409_config hauppauge_hvr1800lp_config = {
140fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.demod_address = 0x32 >> 1,
141fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
142d19770e5178a4bc49641711246360c25781d20a4Steven Toth	.gpio          = S5H1409_GPIO_OFF,
1432b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky	.qam_if        = 44000,
144fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
145fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth	.status_mode   = S5H1409_DEMODLOCKING
146d19770e5178a4bc49641711246360c25781d20a4Steven Toth};
147d19770e5178a4bc49641711246360c25781d20a4Steven Toth
14807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic struct s5h1409_config hauppauge_hvr1500_config = {
14907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.demod_address = 0x32 >> 1,
15007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.output_mode   = S5H1409_SERIAL_OUTPUT,
15107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.gpio          = S5H1409_GPIO_OFF,
15207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.inversion     = S5H1409_INVERSION_OFF,
15307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	.status_mode   = S5H1409_DEMODLOCKING
15407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky};
15507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
15686184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct mt2131_config hauppauge_generic_tunerconfig = {
157a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	0x61
158a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth};
159a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth
1609bc37caadffe8327683980b2323371691fa182e3Michael Krufkystatic struct lgdt330x_config fusionhdtv_5_express = {
1619bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_address = 0x0e,
1629bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.demod_chip = LGDT3303,
1639bc37caadffe8327683980b2323371691fa182e3Michael Krufky	.serial_mpeg = 0x40,
1649bc37caadffe8327683980b2323371691fa182e3Michael Krufky};
1659bc37caadffe8327683980b2323371691fa182e3Michael Krufky
166d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct s5h1409_config hauppauge_hvr1500q_config = {
167d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.demod_address = 0x32 >> 1,
168d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.output_mode   = S5H1409_SERIAL_OUTPUT,
169d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.gpio          = S5H1409_GPIO_ON,
170d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.qam_if        = 44000,
171d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.inversion     = S5H1409_INVERSION_OFF,
172d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.status_mode   = S5H1409_DEMODLOCKING
173d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
174d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
175d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
176e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.i2c_address      = 0x61,
177e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.if_khz           = 5380,
178d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	.request_firmware = cx23885_request_firmware,
179e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth	.tuner_reset      = hauppauge_hvr1500q_tuner_reset
180d1987d55a1eda774dfbab240a432607c17241d07Steven Toth};
181d1987d55a1eda774dfbab240a432607c17241d07Steven Toth
1824041f1a58774249f5f26163e68b844521ece1fb4Michael Krufkystatic struct tda829x_config tda829x_no_probe = {
1834041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky	.probe_tuner = TDA829X_DONT_PROBE,
1844041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky};
1854041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky
18607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic int cx23885_hvr1500_xc3028_callback(void *ptr, int command, int arg)
18707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky{
18807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	struct cx23885_tsport *port = ptr;
18907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	struct cx23885_dev *dev = port->dev;
19007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
19107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	switch (command) {
19207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case XC2028_TUNER_RESET:
19307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		/* Send the tuner in then out of reset */
19407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		/* GPIO-2 xc3028 tuner */
19507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		dprintk(1, "%s: XC2028_TUNER_RESET %d\n", __FUNCTION__, arg);
19607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
19707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		cx_set(GP0_IO, 0x00040000);
19807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		cx_clear(GP0_IO, 0x00000004);
19907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		msleep(5);
20007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
20107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		cx_set(GP0_IO, 0x00040004);
20207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		msleep(5);
20307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
20407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case XC2028_RESET_CLK:
20507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		dprintk(1, "%s: XC2028_RESET_CLK %d\n", __FUNCTION__, arg);
20607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
20707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	default:
20807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		dprintk(1, "%s: unknown command %d, arg %d\n", __FUNCTION__,
20907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			command, arg);
21007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		return -EINVAL;
21107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	}
21207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
21307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	return 0;
21407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky}
21507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
216d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_register(struct cx23885_tsport *port)
217d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
218d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
219f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky	struct cx23885_i2c *i2c_bus = NULL;
220d19770e5178a4bc49641711246360c25781d20a4Steven Toth
221d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init struct videobuf_dvb */
222d19770e5178a4bc49641711246360c25781d20a4Steven Toth	port->dvb.name = dev->name;
223d19770e5178a4bc49641711246360c25781d20a4Steven Toth
224d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* init frontend */
225d19770e5178a4bc49641711246360c25781d20a4Steven Toth	switch (dev->board) {
226a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1250:
227f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
228d19770e5178a4bc49641711246360c25781d20a4Steven Toth		port->dvb.frontend = dvb_attach(s5h1409_attach,
22986184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth						&hauppauge_generic_config,
230f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
231d19770e5178a4bc49641711246360c25781d20a4Steven Toth		if (port->dvb.frontend != NULL) {
23244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			dvb_attach(mt2131_attach, port->dvb.frontend,
233f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
23486184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth				   &hauppauge_generic_tunerconfig, 0);
235d19770e5178a4bc49641711246360c25781d20a4Steven Toth		}
236d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
2373ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1800:
2383ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		i2c_bus = &dev->i2c_bus[0];
2393ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		switch (alt_tuner) {
2403ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 1:
2413ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			port->dvb.frontend =
2423ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
2433ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_ezqam_config,
2443ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
2453ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			if (port->dvb.frontend != NULL) {
2463ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(tda829x_attach, port->dvb.frontend,
2473ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &dev->i2c_bus[1].i2c_adap, 0x42,
2484041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   &tda829x_no_probe);
2494041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky				dvb_attach(tda18271_attach, port->dvb.frontend,
2504041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   0x60, &dev->i2c_bus[1].i2c_adap,
2514041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky					   TDA18271_GATE_ANALOG);
2523ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			}
2533ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
2543ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		case 0:
2553ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		default:
2563ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			port->dvb.frontend =
2573ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(s5h1409_attach,
2583ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_config,
2593ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap);
2603ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			if (port->dvb.frontend != NULL)
2613ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky				dvb_attach(mt2131_attach, port->dvb.frontend,
2623ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &i2c_bus->i2c_adap,
2633ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky					   &hauppauge_generic_tunerconfig, 0);
2643ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky			break;
2653ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		}
2663ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		break;
267fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
268f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
269fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		port->dvb.frontend = dvb_attach(s5h1409_attach,
270fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth						&hauppauge_hvr1800lp_config,
271f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
272fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		if (port->dvb.frontend != NULL) {
273fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth			dvb_attach(mt2131_attach, port->dvb.frontend,
274f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap,
275fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth				   &hauppauge_generic_tunerconfig, 0);
276fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		}
277fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth		break;
2789bc37caadffe8327683980b2323371691fa182e3Michael Krufky	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
279f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky		i2c_bus = &dev->i2c_bus[0];
2809bc37caadffe8327683980b2323371691fa182e3Michael Krufky		port->dvb.frontend = dvb_attach(lgdt330x_attach,
2819bc37caadffe8327683980b2323371691fa182e3Michael Krufky						&fusionhdtv_5_express,
282f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky						&i2c_bus->i2c_adap);
2839bc37caadffe8327683980b2323371691fa182e3Michael Krufky		if (port->dvb.frontend != NULL) {
284f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky			dvb_attach(dvb_pll_attach, port->dvb.frontend, 0x61,
285f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky				   &i2c_bus->i2c_adap, DVB_PLL_LG_TDVS_H06XF);
2869bc37caadffe8327683980b2323371691fa182e3Michael Krufky		}
2879bc37caadffe8327683980b2323371691fa182e3Michael Krufky		break;
288d1987d55a1eda774dfbab240a432607c17241d07Steven Toth	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
289d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		i2c_bus = &dev->i2c_bus[1];
290d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		port->dvb.frontend = dvb_attach(s5h1409_attach,
291d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&hauppauge_hvr1500q_config,
292d1987d55a1eda774dfbab240a432607c17241d07Steven Toth						&dev->i2c_bus[0].i2c_adap);
293d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		if (port->dvb.frontend != NULL) {
294d1987d55a1eda774dfbab240a432607c17241d07Steven Toth			dvb_attach(xc5000_attach, port->dvb.frontend,
295d1987d55a1eda774dfbab240a432607c17241d07Steven Toth				&i2c_bus->i2c_adap,
296d1987d55a1eda774dfbab240a432607c17241d07Steven Toth				&hauppauge_hvr1500q_tunerconfig);
297d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		}
298d1987d55a1eda774dfbab240a432607c17241d07Steven Toth		break;
29907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky	case CX23885_BOARD_HAUPPAUGE_HVR1500:
30007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		i2c_bus = &dev->i2c_bus[1];
30107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		port->dvb.frontend = dvb_attach(s5h1409_attach,
30207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&hauppauge_hvr1500_config,
30307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky						&dev->i2c_bus[0].i2c_adap);
30407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		if (port->dvb.frontend != NULL) {
30507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct dvb_frontend *fe;
30607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			struct xc2028_config cfg = {
30707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_adap  = &i2c_bus->i2c_adap,
30807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.i2c_addr  = 0x61,
30907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.video_dev = port,
31007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.callback  = cx23885_hvr1500_xc3028_callback,
31107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
31207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			static struct xc2028_ctrl ctl = {
31307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.fname       = "xc3028-v27.fw",
31407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.max_len     = 64,
31507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				.scode_table = OREN538,
31607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			};
31707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky
31807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			fe = dvb_attach(xc2028_attach,
31907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky					port->dvb.frontend, &cfg);
32007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
32107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky				fe->ops.tuner_ops.set_config(fe, &ctl);
32207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		}
32307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky		break;
324d19770e5178a4bc49641711246360c25781d20a4Steven Toth	default:
325d19770e5178a4bc49641711246360c25781d20a4Steven Toth		printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n",
326d19770e5178a4bc49641711246360c25781d20a4Steven Toth		       dev->name);
327d19770e5178a4bc49641711246360c25781d20a4Steven Toth		break;
328d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
329d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (NULL == port->dvb.frontend) {
330d19770e5178a4bc49641711246360c25781d20a4Steven Toth		printk("%s: frontend initialization failed\n", dev->name);
331d19770e5178a4bc49641711246360c25781d20a4Steven Toth		return -1;
332d19770e5178a4bc49641711246360c25781d20a4Steven Toth	}
333d19770e5178a4bc49641711246360c25781d20a4Steven Toth
334d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* Put the analog decoder in standby to keep it quiet */
335f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky	cx23885_call_i2c_clients(i2c_bus, TUNER_SET_STANDBY, NULL);
336d19770e5178a4bc49641711246360c25781d20a4Steven Toth
3373ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky	if (port->dvb.frontend->ops.analog_ops.standby)
3383ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky		port->dvb.frontend->ops.analog_ops.standby(port->dvb.frontend);
3393ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky
340d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* register everything */
34144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	return videobuf_dvb_register(&port->dvb, THIS_MODULE, port,
34244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky				     &dev->pci->dev);
343d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
344d19770e5178a4bc49641711246360c25781d20a4Steven Toth
345d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_register(struct cx23885_tsport *port)
346d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
347d19770e5178a4bc49641711246360c25781d20a4Steven Toth	struct cx23885_dev *dev = port->dev;
348d19770e5178a4bc49641711246360c25781d20a4Steven Toth	int err;
349d19770e5178a4bc49641711246360c25781d20a4Steven Toth
35044a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	dprintk(1, "%s\n", __FUNCTION__);
35144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky	dprintk(1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
352d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->board,
353d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->name,
354d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->pci_bus,
355d19770e5178a4bc49641711246360c25781d20a4Steven Toth		dev->pci_slot);
356d19770e5178a4bc49641711246360c25781d20a4Steven Toth
357d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = -ENODEV;
358d19770e5178a4bc49641711246360c25781d20a4Steven Toth
359d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* dvb stuff */
360d19770e5178a4bc49641711246360c25781d20a4Steven Toth	printk("%s: cx23885 based dvb card\n", dev->name);
361aecfde539eeac11f269894413abf3b60cf74844fMauro Carvalho Chehab	videobuf_queue_pci_init(&port->dvb.dvbq, &dvb_qops, dev->pci, &port->slock,
36244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
36344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky			    sizeof(struct cx23885_buffer), port);
364d19770e5178a4bc49641711246360c25781d20a4Steven Toth	err = dvb_register(port);
365d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if (err != 0)
366d19770e5178a4bc49641711246360c25781d20a4Steven Toth		printk("%s() dvb_register failed err = %d\n", __FUNCTION__, err);
367d19770e5178a4bc49641711246360c25781d20a4Steven Toth
368d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return err;
369d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
370d19770e5178a4bc49641711246360c25781d20a4Steven Toth
371d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_unregister(struct cx23885_tsport *port)
372d19770e5178a4bc49641711246360c25781d20a4Steven Toth{
373d19770e5178a4bc49641711246360c25781d20a4Steven Toth	/* dvb */
374d19770e5178a4bc49641711246360c25781d20a4Steven Toth	if(port->dvb.frontend)
375d19770e5178a4bc49641711246360c25781d20a4Steven Toth		videobuf_dvb_unregister(&port->dvb);
376d19770e5178a4bc49641711246360c25781d20a4Steven Toth
377d19770e5178a4bc49641711246360c25781d20a4Steven Toth	return 0;
378d19770e5178a4bc49641711246360c25781d20a4Steven Toth}
37944a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky
38044a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky/*
38144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * Local variables:
38244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * c-basic-offset: 8
38344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky * End:
38444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael 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
38544a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky*/
386