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