budget.c revision 9a1b04e461fc8127c902a988cd9a082ba0680b11
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 * 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the project's page is at http://www.linuxtv.org/dvb/ 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" 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 49bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissstatic int diseqc_method; 50bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissmodule_param(diseqc_method, int, 0444); 51bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver EndrissMODULE_PARM_DESC(diseqc_method, "Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)"); 52bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void Set22K (struct budget *budget, int state) 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO)); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Diseqc functions only for TT Budget card */ 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* taken from the Skyvision DVB driver by 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Ralph Metzler <rjkm@metzlerbros.de> */ 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendBit (struct budget *budget, int data) 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 500 : 1000); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 1000 : 500); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendByte (struct budget *budget, int data) 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i, par=1, d; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=7; i>=0; i--) { 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds d = (data>>i)&1; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds par ^= d; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, d); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, par); 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, unsigned long burst) 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=0; i<len; i++) 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, msg[i]); 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst!=-1) { 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst) 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, 0xff); 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(12500); 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(20); 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Routines for the Fujitsu Siemens Activy budget card 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 22 kHz tone and DiSEqC are handled by the frontend. 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Voltage must be set here. 123f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss * GPIO 1: LNBP EN, GPIO 2: LNBP VSEL 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SetVoltage_Activy (struct budget *budget, fe_sec_voltage_t voltage) 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (voltage) { 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_13: 133f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTLO); 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_18: 137f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI); 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 140f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss case SEC_VOLTAGE_OFF: 141f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); 142f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss break; 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int siemens_budget_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return SetVoltage_Activy (budget, voltage); 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (tone) { 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_ON: 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 1); 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_OFF: 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 0); 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd) 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0); 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, 0, NULL, minicmd); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 195067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwr = 0; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 buf[4]; 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div = (params->frequency + 479500) / 125; 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (params->frequency > 2000000) pwr = 3; 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency > 1800000) pwr = 2; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency > 1600000) pwr = 1; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency > 1200000) pwr = 0; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency >= 1100000) pwr = 1; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else pwr = 2; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0] = (div >> 8) & 0x7f; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[1] = div & 0xff; 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[2] = ((div & 0x18000) >> 10) | 0x95; 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[3] = (pwr << 6) | 0x30; 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2159101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab // NOTE: since we're using a prescaler of 2, we set the 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // divisor frequency to 62.5kHz and divide by 125 above 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 218dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 219dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1x93_config alps_bsrv2_config = 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x08, 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 90100000UL, 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert_pwm = 0, 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) }; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds div = (params->frequency + 35937500 + 31250) / 62500; 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x85 | ((div >> 10) & 0x60); 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81); 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 245dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 246dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1820_config alps_tdbe2_config = { 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x09, 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 57840000UL, 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert = 1, 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .selagc = VES1820_SELAGC_SIGNAMPERR, 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 258067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 260faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct budget *budget = fe->dvb->priv; 261faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss u8 *tuner_addr = fe->tuner_priv; 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cfg, cpump, band_select; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 265faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct i2c_msg msg = { .flags = 0, .buf = data, .len = sizeof(data) }; 266faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 267faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (tuner_addr) 268faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = *tuner_addr; 269faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss else 270faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = 0x61; 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds div = (36125000 + params->frequency) / 166666; 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cfg = 0x88; 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (params->frequency < 175000000) cpump = 2; 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 390000000) cpump = 1; 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 470000000) cpump = 2; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 750000000) cpump = 1; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else cpump = 3; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (params->frequency < 175000000) band_select = 0x0e; 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 470000000) band_select = 0x05; 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else band_select = 0x03; 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = ((div >> 10) & 0x60) | cfg; 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = (cpump << 6) | band_select; 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 292dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct l64781_config grundig_29504_401_config = { 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x55, 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic struct l64781_config grundig_29504_401_config_activy = { 302faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss .demod_address = 0x54, 303faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss}; 304faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 305faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic u8 tuner_address_grundig_29504_401_activy = 0x60; 306faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 307067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds div = params->frequency / 125; 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x8e; 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = 0x00; 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 320dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 321dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct tda8083_config grundig_29504_451_config = { 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x68, 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 330067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int s5h1420_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 33196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey{ 33296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct budget* budget = (struct budget*) fe->dvb->priv; 33396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u32 div; 33496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u8 data[4]; 33596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 33696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 33796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey div = params->frequency / 1000; 33896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[0] = (div >> 8) & 0x7f; 33996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[1] = div & 0xff; 34096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[2] = 0xc2; 34196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 34296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (div < 1450) 34396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x00; 34496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 1850) 34596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x40; 34696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 2000) 34796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x80; 34896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else 34996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0xc0; 35096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 351dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 352dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 35396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 35496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 35596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey return 0; 35696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey} 35796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 35896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quinceystatic struct s5h1420_config s5h1420_config = { 35996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey .demod_address = 0x53, 360a9d6a80b41c04e8ff4c7442cc35f5df610863841Andrew de Quincey .invert = 1, 361dbad108bdcb30629c850f5606949510da010a686Patrick Boettcher .cdclk_polarity = 1, 36296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey}; 36396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 364adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quinceystatic struct tda10086_config tda10086_config = { 365adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .demod_address = 0x0e, 366adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .invert = 0, 367ea75baf4b0f117564bd50827a49c4b14d61d24e9Hartmut Hackmann .diseqc_tone = 1, 3689a1b04e461fc8127c902a988cd9a082ba0680b11Hartmut Hackmann .xtal_freq = TDA10086_XTAL_16M, 369adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey}; 370adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u8 read_pwm(struct budget* budget) 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 b = 0xff; 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwm; 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 }, 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} }; 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3789101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff)) 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pwm = 0x48; 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pwm; 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void frontend_init(struct budget *budget) 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(budget->dev->pci->subsystem_device) { 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659)) 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1013: 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRV2 first of all 3902bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &budget->i2c_adap); 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 392dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; 393dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 394dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 395dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_tone = budget_set_tone; 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRU6 now 4002bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config, &budget->i2c_adap); 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 402dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 403067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 404bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss if (budget->dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) { 405bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 406bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 407bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.set_tone = budget_set_tone; 408bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss } 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659)) 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4152bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1820_attach, &alps_tdbe2_config, &budget->i2c_adap, read_pwm(budget)); 416067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 417dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; 418067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 419067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1005: // Hauppauge/TT Nova-T budget (L64781/Grundig 29504-401(tsa5060)) 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4242bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config, &budget->i2c_adap); 425067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 426dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 427067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 428067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x4f60: // Fujitsu Siemens Activy Budget-S PCI rev AL (stv0299/ALPS BSRU6(tsa5059)) 4322bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config, &budget->i2c_adap); 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 434dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 435067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 436dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 437dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x4f61: // Fujitsu Siemens Activy Budget-S PCI rev GR (tda8083/Grundig 29504-451(tsa5522)) 4422bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(tda8083_attach, &grundig_29504_451_config, &budget->i2c_adap); 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 444dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; 445dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 446dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 44996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 450faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss case 0x5f61: /* Fujitsu Siemens Activy Budget-T PCI rev GR (L64781/Grundig 29504-401(tsa5060)) */ 451faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config_activy, &budget->i2c_adap); 452faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (budget->dvb_frontend) { 453faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->tuner_priv = &tuner_address_grundig_29504_401_activy; 454faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 455faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss } 456faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss break; 457faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 45896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey case 0x1016: // Hauppauge/TT Nova-S SE (samsung s5h1420/????(tda8260)) 4592bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(s5h1420_attach, &s5h1420_config, &budget->i2c_adap); 46096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (budget->dvb_frontend) { 461dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = s5h1420_tuner_set_params; 462adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 4633ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 464adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey goto error_out; 465adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 466adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey break; 467adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 468adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 469adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey case 0x1018: // TT Budget-S-1401 (philips tda10086/philips tda8262) 470adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey // gpio2 is connected to CLB - reset it + leave it high 471adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 472adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 473adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 474adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 475adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 476adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey budget->dvb_frontend = dvb_attach(tda10086_attach, &tda10086_config, &budget->i2c_adap); 477adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (budget->dvb_frontend) { 478adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(tda826x_attach, budget->dvb_frontend, 0x60, &budget->i2c_adap, 0) == NULL) 4793ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No tda826x found!\n", __func__); 480adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 4813ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 4829691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 4839691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel } 48496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey break; 48596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey } 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend == NULL) { 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("budget: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n", 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->vendor, 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->device, 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_vendor, 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_device); 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4959691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) 4969691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4989691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 4999691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel 5009691bb14d9ab646868a6392e9419070c304a9590Martin Zwickelerror_out: 5019691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel printk("budget: Frontend registration failed!\n"); 502f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 5039691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel budget->dvb_frontend = NULL; 5049691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info) 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = NULL; 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget = kmalloc(sizeof(struct budget), GFP_KERNEL); 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if( NULL == budget ) { 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "dev:%p, info:%p, budget:%p\n", dev, info, budget); 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = budget; 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) { 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("==> failed\n"); 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 527fdc53a6dbfea18e621dd23ed5cfb160837d7ce52Johannes Stezenbach budget->dvb_adapter.priv = budget; 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frontend_init(budget); 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 53032e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss ttpci_budget_init_hooks(budget); 53132e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_detach (struct saa7146_dev* dev) 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = (struct budget*) dev->ext_priv; 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5402bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey if (budget->dvb_frontend) { 5412bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey dvb_unregister_frontend(budget->dvb_frontend); 542f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 5432bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey } 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = ttpci_budget_deinit (budget); 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = NULL; 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension; 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); 559adc619ac6e3d3b4a175476b915befe37650ee109Andrew de QuinceyMAKE_BUDGET_INFO(ttbs1401, "TT-Budget-S-1401 PCI", BUDGET_TT); 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig frontend)", BUDGET_FS_ACTIVY); 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps frontend)", BUDGET_FS_ACTIVY); 562faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver EndrissMAKE_BUDGET_INFO(fsact, "Fujitsu Siemens Activy Budget-T PCI (rev GR/Grundig frontend)", BUDGET_FS_ACTIVY); 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id pci_tbl[] = { 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003), 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), 56996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), 570adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018), 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), 573faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss MAKE_EXTENSION_PCI(fsact, 0x1131, 0x5f61), 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .vendor = 0, 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, pci_tbl); 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension = { 5820e367a15ed08710098e2ff59aa25cec723c0a9d4Dave Jones .name = "budget dvb", 58300c4cc67512ada1d195b8bf3ef1db1d6b3951605Oliver Endriss .flags = SAA7146_USE_I2C_IRQ, 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .module = THIS_MODULE, 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .pci_tbl = pci_tbl, 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .attach = budget_attach, 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .detach = budget_detach, 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_mask = MASK_10, 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_func = ttpci_budget_irq10_handler, 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init budget_init(void) 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return saa7146_register_extension(&budget_extension); 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit budget_exit(void) 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_unregister_extension(&budget_extension); 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(budget_init); 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(budget_exit); 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others"); 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("driver for the SAA7146 based so-called " 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "budget PCI DVB cards by Siemens, Technotrend, Hauppauge"); 611