11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * budget.c: driver for the SAA7146 based Budget DVB cards 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Compiled from various sources by Michael Hunold <michael@mihu.de> 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999-2002 Ralph Metzler 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * & Marcus Metzler for convergence integrated media GmbH 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 26feb2004 Support for FS Activy Card (Grundig tuner) by 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Michael Dreher <michael@5dot1.de>, 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Oliver Endriss <o.endriss@gmx.de> and 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Andreas 'randy' Weinberger 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modify it under the terms of the GNU General Public License 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as published by the Free Software Foundation; either version 2 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the License, or (at your option) any later version. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details. 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Or, point your browser to http://www.gnu.org/copyleft/gpl.html 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 34631dd1a885b6d7e9f6f51b4e5b311c2bb04c323cJustin P. Mattock * the project's page is at http://www.linuxtv.org/ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "budget.h" 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "stv0299.h" 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ves1x93.h" 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ves1820.h" 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "l64781.h" 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "tda8083.h" 4396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey#include "s5h1420.h" 44adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey#include "tda10086.h" 45adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey#include "tda826x.h" 462f27bdce972ceb97a2fd109a77546c37aa499fc9Oliver Endriss#include "lnbp21.h" 47265366e8fb8c31706711aea5f79d763816a968dbPerceval Anichini#include "bsru6.h" 4887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss#include "bsbe1.h" 4981ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss#include "tdhd1.h" 5062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel#include "stv6110x.h" 5162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel#include "stv090x.h" 5262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel#include "isl6423.h" 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 54bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissstatic int diseqc_method; 55bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissmodule_param(diseqc_method, int, 0444); 56bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver EndrissMODULE_PARM_DESC(diseqc_method, "Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)"); 57bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss 5826dc4d0487bb8b8de32d09c18a83c63d622156f2Janne GrunauDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 5926dc4d0487bb8b8de32d09c18a83c63d622156f2Janne Grunau 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void Set22K (struct budget *budget, int state) 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO)); 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Diseqc functions only for TT Budget card */ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* taken from the Skyvision DVB driver by 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Ralph Metzler <rjkm@metzlerbros.de> */ 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendBit (struct budget *budget, int data) 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 500 : 1000); 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 1000 : 500); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendByte (struct budget *budget, int data) 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i, par=1, d; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=7; i>=0; i--) { 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds d = (data>>i)&1; 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds par ^= d; 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, d); 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, par); 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, unsigned long burst) 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=0; i<len; i++) 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, msg[i]); 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst!=-1) { 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst) 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, 0xff); 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 117db210426d48998ed412f267b28cf6e62ea0496a8Thierry MERLE mdelay(12); 118db210426d48998ed412f267b28cf6e62ea0496a8Thierry MERLE udelay(500); 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(20); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Routines for the Fujitsu Siemens Activy budget card 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 22 kHz tone and DiSEqC are handled by the frontend. 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Voltage must be set here. 131f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss * GPIO 1: LNBP EN, GPIO 2: LNBP VSEL 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SetVoltage_Activy (struct budget *budget, fe_sec_voltage_t voltage) 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (voltage) { 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_13: 141f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTLO); 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_18: 145f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI); 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 148f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss case SEC_VOLTAGE_OFF: 149f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); 150f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss break; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int siemens_budget_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return SetVoltage_Activy (budget, voltage); 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (tone) { 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_ON: 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 1); 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_OFF: 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 0); 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd) 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, 0, NULL, minicmd); 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20314d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int alps_bsrv2_tuner_set_params(struct dvb_frontend *fe) 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2051466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwr = 0; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 buf[4]; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; 2101466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab u32 div = (c->frequency + 479500) / 125; 2111466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab 2121466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab if (c->frequency > 2000000) 2131466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 3; 2141466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency > 1800000) 2151466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 2; 2161466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency > 1600000) 2171466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 1; 2181466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency > 1200000) 2191466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 0; 2201466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency >= 1100000) 2211466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 1; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else pwr = 2; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0] = (div >> 8) & 0x7f; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[1] = div & 0xff; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[2] = ((div & 0x18000) >> 10) | 0x95; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[3] = (pwr << 6) | 0x30; 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2299101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab // NOTE: since we're using a prescaler of 2, we set the 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // divisor frequency to 62.5kHz and divide by 125 above 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 232dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 233dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1x93_config alps_bsrv2_config = 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x08, 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 90100000UL, 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert_pwm = 0, 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 24514d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int alps_tdbe2_tuner_set_params(struct dvb_frontend *fe) 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2471466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) }; 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2531466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = (c->frequency + 35937500 + 31250) / 62500; 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x85 | ((div >> 10) & 0x60); 2581466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab data[3] = (c->frequency < 174000000 ? 0x88 : c->frequency < 470000000 ? 0x84 : 0x81); 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 260dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 261dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1820_config alps_tdbe2_config = { 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x09, 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 57840000UL, 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert = 1, 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .selagc = VES1820_SELAGC_SIGNAMPERR, 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 27314d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int grundig_29504_401_tuner_set_params(struct dvb_frontend *fe) 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2751466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 276faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct budget *budget = fe->dvb->priv; 277faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss u8 *tuner_addr = fe->tuner_priv; 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cfg, cpump, band_select; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 281faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct i2c_msg msg = { .flags = 0, .buf = data, .len = sizeof(data) }; 282faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 283faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (tuner_addr) 284faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = *tuner_addr; 285faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss else 286faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = 0x61; 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2881466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = (36125000 + c->frequency) / 166666; 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cfg = 0x88; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2921466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab if (c->frequency < 175000000) 2931466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 2; 2941466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 390000000) 2951466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 1; 2961466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 470000000) 2971466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 2; 2981466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 750000000) 2991466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 1; 3001466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else 3011466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 3; 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3031466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab if (c->frequency < 175000000) 3041466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab band_select = 0x0e; 3051466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 470000000) 3061466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab band_select = 0x05; 3071466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else 3081466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab band_select = 0x03; 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = ((div >> 10) & 0x60) | cfg; 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = (cpump << 6) | band_select; 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 315dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 316dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct l64781_config grundig_29504_401_config = { 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x55, 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 325faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic struct l64781_config grundig_29504_401_config_activy = { 326faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss .demod_address = 0x54, 327faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss}; 328faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 329faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic u8 tuner_address_grundig_29504_401_activy = 0x60; 330faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 33114d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int grundig_29504_451_tuner_set_params(struct dvb_frontend *fe) 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3331466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3391466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = c->frequency / 125; 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x8e; 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = 0x00; 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 345dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 346dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct tda8083_config grundig_29504_451_config = { 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x68, 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 35514d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int s5h1420_tuner_set_params(struct dvb_frontend *fe) 35696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey{ 3571466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 35896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct budget* budget = (struct budget*) fe->dvb->priv; 35996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u32 div; 36096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u8 data[4]; 36196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 36296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 3631466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = c->frequency / 1000; 36496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[0] = (div >> 8) & 0x7f; 36596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[1] = div & 0xff; 36696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[2] = 0xc2; 36796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 36896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (div < 1450) 36996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x00; 37096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 1850) 37196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x40; 37296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 2000) 37396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x80; 37496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else 37596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0xc0; 37696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 377dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 378dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 37996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 38096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 38196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey return 0; 38296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey} 38396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 38496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quinceystatic struct s5h1420_config s5h1420_config = { 38596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey .demod_address = 0x53, 386a9d6a80b41c04e8ff4c7442cc35f5df610863841Andrew de Quincey .invert = 1, 387dbad108bdcb30629c850f5606949510da010a686Patrick Boettcher .cdclk_polarity = 1, 38896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey}; 38996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 390adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quinceystatic struct tda10086_config tda10086_config = { 391adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .demod_address = 0x0e, 392adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .invert = 0, 393ea75baf4b0f117564bd50827a49c4b14d61d24e9Hartmut Hackmann .diseqc_tone = 1, 3949a1b04e461fc8127c902a988cd9a082ba0680b11Hartmut Hackmann .xtal_freq = TDA10086_XTAL_16M, 395adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey}; 396adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 39787dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic struct stv0299_config alps_bsru6_config_activy = { 39887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .demod_address = 0x68, 39987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .inittab = alps_bsru6_inittab, 40087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .mclk = 88000000UL, 40187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .invert = 1, 40287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .op0_off = 1, 40387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .min_delay_ms = 100, 40487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .set_symbol_rate = alps_bsru6_set_symbol_rate, 40587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss}; 40687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 40787dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic struct stv0299_config alps_bsbe1_config_activy = { 40887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .demod_address = 0x68, 40987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .inittab = alps_bsbe1_inittab, 41087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .mclk = 88000000UL, 41187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .invert = 1, 41287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .op0_off = 1, 41387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .min_delay_ms = 100, 41487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .set_symbol_rate = alps_bsbe1_set_symbol_rate, 41587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss}; 41687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 41783512e207479d0bdb83ee1e000a306af9e6e870eOliver Endrissstatic int alps_tdhd1_204_request_firmware(struct dvb_frontend *fe, const struct firmware **fw, char *name) 41883512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss{ 41983512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss struct budget *budget = (struct budget *)fe->dvb->priv; 42083512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss 42183512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss return request_firmware(fw, name, &budget->dev->pci->dev); 42283512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss} 42383512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss 42487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 42587dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic int i2c_readreg(struct i2c_adapter *i2c, u8 adr, u8 reg) 42687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss{ 42787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss u8 val; 42887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss struct i2c_msg msg[] = { 42987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { .addr = adr, .flags = 0, .buf = ®, .len = 1 }, 43087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { .addr = adr, .flags = I2C_M_RD, .buf = &val, .len = 1 } 43187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss }; 43287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 43387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss return (i2c_transfer(i2c, msg, 2) != 2) ? -EIO : val; 43487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss} 43587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u8 read_pwm(struct budget* budget) 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 b = 0xff; 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwm; 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 }, 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} }; 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4439101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff)) 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pwm = 0x48; 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pwm; 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 44962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regelstatic struct stv090x_config tt1600_stv090x_config = { 45062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .device = STV0903, 45162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .demod_mode = STV090x_SINGLE, 45262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .clk_mode = STV090x_CLK_EXT, 45362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 45493e32cdafbe70d66bd8c133dd1b663198723654fAndreas Regel .xtal = 13500000, 45562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .address = 0x68, 45662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 457560db4a1a0aaa8920995e60a6a8bbc9f8708f0a3Andreas Regel .ts1_mode = STV090x_TSMODE_DVBCI, 458560db4a1a0aaa8920995e60a6a8bbc9f8708f0a3Andreas Regel .ts2_mode = STV090x_TSMODE_SERIAL_CONTINUOUS, 45962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 46062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .repeater_level = STV090x_RPTLEVEL_16, 46162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 46262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_init = NULL, 463c5b74b0f5e81386ca1e9b1128de83502e92fa028Manu Abraham .tuner_sleep = NULL, 46462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_mode = NULL, 46562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_frequency = NULL, 46662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_frequency = NULL, 46762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_bandwidth = NULL, 46862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_bandwidth = NULL, 46962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_bbgain = NULL, 47062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_bbgain = NULL, 47162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_refclk = NULL, 47262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_status = NULL, 47362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel}; 47462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 47562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regelstatic struct stv6110x_config tt1600_stv6110x_config = { 47662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .addr = 0x60, 47762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .refclk = 27000000, 47893e32cdafbe70d66bd8c133dd1b663198723654fAndreas Regel .clk_div = 2, 47962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel}; 48062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 48162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regelstatic struct isl6423_config tt1600_isl6423_config = { 48262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .current_max = SEC_CURRENT_515m, 48362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .curlim = SEC_CURRENT_LIM_ON, 48462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .mod_extern = 1, 48562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .addr = 0x08, 48662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel}; 48762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void frontend_init(struct budget *budget) 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 49087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss (void)alps_bsbe1_config; /* avoid warning */ 49187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(budget->dev->pci->subsystem_device) { 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659)) 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1013: 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRV2 first of all 4962bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &budget->i2c_adap); 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 498dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; 499dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 500dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 501dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_tone = budget_set_tone; 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRU6 now 5062bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config, &budget->i2c_adap); 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 508dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 509067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 510bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss if (budget->dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) { 511bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 512bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 513bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.set_tone = budget_set_tone; 514bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss } 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659)) 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5212bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1820_attach, &alps_tdbe2_config, &budget->i2c_adap, read_pwm(budget)); 522067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 523dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; 524067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 525067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1005: // Hauppauge/TT Nova-T budget (L64781/Grundig 29504-401(tsa5060)) 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5302bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config, &budget->i2c_adap); 531067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 532dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 5336dbe7af37def293e1116af186c94e2d47d353190Tony Broad budget->dvb_frontend->tuner_priv = NULL; 534067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 535067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 53887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss case 0x4f60: /* Fujitsu Siemens Activy Budget-S PCI rev AL (stv0299/tsa5059) */ 53987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { 54087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss int subtype = i2c_readreg(&budget->i2c_adap, 0x50, 0x67); 54187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 54287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (subtype < 0) 54387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 54487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* fixme: find a better way to identify the card */ 54587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (subtype < 0x36) { 54687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* assume ALPS BSRU6 */ 54787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config_activy, &budget->i2c_adap); 54887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (budget->dvb_frontend) { 54987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss printk(KERN_INFO "budget: tuner ALPS BSRU6 detected\n"); 55087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 55187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 55287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 55387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 55487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 55587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 55687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } else { 55787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* assume ALPS BSBE1 */ 55887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* reset tuner */ 55987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss saa7146_setgpio(budget->dev, 3, SAA7146_GPIO_OUTLO); 56087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss msleep(50); 56187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss saa7146_setgpio(budget->dev, 3, SAA7146_GPIO_OUTHI); 56287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss msleep(250); 56387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsbe1_config_activy, &budget->i2c_adap); 56487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (budget->dvb_frontend) { 56587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss printk(KERN_INFO "budget: tuner ALPS BSBE1 detected\n"); 56687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params; 56787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 56887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 56987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 57087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 57187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 57487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x4f61: // Fujitsu Siemens Activy Budget-S PCI rev GR (tda8083/Grundig 29504-451(tsa5522)) 5772bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(tda8083_attach, &grundig_29504_451_config, &budget->i2c_adap); 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 579dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; 580dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 581dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 58496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 58581ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss case 0x5f60: /* Fujitsu Siemens Activy Budget-T PCI rev AL (tda10046/ALPS TDHD1-204A) */ 58681ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss budget->dvb_frontend = dvb_attach(tda10046_attach, &alps_tdhd1_204a_config, &budget->i2c_adap); 58781ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss if (budget->dvb_frontend) { 58881ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdhd1_204a_tuner_set_params; 58981ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 59081ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss } 59181ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss break; 59281ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss 593faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss case 0x5f61: /* Fujitsu Siemens Activy Budget-T PCI rev GR (L64781/Grundig 29504-401(tsa5060)) */ 594faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config_activy, &budget->i2c_adap); 595faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (budget->dvb_frontend) { 596faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->tuner_priv = &tuner_address_grundig_29504_401_activy; 597faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 598faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss } 599faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss break; 600faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 60196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey case 0x1016: // Hauppauge/TT Nova-S SE (samsung s5h1420/????(tda8260)) 6022bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(s5h1420_attach, &s5h1420_config, &budget->i2c_adap); 60396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (budget->dvb_frontend) { 604dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = s5h1420_tuner_set_params; 605adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 6063ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 607adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey goto error_out; 608adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 609adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey break; 610adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 611adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 612adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey case 0x1018: // TT Budget-S-1401 (philips tda10086/philips tda8262) 613adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey // gpio2 is connected to CLB - reset it + leave it high 614adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 615adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 616adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 617adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 618adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 619adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey budget->dvb_frontend = dvb_attach(tda10086_attach, &tda10086_config, &budget->i2c_adap); 620adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (budget->dvb_frontend) { 621adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(tda826x_attach, budget->dvb_frontend, 0x60, &budget->i2c_adap, 0) == NULL) 6223ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No tda826x found!\n", __func__); 623adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 6243ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 6259691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 6269691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel } 62796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey break; 62896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey } 62962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 63062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel case 0x101c: { /* TT S2-1600 */ 63162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel struct stv6110x_devctl *ctl; 63262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 63362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel msleep(50); 63462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 63562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel msleep(250); 63662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 63762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel budget->dvb_frontend = dvb_attach(stv090x_attach, 63862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &tt1600_stv090x_config, 63962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &budget->i2c_adap, 64062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel STV090x_DEMODULATOR_0); 64162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 64262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel if (budget->dvb_frontend) { 64362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 64462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel ctl = dvb_attach(stv6110x_attach, 64562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel budget->dvb_frontend, 64662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &tt1600_stv6110x_config, 64762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &budget->i2c_adap); 64862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 649dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork if (ctl) { 650dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_init = ctl->tuner_init; 651dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_sleep = ctl->tuner_sleep; 652dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode; 653dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency; 654dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency; 655dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_bandwidth = ctl->tuner_set_bandwidth; 656dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_bandwidth = ctl->tuner_get_bandwidth; 657dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_bbgain = ctl->tuner_set_bbgain; 658dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_bbgain = ctl->tuner_get_bbgain; 659dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_refclk = ctl->tuner_set_refclk; 660dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_status = ctl->tuner_get_status; 661dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork 662dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork /* call the init function once to initialize 663dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tuner's clock output divider and demod's 664dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork master clock */ 665dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork if (budget->dvb_frontend->ops.init) 666dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork budget->dvb_frontend->ops.init(budget->dvb_frontend); 667dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork 668dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork if (dvb_attach(isl6423_attach, 669dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork budget->dvb_frontend, 670dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork &budget->i2c_adap, 671dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork &tt1600_isl6423_config) == NULL) { 672dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork printk(KERN_ERR "%s: No Intersil ISL6423 found!\n", __func__); 673dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork goto error_out; 674dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork } 675dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork } else { 676dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork printk(KERN_ERR "%s: No STV6110(A) Silicon Tuner found!\n", __func__); 677dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork goto error_out; 678dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork } 67962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel } 68062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel } 68162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel break; 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend == NULL) { 68529e66a6ce84abe04bc809ddb35634752881dec79Bjorn Helgaas printk("budget: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n", 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->vendor, 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->device, 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_vendor, 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_device); 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 6919691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) 6929691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6949691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 6959691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel 6969691bb14d9ab646868a6392e9419070c304a9590Martin Zwickelerror_out: 6979691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel printk("budget: Frontend registration failed!\n"); 698f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 6999691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel budget->dvb_frontend = NULL; 7009691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info) 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = NULL; 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget = kmalloc(sizeof(struct budget), GFP_KERNEL); 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if( NULL == budget ) { 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "dev:%p, info:%p, budget:%p\n", dev, info, budget); 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = budget; 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71726dc4d0487bb8b8de32d09c18a83c63d622156f2Janne Grunau err = ttpci_budget_init(budget, dev, info, THIS_MODULE, adapter_nr); 71826dc4d0487bb8b8de32d09c18a83c63d622156f2Janne Grunau if (err) { 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("==> failed\n"); 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 724fdc53a6dbfea18e621dd23ed5cfb160837d7ce52Johannes Stezenbach budget->dvb_adapter.priv = budget; 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frontend_init(budget); 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 72732e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss ttpci_budget_init_hooks(budget); 72832e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss 7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_detach (struct saa7146_dev* dev) 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = (struct budget*) dev->ext_priv; 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7372bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey if (budget->dvb_frontend) { 7382bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey dvb_unregister_frontend(budget->dvb_frontend); 739f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 7402bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey } 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = ttpci_budget_deinit (budget); 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = NULL; 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension; 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); 756adc619ac6e3d3b4a175476b915befe37650ee109Andrew de QuinceyMAKE_BUDGET_INFO(ttbs1401, "TT-Budget-S-1401 PCI", BUDGET_TT); 75762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas RegelMAKE_BUDGET_INFO(tt1600, "TT-Budget S2-1600 PCI", BUDGET_TT); 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig frontend)", BUDGET_FS_ACTIVY); 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps frontend)", BUDGET_FS_ACTIVY); 760faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver EndrissMAKE_BUDGET_INFO(fsact, "Fujitsu Siemens Activy Budget-T PCI (rev GR/Grundig frontend)", BUDGET_FS_ACTIVY); 76181ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver EndrissMAKE_BUDGET_INFO(fsact1, "Fujitsu Siemens Activy Budget-T PCI (rev AL/ALPS TDHD1-204A)", BUDGET_FS_ACTIVY); 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id pci_tbl[] = { 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003), 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), 76896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), 769adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018), 77062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel MAKE_EXTENSION_PCI(tt1600, 0x13c2, 0x101c), 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), 77381ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss MAKE_EXTENSION_PCI(fsact1, 0x1131, 0x5f60), 774faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss MAKE_EXTENSION_PCI(fsact, 0x1131, 0x5f61), 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .vendor = 0, 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, pci_tbl); 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension = { 7830e367a15ed08710098e2ff59aa25cec723c0a9d4Dave Jones .name = "budget dvb", 78400c4cc67512ada1d195b8bf3ef1db1d6b3951605Oliver Endriss .flags = SAA7146_USE_I2C_IRQ, 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .module = THIS_MODULE, 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .pci_tbl = pci_tbl, 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .attach = budget_attach, 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .detach = budget_detach, 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_mask = MASK_10, 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_func = ttpci_budget_irq10_handler, 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init budget_init(void) 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return saa7146_register_extension(&budget_extension); 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit budget_exit(void) 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_unregister_extension(&budget_extension); 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(budget_init); 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(budget_exit); 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others"); 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("driver for the SAA7146 based so-called " 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "budget PCI DVB cards by Siemens, Technotrend, Hauppauge"); 812