2 * budget.c: driver for the SAA7146 based Budget DVB cards
4 * Compiled from various sources by Michael Hunold <michael@mihu.de>
6 * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de>
8 * Copyright (C) 1999-2002 Ralph Metzler
9 * & Marcus Metzler for convergence integrated media GmbH
11 * 26feb2004 Support for FS Activy Card (Grundig tuner) by
12 * Michael Dreher <michael@5dot1.de>,
13 * Oliver Endriss <o.endriss@gmx.de> and
14 * Andreas 'randy' Weinberger
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with this program; if not, write to the Free Software
30 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
34 * the project's page is at http://www.linuxtv.org/dvb/
38 #include "dvb_functions.h"
40 static void Set22K (struct budget *budget, int state)
42 struct saa7146_dev *dev=budget->dev;
43 DEB_EE(("budget: %p\n",budget));
44 saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO));
48 /* Diseqc functions only for TT Budget card */
49 /* taken from the Skyvision DVB driver by
50 Ralph Metzler <rjkm@metzlerbros.de> */
52 static void DiseqcSendBit (struct budget *budget, int data)
54 struct saa7146_dev *dev=budget->dev;
55 DEB_EE(("budget: %p\n",budget));
57 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
58 udelay(data ? 500 : 1000);
59 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
60 udelay(data ? 1000 : 500);
64 static void DiseqcSendByte (struct budget *budget, int data)
68 DEB_EE(("budget: %p\n",budget));
70 for (i=7; i>=0; i--) {
73 DiseqcSendBit(budget, d);
76 DiseqcSendBit(budget, par);
80 static int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, unsigned long burst)
82 struct saa7146_dev *dev=budget->dev;
85 DEB_EE(("budget: %p\n",budget));
87 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
91 DiseqcSendByte(budget, msg[i]);
97 DiseqcSendByte(budget, 0xff);
99 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
101 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
110 int budget_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
112 struct budget *budget = fe->before_after_data;
114 DEB_EE(("budget: %p\n",budget));
118 switch ((fe_sec_tone_mode_t) arg) {
130 case FE_DISEQC_SEND_MASTER_CMD:
132 struct dvb_diseqc_master_cmd *cmd = arg;
134 SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0);
138 case FE_DISEQC_SEND_BURST:
139 SendDiSEqCMsg (budget, 0, NULL, (unsigned long)arg);
151 * Routines for the Fujitsu Siemens Activy budget card
152 * 22 kHz tone and DiSEqC are handled by the frontend.
153 * Voltage must be set here.
155 static int SetVoltage_Activy (struct budget *budget, fe_sec_voltage_t voltage)
157 struct saa7146_dev *dev=budget->dev;
159 DEB_EE(("budget: %p\n",budget));
163 saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTLO);
166 saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
176 static int budget_ioctl_activy (struct dvb_frontend *fe, unsigned int cmd, void *arg)
178 struct budget *budget = fe->before_after_data;
180 DEB_EE(("budget: %p\n",budget));
184 return SetVoltage_Activy (budget, (fe_sec_voltage_t) arg);
193 static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
195 struct budget *budget = NULL;
198 budget = kmalloc(sizeof(struct budget), GFP_KERNEL);
199 if( NULL == budget ) {
203 DEB_EE(("dev:%p, info:%p, budget:%p\n",dev,info,budget));
205 if ((err = ttpci_budget_init (budget, dev, info))) {
206 printk("==> failed\n");
211 if (budget->card->type == BUDGET_FS_ACTIVY)
212 dvb_add_frontend_ioctls (budget->dvb_adapter,
213 budget_ioctl_activy, NULL, budget);
215 dvb_add_frontend_ioctls (budget->dvb_adapter,
216 budget_diseqc_ioctl, NULL, budget);
218 dev->ext_priv = budget;
224 static int budget_detach (struct saa7146_dev* dev)
226 struct budget *budget = (struct budget*) dev->ext_priv;
229 if (budget->card->type == BUDGET_FS_ACTIVY)
230 dvb_remove_frontend_ioctls (budget->dvb_adapter,
231 budget_ioctl_activy, NULL);
233 dvb_remove_frontend_ioctls (budget->dvb_adapter,
234 budget_diseqc_ioctl, NULL);
236 err = ttpci_budget_deinit (budget);
239 dev->ext_priv = NULL;
246 static struct saa7146_extension budget_extension;
248 MAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT);
249 MAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT);
250 MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT);
251 MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC);
252 MAKE_BUDGET_INFO(fsacs, "Fujitsu Siemens Activy Budget-S PCI", BUDGET_FS_ACTIVY);
253 /* Uncomment for Budget Patch */
254 /*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/
256 static struct pci_device_id pci_tbl[] = {
257 /* Uncomment for Budget Patch */
258 /*MAKE_EXTENSION_PCI(fs_1_3,0x13c2, 0x0000),*/
259 MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003),
260 MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004),
261 MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005),
262 MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
263 MAKE_EXTENSION_PCI(fsacs, 0x1131, 0x4f61),
269 MODULE_DEVICE_TABLE(pci, pci_tbl);
271 static struct saa7146_extension budget_extension = {
272 .name = "budget dvb\0",
275 .module = THIS_MODULE,
277 .attach = budget_attach,
278 .detach = budget_detach,
281 .irq_func = ttpci_budget_irq10_handler,
285 static int __init budget_init(void)
287 return saa7146_register_extension(&budget_extension);
291 static void __exit budget_exit(void)
294 saa7146_unregister_extension(&budget_extension);
297 module_init(budget_init);
298 module_exit(budget_exit);
300 MODULE_LICENSE("GPL");
301 MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others");
302 MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
303 "budget PCI DVB cards by Siemens, Technotrend, Hauppauge");