cx23885-dvb.c revision c9b8b04b267f9a7e472daa06cdf6d4963d503d1f
1d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* 2d19770e5178a4bc49641711246360c25781d20a4Steven Toth * Driver for the Conexant CX23885 PCIe bridge 3d19770e5178a4bc49641711246360c25781d20a4Steven Toth * 46d8976164dd7d10d25fe940b8546265f60ad52cdSteven Toth * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org> 5d19770e5178a4bc49641711246360c25781d20a4Steven Toth * 6d19770e5178a4bc49641711246360c25781d20a4Steven Toth * This program is free software; you can redistribute it and/or modify 7d19770e5178a4bc49641711246360c25781d20a4Steven Toth * it under the terms of the GNU General Public License as published by 8d19770e5178a4bc49641711246360c25781d20a4Steven Toth * the Free Software Foundation; either version 2 of the License, or 9d19770e5178a4bc49641711246360c25781d20a4Steven Toth * (at your option) any later version. 10d19770e5178a4bc49641711246360c25781d20a4Steven Toth * 11d19770e5178a4bc49641711246360c25781d20a4Steven Toth * This program is distributed in the hope that it will be useful, 12d19770e5178a4bc49641711246360c25781d20a4Steven Toth * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d19770e5178a4bc49641711246360c25781d20a4Steven Toth * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d19770e5178a4bc49641711246360c25781d20a4Steven Toth * 15d19770e5178a4bc49641711246360c25781d20a4Steven Toth * GNU General Public License for more details. 16d19770e5178a4bc49641711246360c25781d20a4Steven Toth * 17d19770e5178a4bc49641711246360c25781d20a4Steven Toth * You should have received a copy of the GNU General Public License 18d19770e5178a4bc49641711246360c25781d20a4Steven Toth * along with this program; if not, write to the Free Software 19d19770e5178a4bc49641711246360c25781d20a4Steven Toth * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20d19770e5178a4bc49641711246360c25781d20a4Steven Toth */ 21d19770e5178a4bc49641711246360c25781d20a4Steven Toth 22d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/module.h> 23d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/init.h> 24d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/device.h> 25d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/fs.h> 26d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/kthread.h> 27d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/file.h> 28d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <linux/suspend.h> 29d19770e5178a4bc49641711246360c25781d20a4Steven Toth 30d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "cx23885.h" 31d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include <media/v4l2-common.h> 32d19770e5178a4bc49641711246360c25781d20a4Steven Toth 33d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "s5h1409.h" 3452b5045078b76ee86e210210601d45670eab22f1Michael Krufky#include "s5h1411.h" 35d19770e5178a4bc49641711246360c25781d20a4Steven Toth#include "mt2131.h" 363ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky#include "tda8290.h" 374041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky#include "tda18271.h" 389bc37caadffe8327683980b2323371691fa182e3Michael Krufky#include "lgdt330x.h" 39d1987d55a1eda774dfbab240a432607c17241d07Steven Toth#include "xc5000.h" 40b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth#include "tda10048.h" 4107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky#include "tuner-xc2028.h" 42827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky#include "tuner-simple.h" 436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dib7000p.h" 446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth#include "dibx000_common.h" 45aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth#include "zl10353.h" 4696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin#include "cx24116.h" 47d19770e5178a4bc49641711246360c25781d20a4Steven Toth 484513fc696e273d64ea32f2366748aed810316eccSteven Tothstatic unsigned int debug; 49d19770e5178a4bc49641711246360c25781d20a4Steven Toth 504513fc696e273d64ea32f2366748aed810316eccSteven Toth#define dprintk(level, fmt, arg...)\ 514513fc696e273d64ea32f2366748aed810316eccSteven Toth do { if (debug >= level)\ 524513fc696e273d64ea32f2366748aed810316eccSteven Toth printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\ 534513fc696e273d64ea32f2366748aed810316eccSteven Toth } while (0) 54d19770e5178a4bc49641711246360c25781d20a4Steven Toth 55d19770e5178a4bc49641711246360c25781d20a4Steven Toth/* ------------------------------------------------------------------ */ 56d19770e5178a4bc49641711246360c25781d20a4Steven Toth 573ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic unsigned int alt_tuner; 583ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkymodule_param(alt_tuner, int, 0644); 593ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael KrufkyMODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration"); 603ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky 6178e92006f410a4044f8c1760c25ac9d11d259aa2Janne GrunauDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 6278e92006f410a4044f8c1760c25ac9d11d259aa2Janne Grunau 633ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky/* ------------------------------------------------------------------ */ 643ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky 65d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_buf_setup(struct videobuf_queue *q, 66d19770e5178a4bc49641711246360c25781d20a4Steven Toth unsigned int *count, unsigned int *size) 67d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 68d19770e5178a4bc49641711246360c25781d20a4Steven Toth struct cx23885_tsport *port = q->priv_data; 69d19770e5178a4bc49641711246360c25781d20a4Steven Toth 70d19770e5178a4bc49641711246360c25781d20a4Steven Toth port->ts_packet_size = 188 * 4; 71d19770e5178a4bc49641711246360c25781d20a4Steven Toth port->ts_packet_count = 32; 72d19770e5178a4bc49641711246360c25781d20a4Steven Toth 73d19770e5178a4bc49641711246360c25781d20a4Steven Toth *size = port->ts_packet_size * port->ts_packet_count; 74d19770e5178a4bc49641711246360c25781d20a4Steven Toth *count = 32; 75d19770e5178a4bc49641711246360c25781d20a4Steven Toth return 0; 76d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 77d19770e5178a4bc49641711246360c25781d20a4Steven Toth 7844a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic int dvb_buf_prepare(struct videobuf_queue *q, 7944a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky struct videobuf_buffer *vb, enum v4l2_field field) 80d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 81d19770e5178a4bc49641711246360c25781d20a4Steven Toth struct cx23885_tsport *port = q->priv_data; 829c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth return cx23885_buf_prepare(q, port, (struct cx23885_buffer *)vb, field); 83d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 84d19770e5178a4bc49641711246360c25781d20a4Steven Toth 85d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) 86d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 87d19770e5178a4bc49641711246360c25781d20a4Steven Toth struct cx23885_tsport *port = q->priv_data; 889c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth cx23885_buf_queue(port, (struct cx23885_buffer *)vb); 89d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 90d19770e5178a4bc49641711246360c25781d20a4Steven Toth 9144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufkystatic void dvb_buf_release(struct videobuf_queue *q, 9244a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky struct videobuf_buffer *vb) 93d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 949c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth cx23885_free_buffer(q, (struct cx23885_buffer *)vb); 95d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 96d19770e5178a4bc49641711246360c25781d20a4Steven Toth 97d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic struct videobuf_queue_ops dvb_qops = { 98d19770e5178a4bc49641711246360c25781d20a4Steven Toth .buf_setup = dvb_buf_setup, 99d19770e5178a4bc49641711246360c25781d20a4Steven Toth .buf_prepare = dvb_buf_prepare, 100d19770e5178a4bc49641711246360c25781d20a4Steven Toth .buf_queue = dvb_buf_queue, 101d19770e5178a4bc49641711246360c25781d20a4Steven Toth .buf_release = dvb_buf_release, 102d19770e5178a4bc49641711246360c25781d20a4Steven Toth}; 103d19770e5178a4bc49641711246360c25781d20a4Steven Toth 10486184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct s5h1409_config hauppauge_generic_config = { 105d19770e5178a4bc49641711246360c25781d20a4Steven Toth .demod_address = 0x32 >> 1, 106d19770e5178a4bc49641711246360c25781d20a4Steven Toth .output_mode = S5H1409_SERIAL_OUTPUT, 107fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth .gpio = S5H1409_GPIO_ON, 1082b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky .qam_if = 44000, 109fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth .inversion = S5H1409_INVERSION_OFF, 110dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .status_mode = S5H1409_DEMODLOCKING, 111dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 112fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth}; 113fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth 114b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda10048_config hauppauge_hvr1200_config = { 115b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth .demod_address = 0x10 >> 1, 116b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth .output_mode = TDA10048_SERIAL_OUTPUT, 117b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth .fwbulkwritelen = TDA10048_BULKWRITE_200, 118b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth .inversion = TDA10048_INVERSION_ON 119b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth}; 120b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth 1213ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufkystatic struct s5h1409_config hauppauge_ezqam_config = { 1223ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky .demod_address = 0x32 >> 1, 1233ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky .output_mode = S5H1409_SERIAL_OUTPUT, 1243ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky .gpio = S5H1409_GPIO_OFF, 1253ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky .qam_if = 4000, 1263ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky .inversion = S5H1409_INVERSION_ON, 127dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .status_mode = S5H1409_DEMODLOCKING, 128dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 1293ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky}; 1303ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky 131fc959befe0f0e4647bb4e326e3ae55875401888aSteven Tothstatic struct s5h1409_config hauppauge_hvr1800lp_config = { 132fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth .demod_address = 0x32 >> 1, 133fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth .output_mode = S5H1409_SERIAL_OUTPUT, 134d19770e5178a4bc49641711246360c25781d20a4Steven Toth .gpio = S5H1409_GPIO_OFF, 1352b03238a79295aff30afc3d9a82afa617fd33971Michael Krufky .qam_if = 44000, 136fe475163ff9680495af3b1b5b7633ea7a42e4185Steven Toth .inversion = S5H1409_INVERSION_OFF, 137dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .status_mode = S5H1409_DEMODLOCKING, 138dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 139d19770e5178a4bc49641711246360c25781d20a4Steven Toth}; 140d19770e5178a4bc49641711246360c25781d20a4Steven Toth 14107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufkystatic struct s5h1409_config hauppauge_hvr1500_config = { 14207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .demod_address = 0x32 >> 1, 14307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .output_mode = S5H1409_SERIAL_OUTPUT, 14407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .gpio = S5H1409_GPIO_OFF, 14507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .inversion = S5H1409_INVERSION_OFF, 146dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .status_mode = S5H1409_DEMODLOCKING, 147dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 14807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky}; 14907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky 15086184e06da4b71fc24ae9505ec60ce95c098d0deSteven Tothstatic struct mt2131_config hauppauge_generic_tunerconfig = { 151a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth 0x61 152a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth}; 153a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth 1549bc37caadffe8327683980b2323371691fa182e3Michael Krufkystatic struct lgdt330x_config fusionhdtv_5_express = { 1559bc37caadffe8327683980b2323371691fa182e3Michael Krufky .demod_address = 0x0e, 1569bc37caadffe8327683980b2323371691fa182e3Michael Krufky .demod_chip = LGDT3303, 1579bc37caadffe8327683980b2323371691fa182e3Michael Krufky .serial_mpeg = 0x40, 1589bc37caadffe8327683980b2323371691fa182e3Michael Krufky}; 1599bc37caadffe8327683980b2323371691fa182e3Michael Krufky 160d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct s5h1409_config hauppauge_hvr1500q_config = { 161d1987d55a1eda774dfbab240a432607c17241d07Steven Toth .demod_address = 0x32 >> 1, 162d1987d55a1eda774dfbab240a432607c17241d07Steven Toth .output_mode = S5H1409_SERIAL_OUTPUT, 163d1987d55a1eda774dfbab240a432607c17241d07Steven Toth .gpio = S5H1409_GPIO_ON, 164d1987d55a1eda774dfbab240a432607c17241d07Steven Toth .qam_if = 44000, 165d1987d55a1eda774dfbab240a432607c17241d07Steven Toth .inversion = S5H1409_INVERSION_OFF, 166dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .status_mode = S5H1409_DEMODLOCKING, 167dfc1c08aab447d49230dacb390d3f2263584d28fSteven Toth .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 168d1987d55a1eda774dfbab240a432607c17241d07Steven Toth}; 169d1987d55a1eda774dfbab240a432607c17241d07Steven Toth 170335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct s5h1409_config dvico_s5h1409_config = { 171335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .demod_address = 0x32 >> 1, 172335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .output_mode = S5H1409_SERIAL_OUTPUT, 173335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .gpio = S5H1409_GPIO_ON, 174335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .qam_if = 44000, 175335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .inversion = S5H1409_INVERSION_OFF, 176335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .status_mode = S5H1409_DEMODLOCKING, 177335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 178335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky}; 179335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky 18052b5045078b76ee86e210210601d45670eab22f1Michael Krufkystatic struct s5h1411_config dvico_s5h1411_config = { 18152b5045078b76ee86e210210601d45670eab22f1Michael Krufky .output_mode = S5H1411_SERIAL_OUTPUT, 18252b5045078b76ee86e210210601d45670eab22f1Michael Krufky .gpio = S5H1411_GPIO_ON, 18352b5045078b76ee86e210210601d45670eab22f1Michael Krufky .qam_if = S5H1411_IF_44000, 18452b5045078b76ee86e210210601d45670eab22f1Michael Krufky .vsb_if = S5H1411_IF_44000, 18552b5045078b76ee86e210210601d45670eab22f1Michael Krufky .inversion = S5H1411_INVERSION_OFF, 18652b5045078b76ee86e210210601d45670eab22f1Michael Krufky .status_mode = S5H1411_DEMODLOCKING, 18752b5045078b76ee86e210210601d45670eab22f1Michael Krufky .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 18852b5045078b76ee86e210210601d45670eab22f1Michael Krufky}; 18952b5045078b76ee86e210210601d45670eab22f1Michael Krufky 190d1987d55a1eda774dfbab240a432607c17241d07Steven Tothstatic struct xc5000_config hauppauge_hvr1500q_tunerconfig = { 191e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth .i2c_address = 0x61, 192e12671cf0c3c8460dfa3ab945023803612827fb7Steven Toth .if_khz = 5380, 193d1987d55a1eda774dfbab240a432607c17241d07Steven Toth}; 194d1987d55a1eda774dfbab240a432607c17241d07Steven Toth 195335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufkystatic struct xc5000_config dvico_xc5000_tunerconfig = { 196335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .i2c_address = 0x64, 197335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky .if_khz = 5380, 198335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky}; 199335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky 2004041f1a58774249f5f26163e68b844521ece1fb4Michael Krufkystatic struct tda829x_config tda829x_no_probe = { 2014041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky .probe_tuner = TDA829X_DONT_PROBE, 2024041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky}; 2034041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky 204f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_std_map hauppauge_tda18271_std_map = { 205c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky .atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3, 206c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky .if_lvl = 6, .rfagc_top = 0x37 }, 207c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0, 208c0dc0c1122b585193dd6650c749e919542dd3e23Michael Krufky .if_lvl = 6, .rfagc_top = 0x37 }, 209f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky}; 210f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky 211f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufkystatic struct tda18271_config hauppauge_tda18271_config = { 212f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky .std_map = &hauppauge_tda18271_std_map, 213f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky .gate = TDA18271_GATE_ANALOG, 214f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky}; 215f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky 216b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Tothstatic struct tda18271_config hauppauge_hvr1200_tuner_config = { 217b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth .gate = TDA18271_GATE_ANALOG, 218b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth}; 219b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth 220b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_agc_config xc3028_agc_config = { 2216676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth BAND_VHF | BAND_UHF, /* band_caps */ 2226676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2236676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0, 2246676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, 2256676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, 2266676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * P_agc_nb_est=2, P_agc_write=0 2276676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth */ 2286676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | 2296676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */ 2306676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2316676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 712, /* inv_gain */ 2326676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 21, /* time_stabiliz */ 2336676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2346676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* alpha_level */ 2356676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 118, /* thlock */ 2366676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2376676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* wbd_inv */ 2386676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2867, /* wbd_ref */ 2396676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* wbd_sel */ 2406676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2, /* wbd_alpha */ 2416676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2426676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_max */ 2436676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_min */ 2446676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 39718, /* agc2_max */ 2456676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 9930, /* agc2_min */ 2466676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_pt1 */ 2476676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_pt2 */ 2486676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_pt3 */ 2496676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_slope1 */ 2506676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc1_slope2 */ 2516676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* agc2_pt1 */ 2526676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 128, /* agc2_pt2 */ 2536676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 29, /* agc2_slope1 */ 2546676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 29, /* agc2_slope2 */ 2556676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2566676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 17, /* alpha_mant */ 2576676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 27, /* alpha_exp */ 2586676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 23, /* beta_mant */ 2596676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 51, /* beta_exp */ 2606676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2616676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 1, /* perform_agc_softsplit */ 2626676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth}; 2636676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2646676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth/* PLL Configuration for COFDM BW_MHz = 8.000000 2656676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth * With external clock = 30.000000 */ 266b1721d0da266b4af8cb4419473b4ca36206ab200Harvey Harrisonstatic struct dibx000_bandwidth_config xc3028_bw_config = { 2676676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 60000, /* internal */ 2686676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 30000, /* sampling */ 2696676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 1, /* pll_cfg: prediv */ 2706676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 8, /* pll_cfg: ratio */ 2716676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 3, /* pll_cfg: range */ 2726676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 1, /* pll_cfg: reset */ 2736676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* pll_cfg: bypass */ 2746676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* misc: refdiv */ 2756676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* misc: bypclk_div */ 2766676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 1, /* misc: IO_CLK_en_core */ 2776676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 1, /* misc: ADClkSrc */ 2786676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0, /* misc: modulo */ 2796676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */ 2806676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */ 2816676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 20452225, /* timf */ 2826676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 30000000 /* xtal_hz */ 2836676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth}; 2846676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2856676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Tothstatic struct dib7000p_config hauppauge_hvr1400_dib7000_config = { 2866676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .output_mpeg2_in_188_bytes = 1, 2876676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .hostbus_diversity = 1, 2886676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .tuner_is_baseband = 0, 2896676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .update_lna = NULL, 2906676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2916676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .agc_config_count = 1, 2926676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .agc = &xc3028_agc_config, 2936676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .bw = &xc3028_bw_config, 2946676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2956676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2966676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2976676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2986676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 2996676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .pwm_freq_div = 0, 3006676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .agc_control = NULL, 3016676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .spur_protect = 0, 3026676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 3036676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .output_mode = OUTMODE_MPEG2_SERIAL, 3046676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth}; 3056676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 306aef2d186e381816733fa15d67ad63bd99254cb9eSteven Tothstatic struct zl10353_config dvico_fusionhdtv_xc3028 = { 307aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .demod_address = 0x0f, 308aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .if2 = 45600, 309aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .no_tuner = 1, 310aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth}; 311aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth 31296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 31396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin{ 31496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin struct cx23885_tsport *port = fe->dvb->priv; 31596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin struct cx23885_dev *dev = port->dev; 31696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin 31796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin if (voltage == SEC_VOLTAGE_18) 31896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin cx_write(MC417_RWD, 0x00001e00);/* GPIO-13 high */ 31996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin else if (voltage == SEC_VOLTAGE_13) 32096318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin cx_write(MC417_RWD, 0x00001a00);/* GPIO-13 low */ 32196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin else 32296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin cx_write(MC417_RWD, 0x00001800);/* GPIO-12 low */ 32396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin return 0; 32496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin} 32596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin 32696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianinstatic struct cx24116_config tbs_cx24116_config = { 32796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin .demod_address = 0x05, 32896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin}; 32996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin 330579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianinstatic struct cx24116_config tevii_cx24116_config = { 331579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin .demod_address = 0x55, 332579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin}; 333579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin 334c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianinstatic struct cx24116_config dvbworld_cx24116_config = { 335c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin .demod_address = 0x05, 336c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin}; 337c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin 338d19770e5178a4bc49641711246360c25781d20a4Steven Tothstatic int dvb_register(struct cx23885_tsport *port) 339d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 340d19770e5178a4bc49641711246360c25781d20a4Steven Toth struct cx23885_dev *dev = port->dev; 341f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky struct cx23885_i2c *i2c_bus = NULL; 342363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth struct videobuf_dvb_frontend *fe0; 343363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth 344f972e0bd9361594071d3e68e2342c53b51a1d42bDarron Broad /* Get the first frontend */ 34592abe9ee374599179033f039b095864a9cf74593Darron Broad fe0 = videobuf_dvb_get_frontend(&port->frontends, 1); 346363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (!fe0) 347363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth return -EINVAL; 348d19770e5178a4bc49641711246360c25781d20a4Steven Toth 349d19770e5178a4bc49641711246360c25781d20a4Steven Toth /* init struct videobuf_dvb */ 350363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.name = dev->name; 351d19770e5178a4bc49641711246360c25781d20a4Steven Toth 352d19770e5178a4bc49641711246360c25781d20a4Steven Toth /* init frontend */ 353d19770e5178a4bc49641711246360c25781d20a4Steven Toth switch (dev->board) { 354a77743bc2d29197d48a6f4ae9f8f9e0f0b0ba5d7Steven Toth case CX23885_BOARD_HAUPPAUGE_HVR1250: 355f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky i2c_bus = &dev->i2c_bus[0]; 356363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(s5h1409_attach, 35786184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth &hauppauge_generic_config, 358f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky &i2c_bus->i2c_adap); 359363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 360363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(mt2131_attach, fe0->dvb.frontend, 361f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky &i2c_bus->i2c_adap, 36286184e06da4b71fc24ae9505ec60ce95c098d0deSteven Toth &hauppauge_generic_tunerconfig, 0); 363d19770e5178a4bc49641711246360c25781d20a4Steven Toth } 364d19770e5178a4bc49641711246360c25781d20a4Steven Toth break; 3653ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky case CX23885_BOARD_HAUPPAUGE_HVR1800: 3663ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky i2c_bus = &dev->i2c_bus[0]; 36792abe9ee374599179033f039b095864a9cf74593Darron Broad switch (alt_tuner) { 3683ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky case 1: 369363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = 3703ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky dvb_attach(s5h1409_attach, 3713ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &hauppauge_ezqam_config, 3723ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &i2c_bus->i2c_adap); 373363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 374363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(tda829x_attach, fe0->dvb.frontend, 3753ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &dev->i2c_bus[1].i2c_adap, 0x42, 3764041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky &tda829x_no_probe); 377363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(tda18271_attach, fe0->dvb.frontend, 3784041f1a58774249f5f26163e68b844521ece1fb4Michael Krufky 0x60, &dev->i2c_bus[1].i2c_adap, 379f21e0d7f0513e743b14df3197fdeeb9a9b7edbb2Michael Krufky &hauppauge_tda18271_config); 3803ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky } 3813ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky break; 3823ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky case 0: 3833ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky default: 384363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = 3853ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky dvb_attach(s5h1409_attach, 3863ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &hauppauge_generic_config, 3873ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &i2c_bus->i2c_adap); 388363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) 389363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(mt2131_attach, fe0->dvb.frontend, 3903ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &i2c_bus->i2c_adap, 3913ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky &hauppauge_generic_tunerconfig, 0); 3923ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky break; 3933ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky } 3943ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky break; 395fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth case CX23885_BOARD_HAUPPAUGE_HVR1800lp: 396f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky i2c_bus = &dev->i2c_bus[0]; 397363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(s5h1409_attach, 398fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth &hauppauge_hvr1800lp_config, 399f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky &i2c_bus->i2c_adap); 400363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 401363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(mt2131_attach, fe0->dvb.frontend, 402f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky &i2c_bus->i2c_adap, 403fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth &hauppauge_generic_tunerconfig, 0); 404fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth } 405fc959befe0f0e4647bb4e326e3ae55875401888aSteven Toth break; 4069bc37caadffe8327683980b2323371691fa182e3Michael Krufky case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP: 407f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky i2c_bus = &dev->i2c_bus[0]; 408363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(lgdt330x_attach, 4099bc37caadffe8327683980b2323371691fa182e3Michael Krufky &fusionhdtv_5_express, 410f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky &i2c_bus->i2c_adap); 411363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 412363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(simple_tuner_attach, fe0->dvb.frontend, 413827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky &i2c_bus->i2c_adap, 0x61, 414827855d39761889aecc7c29385d9c4989b43d01dMichael Krufky TUNER_LG_TDVS_H06XF); 4159bc37caadffe8327683980b2323371691fa182e3Michael Krufky } 4169bc37caadffe8327683980b2323371691fa182e3Michael Krufky break; 417d1987d55a1eda774dfbab240a432607c17241d07Steven Toth case CX23885_BOARD_HAUPPAUGE_HVR1500Q: 418d1987d55a1eda774dfbab240a432607c17241d07Steven Toth i2c_bus = &dev->i2c_bus[1]; 419363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(s5h1409_attach, 420d1987d55a1eda774dfbab240a432607c17241d07Steven Toth &hauppauge_hvr1500q_config, 421d1987d55a1eda774dfbab240a432607c17241d07Steven Toth &dev->i2c_bus[0].i2c_adap); 422363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) 423363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(xc5000_attach, fe0->dvb.frontend, 42430650961907368b1077cade35455fe931b14da6bMichael Krufky &i2c_bus->i2c_adap, 42530650961907368b1077cade35455fe931b14da6bMichael Krufky &hauppauge_hvr1500q_tunerconfig); 426d1987d55a1eda774dfbab240a432607c17241d07Steven Toth break; 42707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky case CX23885_BOARD_HAUPPAUGE_HVR1500: 42807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky i2c_bus = &dev->i2c_bus[1]; 429363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(s5h1409_attach, 43007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky &hauppauge_hvr1500_config, 43107b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky &dev->i2c_bus[0].i2c_adap); 432363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 43307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky struct dvb_frontend *fe; 43407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky struct xc2028_config cfg = { 43507b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .i2c_adap = &i2c_bus->i2c_adap, 43607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .i2c_addr = 0x61, 43707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky }; 43807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky static struct xc2028_ctrl ctl = { 439ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky .fname = XC2028_DEFAULT_FIRMWARE, 44007b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky .max_len = 64, 44133e5316113b1a472f54579f014739e4a4a53d704Mauro Carvalho Chehab .scode_table = XC3028_FE_OREN538, 44207b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky }; 44307b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky 44407b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky fe = dvb_attach(xc2028_attach, 445363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend, &cfg); 44607b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) 44707b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky fe->ops.tuner_ops.set_config(fe, &ctl); 44807b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky } 44907b4a835d42d6d59e84cbafdc8b7090f97d7b67aMichael Krufky break; 450b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth case CX23885_BOARD_HAUPPAUGE_HVR1200: 451a780a31cee55e01e7b479244e7907ba842c120a0Steven Toth case CX23885_BOARD_HAUPPAUGE_HVR1700: 452b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth i2c_bus = &dev->i2c_bus[0]; 453363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(tda10048_attach, 454b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth &hauppauge_hvr1200_config, 455b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth &i2c_bus->i2c_adap); 456363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 457363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(tda829x_attach, fe0->dvb.frontend, 458b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth &dev->i2c_bus[1].i2c_adap, 0x42, 459b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth &tda829x_no_probe); 460363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(tda18271_attach, fe0->dvb.frontend, 461b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth 0x60, &dev->i2c_bus[1].i2c_adap, 462b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth &hauppauge_hvr1200_tuner_config); 463b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth } 464b3ea01668907bdb32b0c690d28f9f2b1298bd258Steven Toth break; 4656676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth case CX23885_BOARD_HAUPPAUGE_HVR1400: 4666676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth i2c_bus = &dev->i2c_bus[0]; 467363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(dib7000p_attach, 4686676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth &i2c_bus->i2c_adap, 4696676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 0x12, &hauppauge_hvr1400_dib7000_config); 470363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 4716676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth struct dvb_frontend *fe; 4726676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth struct xc2028_config cfg = { 4736676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .i2c_adap = &dev->i2c_bus[1].i2c_adap, 4746676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .i2c_addr = 0x64, 4756676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth }; 4766676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth static struct xc2028_ctrl ctl = { 477ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky .fname = XC3028L_DEFAULT_FIRMWARE, 4786676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .max_len = 64, 4796676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth .demod = 5000, 4809c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth /* This is true for all demods with 4819c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth v36 firmware? */ 4820975fc68719c75cbe14132c6f0dead57cd4d5210Mauro Carvalho Chehab .type = XC2028_D2633, 4836676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth }; 4846676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth 4856676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth fe = dvb_attach(xc2028_attach, 486363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend, &cfg); 4876676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) 4886676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth fe->ops.tuner_ops.set_config(fe, &ctl); 4896676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth } 4906676237398d0c2e61e5a3a27e0951f60d6ef6fe3Steven Toth break; 491335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP: 492335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky i2c_bus = &dev->i2c_bus[port->nr - 1]; 493335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky 494363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(s5h1409_attach, 495335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky &dvico_s5h1409_config, 496335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky &i2c_bus->i2c_adap); 497363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend == NULL) 498363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(s5h1411_attach, 49952b5045078b76ee86e210210601d45670eab22f1Michael Krufky &dvico_s5h1411_config, 50052b5045078b76ee86e210210601d45670eab22f1Michael Krufky &i2c_bus->i2c_adap); 501363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) 502363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth dvb_attach(xc5000_attach, fe0->dvb.frontend, 50330650961907368b1077cade35455fe931b14da6bMichael Krufky &i2c_bus->i2c_adap, 50430650961907368b1077cade35455fe931b14da6bMichael Krufky &dvico_xc5000_tunerconfig); 505335377b73dd0b0af1fbd283ceae6fcb87a747885Michael Krufky break; 506aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: { 507aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth i2c_bus = &dev->i2c_bus[port->nr - 1]; 508aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth 509363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(zl10353_attach, 510aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth &dvico_fusionhdtv_xc3028, 511aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth &i2c_bus->i2c_adap); 512363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 513aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth struct dvb_frontend *fe; 514aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth struct xc2028_config cfg = { 515aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .i2c_adap = &i2c_bus->i2c_adap, 516aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .i2c_addr = 0x61, 517aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth }; 518aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth static struct xc2028_ctrl ctl = { 519ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky .fname = XC2028_DEFAULT_FIRMWARE, 520aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .max_len = 64, 521aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth .demod = XC3028_FE_ZARLINK456, 522aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth }; 523aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth 524363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, 525aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth &cfg); 526aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) 527aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth fe->ops.tuner_ops.set_config(fe, &ctl); 528aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth } 529aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth break; 530aef2d186e381816733fa15d67ad63bd99254cb9eSteven Toth } 5314c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H: 5329bb1b7e879091f09fc677dca10c5e132b68a9da3Igor M. Liplianin case CX23885_BOARD_COMPRO_VIDEOMATE_E650F: 5334c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth i2c_bus = &dev->i2c_bus[0]; 5344c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth 535363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend = dvb_attach(zl10353_attach, 5364c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth &dvico_fusionhdtv_xc3028, 5374c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth &i2c_bus->i2c_adap); 538363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend != NULL) { 5394c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth struct dvb_frontend *fe; 5404c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth struct xc2028_config cfg = { 5414c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth .i2c_adap = &dev->i2c_bus[1].i2c_adap, 5424c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth .i2c_addr = 0x61, 5434c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth }; 5444c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth static struct xc2028_ctrl ctl = { 545ef80bfeb30f82fb718731a3323a75ae08396a4eaMichael Krufky .fname = XC2028_DEFAULT_FIRMWARE, 5464c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth .max_len = 64, 5474c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth .demod = XC3028_FE_ZARLINK456, 5484c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth }; 5494c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth 550363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, 5514c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth &cfg); 5524c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) 5534c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth fe->ops.tuner_ops.set_config(fe, &ctl); 5544c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth } 5554c56b04af67211c4311dd9961ce5aba86b96ba9cSteven Toth break; 55696318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin case CX23885_BOARD_TBS_6920: 55796318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin i2c_bus = &dev->i2c_bus[0]; 55896318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin 55996318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin fe0->dvb.frontend = dvb_attach(cx24116_attach, 56096318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin &tbs_cx24116_config, 56196318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin &i2c_bus->i2c_adap); 56296318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin if (fe0->dvb.frontend != NULL) 56396318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage; 56496318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin 56596318d0cca02a91b22a2e1a1097ffeea0b3becaeIgor M. Liplianin break; 566579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin case CX23885_BOARD_TEVII_S470: 567579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin i2c_bus = &dev->i2c_bus[1]; 568579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin 569579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin fe0->dvb.frontend = dvb_attach(cx24116_attach, 570579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin &tevii_cx24116_config, 571579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin &i2c_bus->i2c_adap); 572579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin if (fe0->dvb.frontend != NULL) 573579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage; 574579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin 575579943f5487baa7f9fd8e3189a4f357d6b06c76dIgor M. Liplianin break; 576c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin case CX23885_BOARD_DVBWORLD_2005: 577c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin i2c_bus = &dev->i2c_bus[1]; 578c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin 579c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin fe0->dvb.frontend = dvb_attach(cx24116_attach, 580c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin &dvbworld_cx24116_config, 581c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin &i2c_bus->i2c_adap); 582c9b8b04b267f9a7e472daa06cdf6d4963d503d1fIgor M. Liplianin break; 583d19770e5178a4bc49641711246360c25781d20a4Steven Toth default: 5849c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth printk(KERN_INFO "%s: The frontend of your DVB/ATSC card " 5859c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth " isn't supported yet\n", 586d19770e5178a4bc49641711246360c25781d20a4Steven Toth dev->name); 587d19770e5178a4bc49641711246360c25781d20a4Steven Toth break; 588d19770e5178a4bc49641711246360c25781d20a4Steven Toth } 589363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (NULL == fe0->dvb.frontend) { 5909c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth printk(KERN_ERR "%s: frontend initialization failed\n", 5919c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth dev->name); 592d19770e5178a4bc49641711246360c25781d20a4Steven Toth return -1; 593d19770e5178a4bc49641711246360c25781d20a4Steven Toth } 594d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufky /* define general-purpose callback pointer */ 595363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend->callback = cx23885_tuner_callback; 596d19770e5178a4bc49641711246360c25781d20a4Steven Toth 597d19770e5178a4bc49641711246360c25781d20a4Steven Toth /* Put the analog decoder in standby to keep it quiet */ 598f139fa71c03d80c1d1ee60aa4b0a3ec7a14d45f9Michael Krufky cx23885_call_i2c_clients(i2c_bus, TUNER_SET_STANDBY, NULL); 599d19770e5178a4bc49641711246360c25781d20a4Steven Toth 600363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth if (fe0->dvb.frontend->ops.analog_ops.standby) 601363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend); 6023ba71d2194500d1a9fef1b8491b9e0c168e7d46eMichael Krufky 603d19770e5178a4bc49641711246360c25781d20a4Steven Toth /* register everything */ 604363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth return videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port, 60559b1842da1c6f33ad2e8da82d3dfb3445751d964Darron Broad &dev->pci->dev, adapter_nr, 0); 606363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth 607d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 608d19770e5178a4bc49641711246360c25781d20a4Steven Toth 609d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_register(struct cx23885_tsport *port) 610d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 611363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth 612363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth struct videobuf_dvb_frontend *fe0; 613d19770e5178a4bc49641711246360c25781d20a4Steven Toth struct cx23885_dev *dev = port->dev; 614eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth int err, i; 615eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth 616eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth /* Here we need to allocate the correct number of frontends, 617eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * as reflected in the cards struct. The reality is that currrently 618eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * no cx23885 boards support this - yet. But, if we don't modify this 619eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * code then the second frontend would never be allocated (later) 620eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * and fail with error before the attach in dvb_register(). 621eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * Without these changes we risk an OOPS later. The changes here 622eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * are for safety, and should provide a good foundation for the 623eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * future addition of any multi-frontend cx23885 based boards. 624eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth */ 625eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__, 626eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth port->num_frontends); 627d19770e5178a4bc49641711246360c25781d20a4Steven Toth 628eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth for (i = 1; i <= port->num_frontends; i++) { 62996b7a1a838fb5b8746fc22f4ff3cef358bf59f35Darron Broad if (videobuf_dvb_alloc_frontend( 6309c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth &port->frontends, i) == NULL) { 631eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth printk(KERN_ERR "%s() failed to alloc\n", __func__); 632eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth return -ENOMEM; 633eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth } 634eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth 635eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth fe0 = videobuf_dvb_get_frontend(&port->frontends, i); 636eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth if (!fe0) 637eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth err = -EINVAL; 638363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth 639eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth dprintk(1, "%s\n", __func__); 6409c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth dprintk(1, " ->probed by Card=%d Name=%s, PCI %02x:%02x\n", 641eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth dev->board, 642eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth dev->name, 643eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth dev->pci_bus, 644eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth dev->pci_slot); 645d19770e5178a4bc49641711246360c25781d20a4Steven Toth 646eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth err = -ENODEV; 647d19770e5178a4bc49641711246360c25781d20a4Steven Toth 648eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth /* dvb stuff */ 649eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth /* We have to init the queue for each frontend on a port. */ 6509c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth printk(KERN_INFO "%s: cx23885 based dvb card\n", dev->name); 6519c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth videobuf_queue_sg_init(&fe0->dvb.dvbq, &dvb_qops, 6529c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth &dev->pci->dev, &port->slock, 65344a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP, 65444a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky sizeof(struct cx23885_buffer), port); 655eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth } 656d19770e5178a4bc49641711246360c25781d20a4Steven Toth err = dvb_register(port); 657d19770e5178a4bc49641711246360c25781d20a4Steven Toth if (err != 0) 6589c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth printk(KERN_ERR "%s() dvb_register failed err = %d\n", 6599c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth __func__, err); 660d19770e5178a4bc49641711246360c25781d20a4Steven Toth 661d19770e5178a4bc49641711246360c25781d20a4Steven Toth return err; 662d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 663d19770e5178a4bc49641711246360c25781d20a4Steven Toth 664d19770e5178a4bc49641711246360c25781d20a4Steven Tothint cx23885_dvb_unregister(struct cx23885_tsport *port) 665d19770e5178a4bc49641711246360c25781d20a4Steven Toth{ 666363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth struct videobuf_dvb_frontend *fe0; 667363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth 668eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth /* FIXME: in an error condition where the we have 669eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * an expected number of frontends (attach problem) 670eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * then this might not clean up correctly, if 1 671eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * is invalid. 672eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * This comment only applies to future boards IF they 673eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth * implement MFE support. 674eb0c58bb1325593840af0e7fbb4dbc654e756591Steven Toth */ 67592abe9ee374599179033f039b095864a9cf74593Darron Broad fe0 = videobuf_dvb_get_frontend(&port->frontends, 1); 6769c8ced511e154faf1a7af3f1abdfff45dccbe54aSteven Toth if (fe0->dvb.frontend) 677363c35fc448943c3d6121332d28bcda2d2fbf87cSteven Toth videobuf_dvb_unregister_bus(&port->frontends); 678d19770e5178a4bc49641711246360c25781d20a4Steven Toth 679d19770e5178a4bc49641711246360c25781d20a4Steven Toth return 0; 680d19770e5178a4bc49641711246360c25781d20a4Steven Toth} 68144a6481dcd9ec835bbd608b1b2ee47ee62c7e1d8Michael Krufky 682