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