11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * budget.c: driver for the SAA7146 based Budget DVB cards 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Compiled from various sources by Michael Hunold <michael@mihu.de> 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999-2002 Ralph Metzler 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * & Marcus Metzler for convergence integrated media GmbH 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 26feb2004 Support for FS Activy Card (Grundig tuner) by 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Michael Dreher <michael@5dot1.de>, 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Oliver Endriss <o.endriss@gmx.de> and 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Andreas 'randy' Weinberger 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modify it under the terms of the GNU General Public License 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as published by the Free Software Foundation; either version 2 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the License, or (at your option) any later version. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details. 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Or, point your browser to http://www.gnu.org/copyleft/gpl.html 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 34631dd1a885b6d7e9f6f51b4e5b311c2bb04c323cJustin P. Mattock * the project's page is at http://www.linuxtv.org/ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "budget.h" 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "stv0299.h" 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ves1x93.h" 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ves1820.h" 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "l64781.h" 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "tda8083.h" 4396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey#include "s5h1420.h" 44adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey#include "tda10086.h" 45adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey#include "tda826x.h" 462f27bdce972ceb97a2fd109a77546c37aa499fc9Oliver Endriss#include "lnbp21.h" 47265366e8fb8c31706711aea5f79d763816a968dbPerceval Anichini#include "bsru6.h" 4887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss#include "bsbe1.h" 4981ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss#include "tdhd1.h" 5062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel#include "stv6110x.h" 5162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel#include "stv090x.h" 5262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel#include "isl6423.h" 53da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov#include "lnbh24.h" 54da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 56bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissstatic int diseqc_method; 57bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endrissmodule_param(diseqc_method, int, 0444); 58bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver EndrissMODULE_PARM_DESC(diseqc_method, "Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)"); 59bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss 6026dc4d0487bb8b8de32d09c18a83c63d622156f2Janne GrunauDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 6126dc4d0487bb8b8de32d09c18a83c63d622156f2Janne Grunau 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void Set22K (struct budget *budget, int state) 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO)); 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Diseqc functions only for TT Budget card */ 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* taken from the Skyvision DVB driver by 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Ralph Metzler <rjkm@metzlerbros.de> */ 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendBit (struct budget *budget, int data) 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 500 : 1000); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(data ? 1000 : 500); 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiseqcSendByte (struct budget *budget, int data) 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i, par=1, d; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=7; i>=0; i--) { 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds d = (data>>i)&1; 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds par ^= d; 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, d); 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendBit(budget, par); 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, unsigned long burst) 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=0; i<len; i++) 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, msg[i]); 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(16); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst!=-1) { 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (burst) 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DiseqcSendByte(budget, 0xff); 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); 119db210426d48998ed412f267b28cf6e62ea0496a8Thierry MERLE mdelay(12); 120db210426d48998ed412f267b28cf6e62ea0496a8Thierry MERLE udelay(500); 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(20); 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Routines for the Fujitsu Siemens Activy budget card 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 22 kHz tone and DiSEqC are handled by the frontend. 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Voltage must be set here. 133f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss * GPIO 1: LNBP EN, GPIO 2: LNBP VSEL 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SetVoltage_Activy (struct budget *budget, fe_sec_voltage_t voltage) 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7146_dev *dev=budget->dev; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "budget: %p\n", budget); 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (voltage) { 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_13: 143f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTLO); 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_VOLTAGE_18: 147f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 150f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss case SEC_VOLTAGE_OFF: 151f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); 152f49cc15bbe37b767286fdd7abe65810e750cf70aOliver Endriss break; 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int siemens_budget_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return SetVoltage_Activy (budget, voltage); 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (tone) { 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_ON: 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 1); 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SEC_TONE_OFF: 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Set22K (budget, 0); 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd) 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SendDiSEqCMsg (budget, 0, NULL, minicmd); 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20514d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int alps_bsrv2_tuner_set_params(struct dvb_frontend *fe) 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2071466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwr = 0; 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 buf[4]; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) }; 2121466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab u32 div = (c->frequency + 479500) / 125; 2131466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab 2141466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab if (c->frequency > 2000000) 2151466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 3; 2161466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency > 1800000) 2171466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 2; 2181466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency > 1600000) 2191466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 1; 2201466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency > 1200000) 2211466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 0; 2221466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency >= 1100000) 2231466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab pwr = 1; 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else pwr = 2; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0] = (div >> 8) & 0x7f; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[1] = div & 0xff; 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[2] = ((div & 0x18000) >> 10) | 0x95; 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[3] = (pwr << 6) | 0x30; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2319101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab // NOTE: since we're using a prescaler of 2, we set the 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // divisor frequency to 62.5kHz and divide by 125 above 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 234dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 235dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1x93_config alps_bsrv2_config = 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x08, 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 90100000UL, 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert_pwm = 0, 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 24714d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int alps_tdbe2_tuner_set_params(struct dvb_frontend *fe) 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2491466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) }; 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2551466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = (c->frequency + 35937500 + 31250) / 62500; 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x85 | ((div >> 10) & 0x60); 2601466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab data[3] = (c->frequency < 174000000 ? 0x88 : c->frequency < 470000000 ? 0x84 : 0x81); 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 262dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 263dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ves1820_config alps_tdbe2_config = { 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x09, 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .xin = 57840000UL, 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .invert = 1, 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .selagc = VES1820_SELAGC_SIGNAMPERR, 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 27514d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int grundig_29504_401_tuner_set_params(struct dvb_frontend *fe) 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2771466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 278faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct budget *budget = fe->dvb->priv; 279faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss u8 *tuner_addr = fe->tuner_priv; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cfg, cpump, band_select; 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 283faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss struct i2c_msg msg = { .flags = 0, .buf = data, .len = sizeof(data) }; 284faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 285faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (tuner_addr) 286faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = *tuner_addr; 287faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss else 288faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss msg.addr = 0x61; 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2901466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = (36125000 + c->frequency) / 166666; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cfg = 0x88; 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2941466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab if (c->frequency < 175000000) 2951466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 2; 2961466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 390000000) 2971466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 1; 2981466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 470000000) 2991466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 2; 3001466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 750000000) 3011466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 1; 3021466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else 3031466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab cpump = 3; 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3051466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab if (c->frequency < 175000000) 3061466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab band_select = 0x0e; 3071466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else if (c->frequency < 470000000) 3081466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab band_select = 0x05; 3091466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab else 3101466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab band_select = 0x03; 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = ((div >> 10) & 0x60) | cfg; 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = (cpump << 6) | band_select; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 317dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 318dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct l64781_config grundig_29504_401_config = { 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x55, 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 327faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic struct l64781_config grundig_29504_401_config_activy = { 328faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss .demod_address = 0x54, 329faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss}; 330faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 331faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endrissstatic u8 tuner_address_grundig_29504_401_activy = 0x60; 332faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 33314d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int grundig_29504_451_tuner_set_params(struct dvb_frontend *fe) 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3351466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget* budget = (struct budget*) fe->dvb->priv; 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 div; 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 data[4]; 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3411466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = c->frequency / 125; 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[0] = (div >> 8) & 0x7f; 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[1] = div & 0xff; 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[2] = 0x8e; 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data[3] = 0x00; 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 347dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 348dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct tda8083_config grundig_29504_451_config = { 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .demod_address = 0x68, 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 35714d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehabstatic int s5h1420_tuner_set_params(struct dvb_frontend *fe) 35896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey{ 3591466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab struct dtv_frontend_properties *c = &fe->dtv_property_cache; 36096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct budget* budget = (struct budget*) fe->dvb->priv; 36196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u32 div; 36296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey u8 data[4]; 36396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 36496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 3651466194db5f83ade16e3b0bae7e57132d7692ea2Mauro Carvalho Chehab div = c->frequency / 1000; 36696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[0] = (div >> 8) & 0x7f; 36796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[1] = div & 0xff; 36896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[2] = 0xc2; 36996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 37096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (div < 1450) 37196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x00; 37296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 1850) 37396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x40; 37496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else if (div < 2000) 37596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0x80; 37696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey else 37796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey data[3] = 0xc0; 37896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 379dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher if (fe->ops.i2c_gate_ctrl) 380dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher fe->ops.i2c_gate_ctrl(fe, 1); 38196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; 38296bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 38396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey return 0; 38496bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey} 38596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 38696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quinceystatic struct s5h1420_config s5h1420_config = { 38796bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey .demod_address = 0x53, 388a9d6a80b41c04e8ff4c7442cc35f5df610863841Andrew de Quincey .invert = 1, 389dbad108bdcb30629c850f5606949510da010a686Patrick Boettcher .cdclk_polarity = 1, 39096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey}; 39196bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 392adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quinceystatic struct tda10086_config tda10086_config = { 393adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .demod_address = 0x0e, 394adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey .invert = 0, 395ea75baf4b0f117564bd50827a49c4b14d61d24e9Hartmut Hackmann .diseqc_tone = 1, 3969a1b04e461fc8127c902a988cd9a082ba0680b11Hartmut Hackmann .xtal_freq = TDA10086_XTAL_16M, 397adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey}; 398adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 39987dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic struct stv0299_config alps_bsru6_config_activy = { 40087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .demod_address = 0x68, 40187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .inittab = alps_bsru6_inittab, 40287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .mclk = 88000000UL, 40387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .invert = 1, 40487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .op0_off = 1, 40587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .min_delay_ms = 100, 40687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .set_symbol_rate = alps_bsru6_set_symbol_rate, 40787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss}; 40887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 40987dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic struct stv0299_config alps_bsbe1_config_activy = { 41087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .demod_address = 0x68, 41187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .inittab = alps_bsbe1_inittab, 41287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .mclk = 88000000UL, 41387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .invert = 1, 41487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .op0_off = 1, 41587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .min_delay_ms = 100, 41687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss .set_symbol_rate = alps_bsbe1_set_symbol_rate, 41787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss}; 41887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 41983512e207479d0bdb83ee1e000a306af9e6e870eOliver Endrissstatic int alps_tdhd1_204_request_firmware(struct dvb_frontend *fe, const struct firmware **fw, char *name) 42083512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss{ 42183512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss struct budget *budget = (struct budget *)fe->dvb->priv; 42283512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss 42383512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss return request_firmware(fw, name, &budget->dev->pci->dev); 42483512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss} 42583512e207479d0bdb83ee1e000a306af9e6e870eOliver Endriss 42687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 42787dd965f101bafea7c5e507f686814a0f0057417Oliver Endrissstatic int i2c_readreg(struct i2c_adapter *i2c, u8 adr, u8 reg) 42887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss{ 42987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss u8 val; 43087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss struct i2c_msg msg[] = { 43187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { .addr = adr, .flags = 0, .buf = ®, .len = 1 }, 43287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { .addr = adr, .flags = I2C_M_RD, .buf = &val, .len = 1 } 43387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss }; 43487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 43587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss return (i2c_transfer(i2c, msg, 2) != 2) ? -EIO : val; 43687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss} 43787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u8 read_pwm(struct budget* budget) 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 b = 0xff; 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 pwm; 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 }, 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} }; 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4459101e6222cb115240e24160bb90cce425bb74de5Mauro Carvalho Chehab if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff)) 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pwm = 0x48; 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pwm; 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 45162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regelstatic struct stv090x_config tt1600_stv090x_config = { 45262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .device = STV0903, 45362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .demod_mode = STV090x_SINGLE, 45462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .clk_mode = STV090x_CLK_EXT, 45562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 45693e32cdafbe70d66bd8c133dd1b663198723654fAndreas Regel .xtal = 13500000, 45762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .address = 0x68, 45862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 459560db4a1a0aaa8920995e60a6a8bbc9f8708f0a3Andreas Regel .ts1_mode = STV090x_TSMODE_DVBCI, 460560db4a1a0aaa8920995e60a6a8bbc9f8708f0a3Andreas Regel .ts2_mode = STV090x_TSMODE_SERIAL_CONTINUOUS, 46162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 46262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .repeater_level = STV090x_RPTLEVEL_16, 46362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 46462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_init = NULL, 465c5b74b0f5e81386ca1e9b1128de83502e92fa028Manu Abraham .tuner_sleep = NULL, 46662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_mode = NULL, 46762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_frequency = NULL, 46862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_frequency = NULL, 46962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_bandwidth = NULL, 47062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_bandwidth = NULL, 47162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_bbgain = NULL, 47262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_bbgain = NULL, 47362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_set_refclk = NULL, 47462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .tuner_get_status = NULL, 47562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel}; 47662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 47762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regelstatic struct stv6110x_config tt1600_stv6110x_config = { 47862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .addr = 0x60, 47962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .refclk = 27000000, 48093e32cdafbe70d66bd8c133dd1b663198723654fAndreas Regel .clk_div = 2, 48162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel}; 48262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 48362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regelstatic struct isl6423_config tt1600_isl6423_config = { 48462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .current_max = SEC_CURRENT_515m, 48562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .curlim = SEC_CURRENT_LIM_ON, 48662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .mod_extern = 1, 48762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel .addr = 0x08, 48862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel}; 48962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void frontend_init(struct budget *budget) 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 49287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss (void)alps_bsbe1_config; /* avoid warning */ 49387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch(budget->dev->pci->subsystem_device) { 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659)) 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1013: 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRV2 first of all 4982bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &budget->i2c_adap); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 500dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params; 501dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 502dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 503dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_tone = budget_set_tone; 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // try the ALPS BSRU6 now 5082bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config, &budget->i2c_adap); 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 510dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 511067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 512bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss if (budget->dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) { 513bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; 514bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; 515bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss budget->dvb_frontend->ops.set_tone = budget_set_tone; 516bc495b66d048d64a9b8aeb49ca8405f4687ca123Oliver Endriss } 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659)) 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5232bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(ves1820_attach, &alps_tdbe2_config, &budget->i2c_adap, read_pwm(budget)); 524067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 525dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params; 526067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 527067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x1005: // Hauppauge/TT Nova-T budget (L64781/Grundig 29504-401(tsa5060)) 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5322bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config, &budget->i2c_adap); 533067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey if (budget->dvb_frontend) { 534dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 5356dbe7af37def293e1116af186c94e2d47d353190Tony Broad budget->dvb_frontend->tuner_priv = NULL; 536067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey break; 537067145bdd41bcb090510c73cc6ecd7b09213f038Andrew de Quincey } 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 54081e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese case 0x4f52: /* Cards based on Philips Semi Sylt PCI ref. design */ 54181e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config, &budget->i2c_adap); 54281e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese if (budget->dvb_frontend) { 54381e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese printk(KERN_INFO "budget: tuner ALPS BSRU6 in Philips Semi. Sylt detected\n"); 54481e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 54581e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 54681e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese break; 54781e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese } 54881e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese break; 54981e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese 55087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss case 0x4f60: /* Fujitsu Siemens Activy Budget-S PCI rev AL (stv0299/tsa5059) */ 55187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss { 55287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss int subtype = i2c_readreg(&budget->i2c_adap, 0x50, 0x67); 55387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss 55487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (subtype < 0) 55587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 55687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* fixme: find a better way to identify the card */ 55787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (subtype < 0x36) { 55887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* assume ALPS BSRU6 */ 55987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsru6_config_activy, &budget->i2c_adap); 56087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (budget->dvb_frontend) { 56187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss printk(KERN_INFO "budget: tuner ALPS BSRU6 detected\n"); 56287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; 56387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 56487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 56587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 56687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 56787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 56887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } else { 56987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* assume ALPS BSBE1 */ 57087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss /* reset tuner */ 57187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss saa7146_setgpio(budget->dev, 3, SAA7146_GPIO_OUTLO); 57287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss msleep(50); 57387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss saa7146_setgpio(budget->dev, 3, SAA7146_GPIO_OUTHI); 57487dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss msleep(250); 57587dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend = dvb_attach(stv0299_attach, &alps_bsbe1_config_activy, &budget->i2c_adap); 57687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss if (budget->dvb_frontend) { 57787dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss printk(KERN_INFO "budget: tuner ALPS BSBE1 detected\n"); 57887dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params; 57987dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 58087dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 58187dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 58287dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss break; 58387dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 58687dd965f101bafea7c5e507f686814a0f0057417Oliver Endriss } 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x4f61: // Fujitsu Siemens Activy Budget-S PCI rev GR (tda8083/Grundig 29504-451(tsa5522)) 5892bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(tda8083_attach, &grundig_29504_451_config, &budget->i2c_adap); 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend) { 591dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params; 592dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.set_voltage = siemens_budget_set_voltage; 593dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.dishnetwork_send_legacy_command = NULL; 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 59696bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey 59781ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss case 0x5f60: /* Fujitsu Siemens Activy Budget-T PCI rev AL (tda10046/ALPS TDHD1-204A) */ 59881ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss budget->dvb_frontend = dvb_attach(tda10046_attach, &alps_tdhd1_204a_config, &budget->i2c_adap); 59981ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss if (budget->dvb_frontend) { 60081ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = alps_tdhd1_204a_tuner_set_params; 60181ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss budget->dvb_frontend->tuner_priv = &budget->i2c_adap; 60281ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss } 60381ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss break; 60481ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss 605faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss case 0x5f61: /* Fujitsu Siemens Activy Budget-T PCI rev GR (L64781/Grundig 29504-401(tsa5060)) */ 606faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config_activy, &budget->i2c_adap); 607faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss if (budget->dvb_frontend) { 608faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->tuner_priv = &tuner_address_grundig_29504_401_activy; 609faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params; 610faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss } 611faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss break; 612faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss 61396bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey case 0x1016: // Hauppauge/TT Nova-S SE (samsung s5h1420/????(tda8260)) 6142bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey budget->dvb_frontend = dvb_attach(s5h1420_attach, &s5h1420_config, &budget->i2c_adap); 61596bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey if (budget->dvb_frontend) { 616dea74869f3c62b0b7addd67017b22b394e942aacPatrick Boettcher budget->dvb_frontend->ops.tuner_ops.set_params = s5h1420_tuner_set_params; 617adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 6183ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 619adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey goto error_out; 620adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 621adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey break; 622adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey } 623adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 624adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey case 0x1018: // TT Budget-S-1401 (philips tda10086/philips tda8262) 625adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey // gpio2 is connected to CLB - reset it + leave it high 626adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 627adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 628adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 629adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey msleep(1); 630adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey 631adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey budget->dvb_frontend = dvb_attach(tda10086_attach, &tda10086_config, &budget->i2c_adap); 632adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (budget->dvb_frontend) { 633adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(tda826x_attach, budget->dvb_frontend, 0x60, &budget->i2c_adap, 0) == NULL) 6343ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No tda826x found!\n", __func__); 635adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey if (dvb_attach(lnbp21_attach, budget->dvb_frontend, &budget->i2c_adap, 0, 0) == NULL) { 6363ca7fc84e37c5cf446fe4137f885f74e71373d7fHarvey Harrison printk("%s: No LNBP21 found!\n", __func__); 6379691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 6389691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel } 63996bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey break; 64096bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey } 64162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 64262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel case 0x101c: { /* TT S2-1600 */ 64362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel struct stv6110x_devctl *ctl; 64462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 64562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel msleep(50); 64662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 64762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel msleep(250); 64862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 64962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel budget->dvb_frontend = dvb_attach(stv090x_attach, 65062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &tt1600_stv090x_config, 65162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &budget->i2c_adap, 65262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel STV090x_DEMODULATOR_0); 65362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 65462ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel if (budget->dvb_frontend) { 65562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 65662ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel ctl = dvb_attach(stv6110x_attach, 65762ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel budget->dvb_frontend, 65862ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &tt1600_stv6110x_config, 65962ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel &budget->i2c_adap); 66062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel 661dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork if (ctl) { 662dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_init = ctl->tuner_init; 663dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_sleep = ctl->tuner_sleep; 664dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode; 665dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency; 666dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency; 667dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_bandwidth = ctl->tuner_set_bandwidth; 668dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_bandwidth = ctl->tuner_get_bandwidth; 669dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_bbgain = ctl->tuner_set_bbgain; 670dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_bbgain = ctl->tuner_get_bbgain; 671dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_set_refclk = ctl->tuner_set_refclk; 672dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tt1600_stv090x_config.tuner_get_status = ctl->tuner_get_status; 673dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork 674dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork /* call the init function once to initialize 675dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork tuner's clock output divider and demod's 676dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork master clock */ 677dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork if (budget->dvb_frontend->ops.init) 678dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork budget->dvb_frontend->ops.init(budget->dvb_frontend); 679dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork 680dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork if (dvb_attach(isl6423_attach, 681dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork budget->dvb_frontend, 682dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork &budget->i2c_adap, 683dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork &tt1600_isl6423_config) == NULL) { 684dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork printk(KERN_ERR "%s: No Intersil ISL6423 found!\n", __func__); 685dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork goto error_out; 686dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork } 687dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork } else { 688dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork printk(KERN_ERR "%s: No STV6110(A) Silicon Tuner found!\n", __func__); 689dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork goto error_out; 690dd0bbcc626d8baa6821c6cb9c45ecf3759ef8088Bjørn Mork } 69162ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel } 69262ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel } 69362ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel break; 694da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 695da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov case 0x1020: { /* Omicom S2 */ 696da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov struct stv6110x_devctl *ctl; 697da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTLO); 698da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov msleep(50); 699da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov saa7146_setgpio(budget->dev, 2, SAA7146_GPIO_OUTHI); 700da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov msleep(250); 701da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 702da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov budget->dvb_frontend = dvb_attach(stv090x_attach, 703da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov &tt1600_stv090x_config, 704da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov &budget->i2c_adap, 705da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov STV090x_DEMODULATOR_0); 706da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 707da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov if (budget->dvb_frontend) { 708da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov printk(KERN_INFO "budget: Omicom S2 detected\n"); 709da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 710da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov ctl = dvb_attach(stv6110x_attach, 711da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov budget->dvb_frontend, 712da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov &tt1600_stv6110x_config, 713da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov &budget->i2c_adap); 714da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 715da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov if (ctl) { 716da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_init = ctl->tuner_init; 717da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_sleep = ctl->tuner_sleep; 718da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_set_mode = ctl->tuner_set_mode; 719da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency; 720da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency; 721da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_set_bandwidth = ctl->tuner_set_bandwidth; 722da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_get_bandwidth = ctl->tuner_get_bandwidth; 723da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_set_bbgain = ctl->tuner_set_bbgain; 724da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_get_bbgain = ctl->tuner_get_bbgain; 725da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_set_refclk = ctl->tuner_set_refclk; 726da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tt1600_stv090x_config.tuner_get_status = ctl->tuner_get_status; 727da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 728da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov /* call the init function once to initialize 729da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov tuner's clock output divider and demod's 730da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov master clock */ 731da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov if (budget->dvb_frontend->ops.init) 732da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov budget->dvb_frontend->ops.init(budget->dvb_frontend); 733da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov 734da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov if (dvb_attach(lnbh24_attach, 735da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov budget->dvb_frontend, 736da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov &budget->i2c_adap, 737da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov LNBH24_PCL | LNBH24_TTX, 738da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov LNBH24_TEN, 0x14>>1) == NULL) { 739da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov printk(KERN_ERR 740da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov "No LNBH24 found!\n"); 741da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov goto error_out; 742da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov } 743da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov } else { 744da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov printk(KERN_ERR "%s: No STV6110(A) Silicon Tuner found!\n", __func__); 745da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov goto error_out; 746da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov } 747da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov } 748da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov } 749da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov break; 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (budget->dvb_frontend == NULL) { 75329e66a6ce84abe04bc809ddb35634752881dec79Bjorn Helgaas printk("budget: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n", 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->vendor, 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->device, 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_vendor, 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget->dev->pci->subsystem_device); 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 7599691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) 7609691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel goto error_out; 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7629691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 7639691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel 7649691bb14d9ab646868a6392e9419070c304a9590Martin Zwickelerror_out: 7659691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel printk("budget: Frontend registration failed!\n"); 766f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 7679691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel budget->dvb_frontend = NULL; 7689691bb14d9ab646868a6392e9419070c304a9590Martin Zwickel return; 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info) 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = NULL; 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds budget = kmalloc(sizeof(struct budget), GFP_KERNEL); 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if( NULL == budget ) { 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk(2, "dev:%p, info:%p, budget:%p\n", dev, info, budget); 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = budget; 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 78526dc4d0487bb8b8de32d09c18a83c63d622156f2Janne Grunau err = ttpci_budget_init(budget, dev, info, THIS_MODULE, adapter_nr); 78626dc4d0487bb8b8de32d09c18a83c63d622156f2Janne Grunau if (err) { 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("==> failed\n"); 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 792fdc53a6dbfea18e621dd23ed5cfb160837d7ce52Johannes Stezenbach budget->dvb_adapter.priv = budget; 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frontend_init(budget); 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 79532e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss ttpci_budget_init_hooks(budget); 79632e4c3a5622e832938aa0272e21a292564ff090aOliver Endriss 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int budget_detach (struct saa7146_dev* dev) 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct budget *budget = (struct budget*) dev->ext_priv; 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8052bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey if (budget->dvb_frontend) { 8062bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey dvb_unregister_frontend(budget->dvb_frontend); 807f52a838b74be70b4054ab27e435e9acb92d8c50aAndrew de Quincey dvb_frontend_detach(budget->dvb_frontend); 8082bfe031df6bd5e3b8e503eba8e3b6461d7c2c27eAndrew de Quincey } 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = ttpci_budget_deinit (budget); 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree (budget); 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->ext_priv = NULL; 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension; 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); 8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); 824adc619ac6e3d3b4a175476b915befe37650ee109Andrew de QuinceyMAKE_BUDGET_INFO(ttbs1401, "TT-Budget-S-1401 PCI", BUDGET_TT); 82562ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas RegelMAKE_BUDGET_INFO(tt1600, "TT-Budget S2-1600 PCI", BUDGET_TT); 8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs0, "Fujitsu Siemens Activy Budget-S PCI (rev GR/grundig frontend)", BUDGET_FS_ACTIVY); 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMAKE_BUDGET_INFO(fsacs1, "Fujitsu Siemens Activy Budget-S PCI (rev AL/alps frontend)", BUDGET_FS_ACTIVY); 828faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver EndrissMAKE_BUDGET_INFO(fsact, "Fujitsu Siemens Activy Budget-T PCI (rev GR/Grundig frontend)", BUDGET_FS_ACTIVY); 82981ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver EndrissMAKE_BUDGET_INFO(fsact1, "Fujitsu Siemens Activy Budget-T PCI (rev AL/ALPS TDHD1-204A)", BUDGET_FS_ACTIVY); 830da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny PlehovMAKE_BUDGET_INFO(omicom, "Omicom S2 PCI", BUDGET_TT); 83181e096c8ac6a064854c2157e0bf802dc4906678cPeter WieseMAKE_BUDGET_INFO(sylt, "Philips Semi Sylt PCI", BUDGET_TT_HW_DISEQC); 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id pci_tbl[] = { 8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003), 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), 83896bf2f2b549aab918f4225841df54c3d58896822Andrew de Quincey MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), 839adc619ac6e3d3b4a175476b915befe37650ee109Andrew de Quincey MAKE_EXTENSION_PCI(ttbs1401, 0x13c2, 0x1018), 84062ad7c11883ab7b4642da7d220a2bee7a37e3badAndreas Regel MAKE_EXTENSION_PCI(tt1600, 0x13c2, 0x101c), 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), 84381ae953b687e7cdfa094b07a6544523f3bb81aa3Oliver Endriss MAKE_EXTENSION_PCI(fsact1, 0x1131, 0x5f60), 844faea4d2ab2d4710f87739fd53b5c13ca7a7d34aaOliver Endriss MAKE_EXTENSION_PCI(fsact, 0x1131, 0x5f61), 845da2cd767f537082be0a02d83f87e0da4270e25b2Evgeny Plehov MAKE_EXTENSION_PCI(omicom, 0x14c4, 0x1020), 84681e096c8ac6a064854c2157e0bf802dc4906678cPeter Wiese MAKE_EXTENSION_PCI(sylt, 0x1131, 0x4f52), 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .vendor = 0, 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, pci_tbl); 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7146_extension budget_extension = { 8550e367a15ed08710098e2ff59aa25cec723c0a9d4Dave Jones .name = "budget dvb", 85600c4cc67512ada1d195b8bf3ef1db1d6b3951605Oliver Endriss .flags = SAA7146_USE_I2C_IRQ, 8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .module = THIS_MODULE, 8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .pci_tbl = pci_tbl, 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .attach = budget_attach, 8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .detach = budget_detach, 8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_mask = MASK_10, 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .irq_func = ttpci_budget_irq10_handler, 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init budget_init(void) 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return saa7146_register_extension(&budget_extension); 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit budget_exit(void) 8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7146_unregister_extension(&budget_extension); 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(budget_init); 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(budget_exit); 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others"); 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("driver for the SAA7146 based so-called " 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "budget PCI DVB cards by Siemens, Technotrend, Hauppauge"); 884