budget.c revision 87dd965f101bafea7c5e507f686814a0f0057417
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" 4887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss#include "bsbe1.h" 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 50bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissstatic int diseqc_method; 51bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissmodule_param(diseqc_method, int, 0444); 52bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver EndrissMODULE_PARM_DESC(diseqc_method, "Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)"); 53bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void Set22K (struct budget *budget, int state) 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO)); 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Diseqc functions only for TT Budget card */ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* taken from the Skyvision DVB driver by 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Ralph Metzler <rjkm@metzlerbros.de> */ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendBit (struct budget *budget, int data) 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 500 : 1000); 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 1000 : 500); 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendByte (struct budget *budget, int data) 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i, par=1, d; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=7; i>=0; i--) { 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds d = (data>>i)&1; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds par ^= d; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, d); 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, par); 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, unsigned long burst) 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=0; i<len; i++) 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, msg[i]); 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst!=-1) { 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst) 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, 0xff); 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(12500); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(20); 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Routines for the Fujitsu Siemens Activy budget card 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 22 kHz tone and DiSEqC are handled by the frontend. 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Voltage must be set here. 124f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss * GPIO 1: LNBP EN, GPIO 2: LNBP VSEL 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SetVoltage_Activy (struct budget *budget, fe_sec_voltage_t voltage) 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (voltage) { 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_13: 134f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTLO); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_18: 138f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI); 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 141f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss case SEC_VOLTAGE_OFF: 142f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); 143f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss break; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int siemens_budget_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return SetVoltage_Activy (budget, voltage); 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (tone) { 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_ON: 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 1); 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_OFF: 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 0); 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd) 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0); 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, 0, NULL, minicmd); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 196067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwr = 0; 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 buf[4]; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div = (params->frequency + 479500) / 125; 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (params->frequency > 2000000) pwr = 3; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency > 1800000) pwr = 2; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency > 1600000) pwr = 1; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency > 1200000) pwr = 0; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency >= 1100000) pwr = 1; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else pwr = 2; 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0] = (div >> 8) & 0x7f; 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[1] = div & 0xff; 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[2] = ((div & 0x18000) >> 10) | 0x95; 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[3] = (pwr << 6) | 0x30; 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2169101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab // NOTE: since we're using a prescaler of 2, we set the 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // divisor frequency to 62.5kHz and divide by 125 above 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 219dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 220dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1x93_config alps_bsrv2_config = 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x08, 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 90100000UL, 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert_pwm = 0, 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 232067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) }; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds div = (params->frequency + 35937500 + 31250) / 62500; 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x85 | ((div >> 10) & 0x60); 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81); 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 246dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 247dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1820_config alps_tdbe2_config = { 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x09, 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 57840000UL, 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert = 1, 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .selagc = VES1820_SELAGC_SIGNAMPERR, 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 259067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 261faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct budget *budget = fe->dvb->priv; 262faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss u8 *tuner_addr = fe->tuner_priv; 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cfg, cpump, band_select; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 266faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct i2c_msg msg = { .flags = 0, .buf = data, .len = sizeof(data) }; 267faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 268faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (tuner_addr) 269faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = *tuner_addr; 270faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss else 271faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = 0x61; 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds div = (36125000 + params->frequency) / 166666; 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cfg = 0x88; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (params->frequency < 175000000) cpump = 2; 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 390000000) cpump = 1; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 470000000) cpump = 2; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 750000000) cpump = 1; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else cpump = 3; 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (params->frequency < 175000000) band_select = 0x0e; 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (params->frequency < 470000000) band_select = 0x05; 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else band_select = 0x03; 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = ((div >> 10) & 0x60) | cfg; 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = (cpump << 6) | band_select; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 292dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 293dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct l64781_config grundig_29504_401_config = { 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x55, 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 302faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic struct l64781_config grundig_29504_401_config_activy = { 303faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss .demod_address = 0x54, 304faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss}; 305faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 306faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic u8 tuner_address_grundig_29504_401_activy = 0x60; 307faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 308067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds div = params->frequency / 125; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x8e; 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = 0x00; 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 322dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct tda8083_config grundig_29504_451_config = { 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x68, 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 331067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quinceystatic int s5h1420_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) 33296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey{ 33396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct budget* budget = (struct budget*) fe->dvb->priv; 33496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u32 div; 33596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u8 data[4]; 33696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 33796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 33896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey div = params->frequency / 1000; 33996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[0] = (div >> 8) & 0x7f; 34096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[1] = div & 0xff; 34196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[2] = 0xc2; 34296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 34396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (div < 1450) 34496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x00; 34596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 1850) 34696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x40; 34796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 2000) 34896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x80; 34996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else 35096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0xc0; 35196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 352dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 353dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 35496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 35596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 35696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey return 0; 35796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey} 35896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 35996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quinceystatic struct s5h1420_config s5h1420_config = { 36096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey .demod_address = 0x53, 361a9d6a80b41c04e8ff4c7442cc35f5df610863841Andrew de Quincey .invert = 1, 362dbad108bdcb30629c850f5606949510da010a686Patrick Boettcher .cdclk_polarity = 1, 36396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey}; 36496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 365adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quinceystatic struct tda10086_config tda10086_config = { 366adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .demod_address = 0x0e, 367adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .invert = 0, 368ea75baf4b0f117564bd50827a49c4b14d61d24e9Hartmut Hackmann .diseqc_tone = 1, 3699a1b04e461fc8127c902a988cd9a082ba0680b11Hartmut Hackmann .xtal_freq = TDA10086_XTAL_16M, 370adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey}; 371adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 37287dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic struct stv0299_config alps_bsru6_config_activy = { 37387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .demod_address = 0x68, 37487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .inittab = alps_bsru6_inittab, 37587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .mclk = 88000000UL, 37687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .invert = 1, 37787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .op0_off = 1, 37887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .min_delay_ms = 100, 37987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .set_symbol_rate = alps_bsru6_set_symbol_rate, 38087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss}; 38187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 38287dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic struct stv0299_config alps_bsbe1_config_activy = { 38387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .demod_address = 0x68, 38487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .inittab = alps_bsbe1_inittab, 38587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .mclk = 88000000UL, 38687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .invert = 1, 38787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .op0_off = 1, 38887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .min_delay_ms = 100, 38987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .set_symbol_rate = alps_bsbe1_set_symbol_rate, 39087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss}; 39187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 39287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 39387dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic int i2c_readreg(struct i2c_adapter *i2c, u8 adr, u8 reg) 39487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss{ 39587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss u8 val; 39687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss struct i2c_msg msg[] = { 39787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { .addr = adr, .flags = 0, .buf = ®, .len = 1 }, 39887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { .addr = adr, .flags = I2C_M_RD, .buf = &val, .len = 1 } 39987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss }; 40087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 40187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss return (i2c_transfer(i2c, msg, 2) != 2) ? -EIO : val; 40287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss} 40387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u8 read_pwm(struct budget* budget) 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 b = 0xff; 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwm; 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 }, 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} }; 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4119101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff)) 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pwm = 0x48; 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pwm; 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void frontend_init(struct budget *budget) 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 41987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss (void)alps_bsbe1_config; /* avoid warning */ 42087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(budget->dev->pci->subsystem_device) { 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659)) 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1013: 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRV2 first of all 4252bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &budget->i2c_adap); 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 427dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; 428dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 429dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 430dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_tone = budget_set_tone; 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRU6 now 4352bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config, &budget->i2c_adap); 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 437dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 438067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 439bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss if (budget->dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) { 440bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 441bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 442bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.set_tone = budget_set_tone; 443bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss } 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659)) 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4502bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1820_attach, &alps_tdbe2_config, &budget->i2c_adap, read_pwm(budget)); 451067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 452dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; 453067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 454067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1005: // Hauppauge/TT Nova-T budget (L64781/Grundig 29504-401(tsa5060)) 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4592bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config, &budget->i2c_adap); 460067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 461dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 462067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 463067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 46687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss case 0x4f60: /* Fujitsu Siemens Activy Budget-S PCI rev AL (stv0299/tsa5059) */ 46787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { 46887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss int subtype = i2c_readreg(&budget->i2c_adap, 0x50, 0x67); 46987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 47087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (subtype < 0) 47187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 47287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* fixme: find a better way to identify the card */ 47387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (subtype < 0x36) { 47487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* assume ALPS BSRU6 */ 47587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config_activy, &budget->i2c_adap); 47687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (budget->dvb_frontend) { 47787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss printk(KERN_INFO "budget: tuner ALPS BSRU6 detected\n"); 47887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 47987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 48087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 48187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 48287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 48387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 48487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } else { 48587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* assume ALPS BSBE1 */ 48687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* reset tuner */ 48787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss saa7146_setgpio(budget->dev, 3, SAA7146_GPIO_OUTLO); 48887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss msleep(50); 48987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss saa7146_setgpio(budget->dev, 3, SAA7146_GPIO_OUTHI); 49087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss msleep(250); 49187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsbe1_config_activy, &budget->i2c_adap); 49287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (budget->dvb_frontend) { 49387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss printk(KERN_INFO "budget: tuner ALPS BSBE1 detected\n"); 49487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params; 49587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 49687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 49787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 49887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 49987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 50287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x4f61: // Fujitsu Siemens Activy Budget-S PCI rev GR (tda8083/Grundig 29504-451(tsa5522)) 5052bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(tda8083_attach, &grundig_29504_451_config, &budget->i2c_adap); 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 507dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; 508dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 509dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 51296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 513faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss case 0x5f61: /* Fujitsu Siemens Activy Budget-T PCI rev GR (L64781/Grundig 29504-401(tsa5060)) */ 514faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config_activy, &budget->i2c_adap); 515faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (budget->dvb_frontend) { 516faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->tuner_priv = &tuner_address_grundig_29504_401_activy; 517faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 518faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss } 519faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss break; 520faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 52196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey case 0x1016: // Hauppauge/TT Nova-S SE (samsung s5h1420/????(tda8260)) 5222bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(s5h1420_attach, &s5h1420_config, &budget->i2c_adap); 52396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (budget->dvb_frontend) { 524dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = s5h1420_tuner_set_params; 525adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 5263ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 527adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey goto error_out; 528adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 529adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey break; 530adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 531adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 532adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey case 0x1018: // TT Budget-S-1401 (philips tda10086/philips tda8262) 533adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey // gpio2 is connected to CLB - reset it + leave it high 534adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 535adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 536adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 537adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 538adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 539adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey budget->dvb_frontend = dvb_attach(tda10086_attach, &tda10086_config, &budget->i2c_adap); 540adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (budget->dvb_frontend) { 541adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(tda826x_attach, budget->dvb_frontend, 0x60, &budget->i2c_adap, 0) == NULL) 5423ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No tda826x found!\n", __func__); 543adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 5443ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 5459691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 5469691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel } 54796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey break; 54896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey } 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend == NULL) { 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("budget: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n", 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->vendor, 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->device, 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_vendor, 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_device); 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 5589691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) 5599691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5619691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 5629691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel 5639691bb14d9ab646868a6392e9419070c304a9590Martin Zwickelerror_out: 5649691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel printk("budget: Frontend registration failed!\n"); 565f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 5669691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel budget->dvb_frontend = NULL; 5679691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info) 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = NULL; 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget = kmalloc(sizeof(struct budget), GFP_KERNEL); 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if( NULL == budget ) { 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "dev:%p, info:%p, budget:%p\n", dev, info, budget); 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = budget; 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) { 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("==> failed\n"); 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 590fdc53a6dbfea18e621dd23ed5cfb160837d7ce52Johannes Stezenbach budget->dvb_adapter.priv = budget; 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frontend_init(budget); 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 59332e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss ttpci_budget_init_hooks(budget); 59432e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_detach (struct saa7146_dev* dev) 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = (struct budget*) dev->ext_priv; 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6032bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey if (budget->dvb_frontend) { 6042bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey dvb_unregister_frontend(budget->dvb_frontend); 605f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 6062bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey } 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = ttpci_budget_deinit (budget); 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = NULL; 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension; 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); 622adc619ac6e3d3b4a175476b915befe37650ee109Andrew de QuinceyMAKE_BUDGET_INFO(ttbs1401, "TT-Budget-S-1401 PCI", BUDGET_TT); 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig frontend)", BUDGET_FS_ACTIVY); 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps frontend)", BUDGET_FS_ACTIVY); 625faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver EndrissMAKE_BUDGET_INFO(fsact, "Fujitsu Siemens Activy Budget-T PCI (rev GR/Grundig frontend)", BUDGET_FS_ACTIVY); 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id pci_tbl[] = { 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003), 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), 63296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), 633adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018), 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), 636faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss MAKE_EXTENSION_PCI(fsact, 0x1131, 0x5f61), 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .vendor = 0, 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, pci_tbl); 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension = { 6450e367a15ed08710098e2ff59aa25cec723c0a9d4Dave Jones .name = "budget dvb", 64600c4cc67512ada1d195b8bf3ef1db1d6b3951605Oliver Endriss .flags = SAA7146_USE_I2C_IRQ, 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .module = THIS_MODULE, 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .pci_tbl = pci_tbl, 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .attach = budget_attach, 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .detach = budget_detach, 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_mask = MASK_10, 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_func = ttpci_budget_irq10_handler, 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init budget_init(void) 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return saa7146_register_extension(&budget_extension); 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit budget_exit(void) 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_unregister_extension(&budget_extension); 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(budget_init); 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(budget_exit); 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others"); 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("driver for the SAA7146 based so-called " 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "budget PCI DVB cards by Siemens, Technotrend, Hauppauge"); 674