aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2008-08-25 18:17:30 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2009-02-24 08:51:26 -0500
commit612262a53352af839a14b3395975a3440c95080a (patch)
treec31efac0f840ac633a48e0fd07fdd95029d25c17 /drivers
parent81c67b7f82769292a86b802590be5879413f9278 (diff)
firesat: copyrights, rename to firedtv, API conversions, fix remote control input
Combination of the following changes: Tue, 26 Aug 2008 00:17:30 +0200 (CEST) firedtv: fix remote control input and update the scancode-to-keycode mapping to a current model. Per default, various media key keycodes are emitted which closely match what is printed on the remote. Userland can modify the mapping by means of evdev ioctls. (Not tested.) The old scancode-to-keycode mapping is left in the driver but cannot be modified by ioctls. This preserves status quo for old remotes. Tue, 26 Aug 2008 00:11:28 +0200 (CEST) firedtv: replace tasklet by workqueue job Non-atomic context is a lot nicer to work with. Sun, 24 Aug 2008 23:30:00 +0200 (CEST) firedtv: move some code back to ieee1394 core Partially reverts "ieee1394: remove unused code" of Linux 2.6.25. Sun, 24 Aug 2008 23:29:30 +0200 (CEST) firedtv: replace semaphore by mutex firesat->avc_sem and ->demux_sem have been used exactly like a mutex. The only exception is the schedule_remotecontrol tasklet which did a down_trylock in atomic context. This is not possible with mutex_trylock; however the whole remote control related code is non-functional anyway at the moment. This should be fixed eventually, probably by turning the tasklet into a worqueue job. Convert everything else from semaphore to mutex. Also rewrite a few of the affected functions to unlock the mutex at a single exit point, instead of in several branches. Sun, 24 Aug 2008 23:28:45 +0200 (CEST) firedtv: some header cleanups Unify #ifndef/#define/#endif guards against multiple inclusion. Drop extern keyword from function declarations. Remove #include's into header files where struct declarations suffice. Remove unused ohci1394 interface and related unused ieee1394 interfaces. Add a few missing #include's and remove a few apparently obsolete ones. Sort them alphabetically. Sun, 24 Aug 2008 23:27:45 +0200 (CEST) firedtv: nicer registration message and some initialization fixes Print the correct name in dvb_register_adapter(). While we are at it, replace two switch cascades by one for loop, remove a superfluous member of struct firesat and of two unused arguments of AVCIdentifySubunit(), and fix bogus kfree's in firesat_dvbdev_init(). Tue, 26 Aug 2008 14:24:17 +0200 (CEST) firesat: rename to firedtv Suggested by Andreas Monitzer. Besides DVB-S/-S2 receivers, the driver also supports DVB-C and DVB-T receivers, hence the previous project name is too narrow now. Not yet done: Rename source directory, files, types, variables... Sun, 24 Aug 2008 23:26:23 +0200 (CEST) firesat: add missing copyright notes Reported by Andreas Monitzer and Christian Dolzer. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ieee1394/dma.h1
-rw-r--r--drivers/ieee1394/ieee1394_core.c1
-rw-r--r--drivers/ieee1394/ieee1394_transactions.c29
-rw-r--r--drivers/ieee1394/ieee1394_transactions.h2
-rw-r--r--drivers/ieee1394/iso.h1
-rw-r--r--drivers/media/dvb/Makefile2
-rw-r--r--drivers/media/dvb/firesat/Kconfig13
-rw-r--r--drivers/media/dvb/firesat/Makefile4
-rw-r--r--drivers/media/dvb/firesat/avc_api.c121
-rw-r--r--drivers/media/dvb/firesat/avc_api.h115
-rw-r--r--drivers/media/dvb/firesat/cmp.c99
-rw-r--r--drivers/media/dvb/firesat/cmp.h14
-rw-r--r--drivers/media/dvb/firesat/firesat-ci.c16
-rw-r--r--drivers/media/dvb/firesat/firesat-ci.h8
-rw-r--r--drivers/media/dvb/firesat/firesat-rc.c147
-rw-r--r--drivers/media/dvb/firesat/firesat-rc.h13
-rw-r--r--drivers/media/dvb/firesat/firesat.h78
-rw-r--r--drivers/media/dvb/firesat/firesat_1394.c164
-rw-r--r--drivers/media/dvb/firesat/firesat_dvb.c147
-rw-r--r--drivers/media/dvb/firesat/firesat_fe.c41
-rw-r--r--drivers/media/dvb/firesat/firesat_iso.c12
21 files changed, 502 insertions, 526 deletions
diff --git a/drivers/ieee1394/dma.h b/drivers/ieee1394/dma.h
index 2727bcd24194..467373cab8e5 100644
--- a/drivers/ieee1394/dma.h
+++ b/drivers/ieee1394/dma.h
@@ -12,6 +12,7 @@
12 12
13#include <asm/types.h> 13#include <asm/types.h>
14 14
15struct file;
15struct pci_dev; 16struct pci_dev;
16struct scatterlist; 17struct scatterlist;
17struct vm_area_struct; 18struct vm_area_struct;
diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c
index 2beb8d94f7bd..1028e725a27e 100644
--- a/drivers/ieee1394/ieee1394_core.c
+++ b/drivers/ieee1394/ieee1394_core.c
@@ -1314,6 +1314,7 @@ EXPORT_SYMBOL(hpsb_make_lock64packet);
1314EXPORT_SYMBOL(hpsb_make_phypacket); 1314EXPORT_SYMBOL(hpsb_make_phypacket);
1315EXPORT_SYMBOL(hpsb_read); 1315EXPORT_SYMBOL(hpsb_read);
1316EXPORT_SYMBOL(hpsb_write); 1316EXPORT_SYMBOL(hpsb_write);
1317EXPORT_SYMBOL(hpsb_lock);
1317EXPORT_SYMBOL(hpsb_packet_success); 1318EXPORT_SYMBOL(hpsb_packet_success);
1318 1319
1319/** highlevel.c **/ 1320/** highlevel.c **/
diff --git a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c
index 10c3d9f8c038..24021d2f0a75 100644
--- a/drivers/ieee1394/ieee1394_transactions.c
+++ b/drivers/ieee1394/ieee1394_transactions.c
@@ -570,3 +570,32 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
570 570
571 return retval; 571 return retval;
572} 572}
573
574int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
575 u64 addr, int extcode, quadlet_t *data, quadlet_t arg)
576{
577 struct hpsb_packet *packet;
578 int retval = 0;
579
580 BUG_ON(in_interrupt());
581
582 packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
583 if (!packet)
584 return -ENOMEM;
585
586 packet->generation = generation;
587 retval = hpsb_send_packet_and_wait(packet);
588 if (retval < 0)
589 goto hpsb_lock_fail;
590
591 retval = hpsb_packet_success(packet);
592
593 if (retval == 0)
594 *data = packet->data[0];
595
596hpsb_lock_fail:
597 hpsb_free_tlabel(packet);
598 hpsb_free_packet(packet);
599
600 return retval;
601}
diff --git a/drivers/ieee1394/ieee1394_transactions.h b/drivers/ieee1394/ieee1394_transactions.h
index d2d5bc3546d7..20b693be14b2 100644
--- a/drivers/ieee1394/ieee1394_transactions.h
+++ b/drivers/ieee1394/ieee1394_transactions.h
@@ -30,6 +30,8 @@ int hpsb_read(struct hpsb_host *host, nodeid_t node, unsigned int generation,
30 u64 addr, quadlet_t *buffer, size_t length); 30 u64 addr, quadlet_t *buffer, size_t length);
31int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation, 31int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
32 u64 addr, quadlet_t *buffer, size_t length); 32 u64 addr, quadlet_t *buffer, size_t length);
33int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
34 u64 addr, int extcode, quadlet_t *data, quadlet_t arg);
33 35
34#ifdef HPSB_DEBUG_TLABELS 36#ifdef HPSB_DEBUG_TLABELS
35extern spinlock_t hpsb_tlabel_lock; 37extern spinlock_t hpsb_tlabel_lock;
diff --git a/drivers/ieee1394/iso.h b/drivers/ieee1394/iso.h
index b5de5f21ef78..c2089c093aa7 100644
--- a/drivers/ieee1394/iso.h
+++ b/drivers/ieee1394/iso.h
@@ -13,6 +13,7 @@
13#define IEEE1394_ISO_H 13#define IEEE1394_ISO_H
14 14
15#include <linux/spinlock_types.h> 15#include <linux/spinlock_types.h>
16#include <linux/wait.h>
16#include <asm/atomic.h> 17#include <asm/atomic.h>
17#include <asm/types.h> 18#include <asm/types.h>
18 19
diff --git a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile
index 41710554012f..cb765816f76c 100644
--- a/drivers/media/dvb/Makefile
+++ b/drivers/media/dvb/Makefile
@@ -4,4 +4,4 @@
4 4
5obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/ 5obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/
6 6
7obj-$(CONFIG_DVB_FIRESAT) += firesat/ 7obj-$(CONFIG_DVB_FIREDTV) += firesat/
diff --git a/drivers/media/dvb/firesat/Kconfig b/drivers/media/dvb/firesat/Kconfig
index 93f8de5ec3c8..03d25ad10350 100644
--- a/drivers/media/dvb/firesat/Kconfig
+++ b/drivers/media/dvb/firesat/Kconfig
@@ -1,11 +1,12 @@
1config DVB_FIRESAT 1config DVB_FIREDTV
2 tristate "FireSAT devices" 2 tristate "FireDTV (FireWire attached DVB receivers)"
3 depends on DVB_CORE && IEEE1394 && INPUT 3 depends on DVB_CORE && IEEE1394 && INPUT
4 help 4 help
5 Support for external IEEE1394 adapters designed by Digital Everywhere and 5 Support for DVB receivers from Digital Everywhere, known as FireDTV
6 produced by El Gato, shipped under the brand name 'FireDTV/FloppyDTV'. 6 and FloppyDTV, which are connected via IEEE 1394 (FireWire).
7 7
8 These devices don't have a MPEG decoder built in, so you need 8 These devices don't have an MPEG decoder built in, so you need
9 an external software decoder to watch TV. 9 an external software decoder to watch TV.
10 10
11 Say Y if you own such a device and want to use it. 11 To compile this driver as a module, say M here: the module will be
12 called firedtv.
diff --git a/drivers/media/dvb/firesat/Makefile b/drivers/media/dvb/firesat/Makefile
index be7701b817c9..9e49edc7c49d 100644
--- a/drivers/media/dvb/firesat/Makefile
+++ b/drivers/media/dvb/firesat/Makefile
@@ -1,4 +1,4 @@
1firesat-objs := firesat_1394.o \ 1firedtv-objs := firesat_1394.o \
2 firesat_dvb.o \ 2 firesat_dvb.o \
3 firesat_fe.o \ 3 firesat_fe.o \
4 firesat_iso.o \ 4 firesat_iso.o \
@@ -7,7 +7,7 @@ firesat-objs := firesat_1394.o \
7 firesat-rc.o \ 7 firesat-rc.o \
8 firesat-ci.o 8 firesat-ci.o
9 9
10obj-$(CONFIG_DVB_FIRESAT) += firesat.o 10obj-$(CONFIG_DVB_FIREDTV) += firedtv.o
11 11
12EXTRA_CFLAGS := -Idrivers/ieee1394 12EXTRA_CFLAGS := -Idrivers/ieee1394
13EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core 13EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
diff --git a/drivers/media/dvb/firesat/avc_api.c b/drivers/media/dvb/firesat/avc_api.c
index 3c8e7e3dacc2..6337f9f21d0f 100644
--- a/drivers/media/dvb/firesat/avc_api.c
+++ b/drivers/media/dvb/firesat/avc_api.c
@@ -1,9 +1,9 @@
1/* 1/*
2 * FireSAT AVC driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) 2004 Andreas Monitzer <andy@monitzer.com> 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (c) 2008 Ben Backx <ben@bbackx.com> 5 * Copyright (C) 2008 Ben Backx <ben@bbackx.com>
6 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 6 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
7 * 7 *
8 * This program is free software; you can redistribute it and/or 8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as 9 * modify it under the terms of the GNU General Public License as
@@ -11,13 +11,20 @@
11 * the License, or (at your option) any later version. 11 * the License, or (at your option) any later version.
12 */ 12 */
13 13
14#include "firesat.h" 14#include <linux/crc32.h>
15#include <linux/delay.h>
16#include <linux/kernel.h>
17#include <linux/moduleparam.h>
18#include <linux/mutex.h>
19#include <linux/wait.h>
20#include <linux/workqueue.h>
21#include <asm/atomic.h>
22
15#include <ieee1394_transactions.h> 23#include <ieee1394_transactions.h>
16#include <nodemgr.h> 24#include <nodemgr.h>
17#include <asm/byteorder.h> 25
18#include <linux/delay.h>
19#include <linux/crc32.h>
20#include "avc_api.h" 26#include "avc_api.h"
27#include "firesat.h"
21#include "firesat-rc.h" 28#include "firesat-rc.h"
22 29
23#define RESPONSE_REGISTER 0xFFFFF0000D00ULL 30#define RESPONSE_REGISTER 0xFFFFF0000D00ULL
@@ -28,8 +35,6 @@ static unsigned int avc_comm_debug = 0;
28module_param(avc_comm_debug, int, 0644); 35module_param(avc_comm_debug, int, 0644);
29MODULE_PARM_DESC(avc_comm_debug, "debug logging level [0..2] of AV/C communication, default is 0 (no)"); 36MODULE_PARM_DESC(avc_comm_debug, "debug logging level [0..2] of AV/C communication, default is 0 (no)");
30 37
31static int __AVCRegisterRemoteControl(struct firesat*firesat, int internal);
32
33/* Frees an allocated packet */ 38/* Frees an allocated packet */
34static void avc_free_packet(struct hpsb_packet *packet) 39static void avc_free_packet(struct hpsb_packet *packet)
35{ 40{
@@ -232,67 +237,39 @@ static int __AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm,
232 return 0; 237 return 0;
233} 238}
234 239
235int AVCWrite(struct firesat*firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm) { 240int AVCWrite(struct firesat*firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm)
241{
236 int ret; 242 int ret;
237 if(down_interruptible(&firesat->avc_sem)) 243
244 if (mutex_lock_interruptible(&firesat->avc_mutex))
238 return -EINTR; 245 return -EINTR;
239 246
240 ret = __AVCWrite(firesat, CmdFrm, RspFrm); 247 ret = __AVCWrite(firesat, CmdFrm, RspFrm);
241 248
242 up(&firesat->avc_sem); 249 mutex_unlock(&firesat->avc_mutex);
243 return ret; 250 return ret;
244} 251}
245 252
246static void do_schedule_remotecontrol(unsigned long ignored); 253int AVCRecv(struct firesat *firesat, u8 *data, size_t length)
247DECLARE_TASKLET(schedule_remotecontrol, do_schedule_remotecontrol, 0); 254{
248 255 AVCRspFrm *RspFrm = (AVCRspFrm *)data;
249static void do_schedule_remotecontrol(unsigned long ignored) { 256
250 struct firesat *firesat; 257 if (length >= 8 &&
251 unsigned long flags; 258 RspFrm->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
252 259 RspFrm->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
253 spin_lock_irqsave(&firesat_list_lock, flags); 260 RspFrm->operand[2] == SFE_VENDOR_DE_COMPANYID_2 &&
254 list_for_each_entry(firesat,&firesat_list,list) { 261 RspFrm->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
255 if(atomic_read(&firesat->reschedule_remotecontrol) == 1) { 262 if (RspFrm->resp == CHANGED) {
256 if(down_trylock(&firesat->avc_sem)) 263 firesat_handle_rc(RspFrm->operand[4] << 8 |
257 tasklet_schedule(&schedule_remotecontrol); 264 RspFrm->operand[5]);
258 else { 265 schedule_work(&firesat->remote_ctrl_work);
259 if(__AVCRegisterRemoteControl(firesat, 1) == 0) 266 } else if (RspFrm->resp != INTERIM) {
260 atomic_set(&firesat->reschedule_remotecontrol, 0); 267 printk(KERN_INFO "firedtv: remote control result = "
261 else 268 "%d\n", RspFrm->resp);
262 tasklet_schedule(&schedule_remotecontrol);
263
264 up(&firesat->avc_sem);
265 }
266 } 269 }
267 }
268 spin_unlock_irqrestore(&firesat_list_lock, flags);
269}
270
271int AVCRecv(struct firesat *firesat, u8 *data, size_t length) {
272// printk(KERN_INFO "%s\n",__func__);
273
274 // remote control handling
275
276#if 0
277 AVCRspFrm *RspFrm = (AVCRspFrm*)data;
278
279 if(/*RspFrm->length >= 8 && ###*/
280 ((RspFrm->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
281 RspFrm->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
282 RspFrm->operand[2] == SFE_VENDOR_DE_COMPANYID_2)) &&
283 RspFrm->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
284 if(RspFrm->resp == CHANGED) {
285// printk(KERN_INFO "%s: code = %02x %02x\n",__func__,RspFrm->operand[4],RspFrm->operand[5]);
286 firesat_got_remotecontrolcode((((u16)RspFrm->operand[4]) << 8) | ((u16)RspFrm->operand[5]));
287
288 // schedule
289 atomic_set(&firesat->reschedule_remotecontrol, 1);
290 tasklet_schedule(&schedule_remotecontrol);
291 } else if(RspFrm->resp != INTERIM)
292 printk(KERN_INFO "%s: remote control result = %d\n",__func__, RspFrm->resp);
293 return 0; 270 return 0;
294 } 271 }
295#endif 272
296 if(atomic_read(&firesat->avc_reply_received) == 1) { 273 if(atomic_read(&firesat->avc_reply_received) == 1) {
297 printk(KERN_ERR "%s: received out-of-order AVC response, " 274 printk(KERN_ERR "%s: received out-of-order AVC response, "
298 "ignored\n",__func__); 275 "ignored\n",__func__);
@@ -718,7 +695,8 @@ int AVCTuner_GetTS(struct firesat *firesat){
718 return 0; 695 return 0;
719} 696}
720 697
721int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *transport) { 698int AVCIdentifySubunit(struct firesat *firesat)
699{
722 AVCCmdFrm CmdFrm; 700 AVCCmdFrm CmdFrm;
723 AVCRspFrm RspFrm; 701 AVCRspFrm RspFrm;
724 702
@@ -752,8 +730,6 @@ int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *tr
752 printk(KERN_ERR "%s: Invalid response length\n", __func__); 730 printk(KERN_ERR "%s: Invalid response length\n", __func__);
753 return -EINVAL; 731 return -EINVAL;
754 } 732 }
755 if(systemId)
756 *systemId = RspFrm.operand[7];
757 return 0; 733 return 0;
758} 734}
759 735
@@ -901,7 +877,7 @@ int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount)
901 return 0; 877 return 0;
902} 878}
903 879
904static int __AVCRegisterRemoteControl(struct firesat*firesat, int internal) 880int AVCRegisterRemoteControl(struct firesat *firesat)
905{ 881{
906 AVCCmdFrm CmdFrm; 882 AVCCmdFrm CmdFrm;
907 883
@@ -922,19 +898,16 @@ static int __AVCRegisterRemoteControl(struct firesat*firesat, int internal)
922 898
923 CmdFrm.length = 8; 899 CmdFrm.length = 8;
924 900
925 if(internal) { 901 return AVCWrite(firesat, &CmdFrm, NULL);
926 if(__AVCWrite(firesat,&CmdFrm,NULL) < 0)
927 return -EIO;
928 } else
929 if(AVCWrite(firesat,&CmdFrm,NULL) < 0)
930 return -EIO;
931
932 return 0;
933} 902}
934 903
935int AVCRegisterRemoteControl(struct firesat*firesat) 904void avc_remote_ctrl_work(struct work_struct *work)
936{ 905{
937 return __AVCRegisterRemoteControl(firesat, 0); 906 struct firesat *firesat =
907 container_of(work, struct firesat, remote_ctrl_work);
908
909 /* Should it be rescheduled in failure cases? */
910 AVCRegisterRemoteControl(firesat);
938} 911}
939 912
940int AVCTuner_Host2Ca(struct firesat *firesat) 913int AVCTuner_Host2Ca(struct firesat *firesat)
diff --git a/drivers/media/dvb/firesat/avc_api.h b/drivers/media/dvb/firesat/avc_api.h
index 041665685903..66f419a6f7c6 100644
--- a/drivers/media/dvb/firesat/avc_api.h
+++ b/drivers/media/dvb/firesat/avc_api.h
@@ -1,32 +1,25 @@
1/***************************************************************************
2 avc_api.h - description
3 -------------------
4 begin : Wed May 1 2000
5 copyright : (C) 2000 by Manfred Weihs
6 copyright : (C) 2003 by Philipp Gutgsell
7 copyright : (C) 2008 by Henrik Kurelid (henrik@kurelid.se)
8 email : 0014guph@edu.fh-kaernten.ac.at
9 ***************************************************************************/
10
11/***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 * *
18 ***************************************************************************/
19
20/* 1/*
21 This is based on code written by Peter Halwachs, 2 * AV/C API
22 Thomas Groiss and Andreas Monitzer. 3 *
23*/ 4 * Copyright (C) 2000 Manfred Weihs
24 5 * Copyright (C) 2003 Philipp Gutgsell <0014guph@edu.fh-kaernten.ac.at>
25 6 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
26#ifndef __AVC_API_H__ 7 * Copyright (C) 2008 Ben Backx <ben@bbackx.com>
27#define __AVC_API_H__ 8 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
28 9 *
29#include <linux/dvb/frontend.h> 10 * This is based on code written by Peter Halwachs, Thomas Groiss and
11 * Andreas Monitzer.
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License as
15 * published by the Free Software Foundation; either version 2 of
16 * the License, or (at your option) any later version.
17 */
18
19#ifndef _AVC_API_H
20#define _AVC_API_H
21
22#include <linux/types.h>
30 23
31/************************************************************* 24/*************************************************************
32 Constants from EN510221 25 Constants from EN510221
@@ -416,34 +409,38 @@ typedef struct
416 409
417#define LNBCONTROL_DONTCARE 0xff 410#define LNBCONTROL_DONTCARE 0xff
418 411
419 412struct dvb_diseqc_master_cmd;
420extern int AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm); 413struct dvb_frontend_parameters;
421extern int AVCRecv(struct firesat *firesat, u8 *data, size_t length); 414struct firesat;
422 415
423extern int AVCTuner_DSIT(struct firesat *firesat, 416int AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm,
424 int Source_Plug, 417 AVCRspFrm *RspFrm);
425 struct dvb_frontend_parameters *params, 418int AVCRecv(struct firesat *firesat, u8 *data, size_t length);
426 __u8 *status); 419
427 420int AVCTuner_DSIT(struct firesat *firesat, int Source_Plug,
428extern int AVCTunerStatus(struct firesat *firesat, ANTENNA_INPUT_INFO *antenna_input_info); 421 struct dvb_frontend_parameters *params, __u8 *status);
429extern int AVCTuner_DSD(struct firesat *firesat, struct dvb_frontend_parameters *params, __u8 *status); 422
430extern int AVCTuner_SetPIDs(struct firesat *firesat, unsigned char pidc, u16 pid[]); 423int AVCTunerStatus(struct firesat *firesat,
431extern int AVCTuner_GetTS(struct firesat *firesat); 424 ANTENNA_INPUT_INFO *antenna_input_info);
432 425int AVCTuner_DSD(struct firesat *firesat,
433extern int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *transport); 426 struct dvb_frontend_parameters *params, __u8 *status);
434extern int AVCLNBControl(struct firesat *firesat, char voltage, char burst, char conttone, char nrdiseq, struct dvb_diseqc_master_cmd *diseqcmd); 427int AVCTuner_SetPIDs(struct firesat *firesat, unsigned char pidc, u16 pid[]);
435extern int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount); 428int AVCTuner_GetTS(struct firesat *firesat);
436extern int AVCRegisterRemoteControl(struct firesat *firesat); 429
437extern int AVCTuner_Host2Ca(struct firesat *firesat); 430int AVCIdentifySubunit(struct firesat *firesat);
438extern int avc_ca_app_info(struct firesat *firesat, char *app_info, 431int AVCLNBControl(struct firesat *firesat, char voltage, char burst,
439 int *length); 432 char conttone, char nrdiseq,
440extern int avc_ca_info(struct firesat *firesat, char *app_info, int *length); 433 struct dvb_diseqc_master_cmd *diseqcmd);
441extern int avc_ca_reset(struct firesat *firesat); 434int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount);
442extern int avc_ca_pmt(struct firesat *firesat, char *app_info, int length); 435void avc_remote_ctrl_work(struct work_struct *work);
443extern int avc_ca_get_time_date(struct firesat *firesat, int *interval); 436int AVCRegisterRemoteControl(struct firesat *firesat);
444extern int avc_ca_enter_menu(struct firesat *firesat); 437int AVCTuner_Host2Ca(struct firesat *firesat);
445extern int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, 438int avc_ca_app_info(struct firesat *firesat, char *app_info, int *length);
446 int *length); 439int avc_ca_info(struct firesat *firesat, char *app_info, int *length);
447 440int avc_ca_reset(struct firesat *firesat);
448#endif 441int avc_ca_pmt(struct firesat *firesat, char *app_info, int length);
449 442int avc_ca_get_time_date(struct firesat *firesat, int *interval);
443int avc_ca_enter_menu(struct firesat *firesat);
444int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, int *length);
445
446#endif /* _AVC_API_H */
diff --git a/drivers/media/dvb/firesat/cmp.c b/drivers/media/dvb/firesat/cmp.c
index a1291caa0674..d1bafba615e4 100644
--- a/drivers/media/dvb/firesat/cmp.c
+++ b/drivers/media/dvb/firesat/cmp.c
@@ -1,8 +1,8 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) ? 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 5 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
6 * 6 *
7 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as 8 * modify it under the terms of the GNU General Public License as
@@ -10,15 +10,19 @@
10 * the License, or (at your option) any later version. 10 * the License, or (at your option) any later version.
11 */ 11 */
12 12
13#include "cmp.h" 13#include <linux/kernel.h>
14#include <ieee1394.h> 14#include <linux/mutex.h>
15#include <nodemgr.h> 15#include <linux/types.h>
16#include <highlevel.h> 16
17#include <ohci1394.h>
18#include <hosts.h> 17#include <hosts.h>
18#include <ieee1394.h>
19#include <ieee1394_core.h> 19#include <ieee1394_core.h>
20#include <ieee1394_transactions.h> 20#include <ieee1394_transactions.h>
21#include <nodemgr.h>
22
21#include "avc_api.h" 23#include "avc_api.h"
24#include "cmp.h"
25#include "firesat.h"
22 26
23typedef struct _OPCR 27typedef struct _OPCR
24{ 28{
@@ -38,63 +42,33 @@ typedef struct _OPCR
38 42
39#define FIRESAT_SPEED IEEE1394_SPEED_400 43#define FIRESAT_SPEED IEEE1394_SPEED_400
40 44
41/* hpsb_lock is being removed from the kernel-source, 45static int cmp_read(struct firesat *firesat, void *buf, u64 addr, size_t len)
42 * therefor we define our own 'firesat_hpsb_lock'*/ 46{
43
44int send_packet_and_wait(struct hpsb_packet *packet);
45
46int firesat_hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
47 u64 addr, int extcode, quadlet_t * data, quadlet_t arg) {
48
49 struct hpsb_packet *packet;
50 int retval = 0;
51
52 BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
53
54 packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
55 if (!packet)
56 return -ENOMEM;
57
58 packet->generation = generation;
59 retval = send_packet_and_wait(packet);
60 if (retval < 0)
61 goto hpsb_lock_fail;
62
63 retval = hpsb_packet_success(packet);
64
65 if (retval == 0) {
66 *data = packet->data[0];
67 }
68
69 hpsb_lock_fail:
70 hpsb_free_tlabel(packet);
71 hpsb_free_packet(packet);
72
73 return retval;
74}
75
76
77static int cmp_read(struct firesat *firesat, void *buffer, u64 addr, size_t length) {
78 int ret; 47 int ret;
79 if(down_interruptible(&firesat->avc_sem)) 48
49 if (mutex_lock_interruptible(&firesat->avc_mutex))
80 return -EINTR; 50 return -EINTR;
81 51
82 ret = hpsb_read(firesat->host, firesat->nodeentry->nodeid, firesat->nodeentry->generation, 52 ret = hpsb_read(firesat->host, firesat->nodeentry->nodeid,
83 addr, buffer, length); 53 firesat->nodeentry->generation, addr, buf, len);
84 54
85 up(&firesat->avc_sem); 55 mutex_unlock(&firesat->avc_mutex);
86 return ret; 56 return ret;
87} 57}
88 58
89static int cmp_lock(struct firesat *firesat, quadlet_t *data, u64 addr, quadlet_t arg, int ext_tcode) { 59static int cmp_lock(struct firesat *firesat, quadlet_t *data, u64 addr,
60 quadlet_t arg, int ext_tcode)
61{
90 int ret; 62 int ret;
91 if(down_interruptible(&firesat->avc_sem)) 63
64 if (mutex_lock_interruptible(&firesat->avc_mutex))
92 return -EINTR; 65 return -EINTR;
93 66
94 ret = firesat_hpsb_lock(firesat->host, firesat->nodeentry->nodeid, firesat->nodeentry->generation, 67 ret = hpsb_lock(firesat->host, firesat->nodeentry->nodeid,
95 addr, ext_tcode, data, arg); 68 firesat->nodeentry->generation,
69 addr, ext_tcode, data, arg);
96 70
97 up(&firesat->avc_sem); 71 mutex_unlock(&firesat->avc_mutex);
98 return ret; 72 return ret;
99} 73}
100 74
@@ -223,20 +197,3 @@ int try_CMPBreakPPconnection(struct firesat *firesat, int output_plug,int iso_ch
223 } 197 }
224 return 0; 198 return 0;
225} 199}
226
227static void complete_packet(void *data) {
228 complete((struct completion *) data);
229}
230
231int send_packet_and_wait(struct hpsb_packet *packet) {
232 struct completion done;
233 int retval;
234
235 init_completion(&done);
236 hpsb_set_packet_complete_task(packet, complete_packet, &done);
237 retval = hpsb_send_packet(packet);
238 if (retval == 0)
239 wait_for_completion(&done);
240
241 return retval;
242}
diff --git a/drivers/media/dvb/firesat/cmp.h b/drivers/media/dvb/firesat/cmp.h
index d43fbc29f262..600d5784dc72 100644
--- a/drivers/media/dvb/firesat/cmp.h
+++ b/drivers/media/dvb/firesat/cmp.h
@@ -1,9 +1,11 @@
1#ifndef __FIRESAT__CMP_H_ 1#ifndef _CMP_H
2#define __FIRESAT__CMP_H_ 2#define _CMP_H
3 3
4#include "firesat.h" 4struct firesat;
5 5
6extern int try_CMPEstablishPPconnection(struct firesat *firesat, int output_plug, int iso_channel); 6int try_CMPEstablishPPconnection(struct firesat *firesat, int output_plug,
7extern int try_CMPBreakPPconnection(struct firesat *firesat, int output_plug,int iso_channel); 7 int iso_channel);
8int try_CMPBreakPPconnection(struct firesat *firesat, int output_plug,
9 int iso_channel);
8 10
9#endif 11#endif /* _CMP_H */
diff --git a/drivers/media/dvb/firesat/firesat-ci.c b/drivers/media/dvb/firesat/firesat-ci.c
index 821048db283b..3ef25cc4bfdb 100644
--- a/drivers/media/dvb/firesat/firesat-ci.c
+++ b/drivers/media/dvb/firesat/firesat-ci.c
@@ -1,7 +1,8 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
5 * 6 *
6 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as 8 * modify it under the terms of the GNU General Public License as
@@ -9,13 +10,16 @@
9 * the License, or (at your option) any later version. 10 * the License, or (at your option) any later version.
10 */ 11 */
11 12
12#include "firesat-ci.h"
13#include "firesat.h"
14#include "avc_api.h"
15
16#include <linux/dvb/ca.h> 13#include <linux/dvb/ca.h>
14#include <linux/fs.h>
15#include <linux/module.h>
16
17#include <dvbdev.h> 17#include <dvbdev.h>
18 18
19#include "avc_api.h"
20#include "firesat.h"
21#include "firesat-ci.h"
22
19static unsigned int ca_debug = 0; 23static unsigned int ca_debug = 0;
20module_param(ca_debug, int, 0644); 24module_param(ca_debug, int, 0644);
21MODULE_PARM_DESC(ca_debug, "debug logging of ca system, default is 0 (no)"); 25MODULE_PARM_DESC(ca_debug, "debug logging of ca system, default is 0 (no)");
diff --git a/drivers/media/dvb/firesat/firesat-ci.h b/drivers/media/dvb/firesat/firesat-ci.h
index dafe3f0f0cc9..04fe4061c778 100644
--- a/drivers/media/dvb/firesat/firesat-ci.h
+++ b/drivers/media/dvb/firesat/firesat-ci.h
@@ -1,9 +1,9 @@
1#ifndef __FIRESAT_CA_H 1#ifndef _FIREDTV_CI_H
2#define __FIRESAT_CA_H 2#define _FIREDTV_CI_H
3 3
4#include "firesat.h" 4struct firesat;
5 5
6int firesat_ca_init(struct firesat *firesat); 6int firesat_ca_init(struct firesat *firesat);
7void firesat_ca_release(struct firesat *firesat); 7void firesat_ca_release(struct firesat *firesat);
8 8
9#endif 9#endif /* _FIREDTV_CI_H */
diff --git a/drivers/media/dvb/firesat/firesat-rc.c b/drivers/media/dvb/firesat/firesat-rc.c
index e300b81008af..d3e08f9fe9f7 100644
--- a/drivers/media/dvb/firesat/firesat-rc.c
+++ b/drivers/media/dvb/firesat/firesat-rc.c
@@ -1,9 +1,26 @@
1#include "firesat.h" 1/*
2#include "firesat-rc.h" 2 * FireDTV driver (formerly known as FireSAT)
3 *
4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 */
3 11
12#include <linux/bitops.h>
4#include <linux/input.h> 13#include <linux/input.h>
14#include <linux/kernel.h>
15#include <linux/types.h>
16
17#include "firesat-rc.h"
18
19/* fixed table with older keycodes, geared towards MythTV */
20const static u16 oldtable[] = {
21
22 /* code from device: 0x4501...0x451f */
5 23
6static u16 firesat_irtable[] = {
7 KEY_ESC, 24 KEY_ESC,
8 KEY_F9, 25 KEY_F9,
9 KEY_1, 26 KEY_1,
@@ -35,50 +52,124 @@ static u16 firesat_irtable[] = {
35 KEY_RIGHT, 52 KEY_RIGHT,
36 KEY_P, 53 KEY_P,
37 KEY_M, 54 KEY_M,
55
56 /* code from device: 0x4540...0x4542 */
57
38 KEY_R, 58 KEY_R,
39 KEY_V, 59 KEY_V,
40 KEY_C, 60 KEY_C,
41 0
42}; 61};
43 62
44static struct input_dev firesat_idev; 63/* user-modifiable table for a remote as sold in 2008 */
64static u16 keytable[] = {
65
66 /* code from device: 0x0300...0x031f */
67
68 [0x00] = KEY_POWER,
69 [0x01] = KEY_SLEEP,
70 [0x02] = KEY_STOP,
71 [0x03] = KEY_OK,
72 [0x04] = KEY_RIGHT,
73 [0x05] = KEY_1,
74 [0x06] = KEY_2,
75 [0x07] = KEY_3,
76 [0x08] = KEY_LEFT,
77 [0x09] = KEY_4,
78 [0x0a] = KEY_5,
79 [0x0b] = KEY_6,
80 [0x0c] = KEY_UP,
81 [0x0d] = KEY_7,
82 [0x0e] = KEY_8,
83 [0x0f] = KEY_9,
84 [0x10] = KEY_DOWN,
85 [0x11] = KEY_TITLE, /* "OSD" - fixme */
86 [0x12] = KEY_0,
87 [0x13] = KEY_F20, /* "16:9" - fixme */
88 [0x14] = KEY_SCREEN, /* "FULL" - fixme */
89 [0x15] = KEY_MUTE,
90 [0x16] = KEY_SUBTITLE,
91 [0x17] = KEY_RECORD,
92 [0x18] = KEY_TEXT,
93 [0x19] = KEY_AUDIO,
94 [0x1a] = KEY_RED,
95 [0x1b] = KEY_PREVIOUS,
96 [0x1c] = KEY_REWIND,
97 [0x1d] = KEY_PLAYPAUSE,
98 [0x1e] = KEY_NEXT,
99 [0x1f] = KEY_VOLUMEUP,
100
101 /* code from device: 0x0340...0x0354 */
102
103 [0x20] = KEY_CHANNELUP,
104 [0x21] = KEY_F21, /* "4:3" - fixme */
105 [0x22] = KEY_TV,
106 [0x23] = KEY_DVD,
107 [0x24] = KEY_VCR,
108 [0x25] = KEY_AUX,
109 [0x26] = KEY_GREEN,
110 [0x27] = KEY_YELLOW,
111 [0x28] = KEY_BLUE,
112 [0x29] = KEY_CHANNEL, /* "CH.LIST" */
113 [0x2a] = KEY_VENDOR, /* "CI" - fixme */
114 [0x2b] = KEY_VOLUMEDOWN,
115 [0x2c] = KEY_CHANNELDOWN,
116 [0x2d] = KEY_LAST,
117 [0x2e] = KEY_INFO,
118 [0x2f] = KEY_FORWARD,
119 [0x30] = KEY_LIST,
120 [0x31] = KEY_FAVORITES,
121 [0x32] = KEY_MENU,
122 [0x33] = KEY_EPG,
123 [0x34] = KEY_EXIT,
124};
125
126static struct input_dev *idev;
45 127
46int firesat_register_rc(void) 128int firesat_register_rc(void)
47{ 129{
48 int index; 130 int i, err;
131
132 idev = input_allocate_device();
133 if (!idev)
134 return -ENOMEM;
49 135
50 memset(&firesat_idev, 0, sizeof(firesat_idev)); 136 idev->name = "FireDTV remote control";
137 idev->evbit[0] = BIT_MASK(EV_KEY);
138 idev->keycode = keytable;
139 idev->keycodesize = sizeof(keytable[0]);
140 idev->keycodemax = ARRAY_SIZE(keytable);
51 141
52 firesat_idev.evbit[0] = BIT(EV_KEY); 142 for (i = 0; i < ARRAY_SIZE(keytable); i++)
143 set_bit(keytable[i], idev->keybit);
53 144
54 for (index = 0; firesat_irtable[index] != 0; index++) 145 err = input_register_device(idev);
55 set_bit(firesat_irtable[index], firesat_idev.keybit); 146 if (err)
147 input_free_device(idev);
56 148
57 return input_register_device(&firesat_idev); 149 return err;
58} 150}
59 151
60int firesat_unregister_rc(void) 152void firesat_unregister_rc(void)
61{ 153{
62 input_unregister_device(&firesat_idev); 154 input_unregister_device(idev);
63 return 0;
64} 155}
65 156
66int firesat_got_remotecontrolcode(u16 code) 157void firesat_handle_rc(unsigned int code)
67{ 158{
68 u16 keycode; 159 if (code >= 0x0300 && code <= 0x031f)
69 160 code = keytable[code - 0x0300];
70 if (code > 0x4500 && code < 0x4520) 161 else if (code >= 0x0340 && code <= 0x0354)
71 keycode = firesat_irtable[code - 0x4501]; 162 code = keytable[code - 0x0320];
72 else if (code > 0x453f && code < 0x4543) 163 else if (code >= 0x4501 && code <= 0x451f)
73 keycode = firesat_irtable[code - 0x4521]; 164 code = oldtable[code - 0x4501];
165 else if (code >= 0x4540 && code <= 0x4542)
166 code = oldtable[code - 0x4521];
74 else { 167 else {
75 printk(KERN_DEBUG "%s: invalid key code 0x%04x\n", __func__, 168 printk(KERN_DEBUG "firedtv: invalid key code 0x%04x "
76 code); 169 "from remote control\n", code);
77 return -EINVAL; 170 return;
78 } 171 }
79 172
80 input_report_key(&firesat_idev, keycode, 1); 173 input_report_key(idev, code, 1);
81 input_report_key(&firesat_idev, keycode, 0); 174 input_report_key(idev, code, 0);
82
83 return 0;
84} 175}
diff --git a/drivers/media/dvb/firesat/firesat-rc.h b/drivers/media/dvb/firesat/firesat-rc.h
index e89a8069ba88..81f4fdec60f1 100644
--- a/drivers/media/dvb/firesat/firesat-rc.h
+++ b/drivers/media/dvb/firesat/firesat-rc.h
@@ -1,9 +1,8 @@
1#ifndef __FIRESAT_LIRC_H 1#ifndef _FIREDTV_RC_H
2#define __FIRESAT_LIRC_H 2#define _FIREDTV_RC_H
3 3
4extern int firesat_register_rc(void); 4int firesat_register_rc(void);
5extern int firesat_unregister_rc(void); 5void firesat_unregister_rc(void);
6extern int firesat_got_remotecontrolcode(u16 code); 6void firesat_handle_rc(unsigned int code);
7
8#endif
9 7
8#endif /* _FIREDTV_RC_H */
diff --git a/drivers/media/dvb/firesat/firesat.h b/drivers/media/dvb/firesat/firesat.h
index f0bac244783a..5f0de88e41a6 100644
--- a/drivers/media/dvb/firesat/firesat.h
+++ b/drivers/media/dvb/firesat/firesat.h
@@ -1,8 +1,8 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) ? 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 5 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
6 * 6 *
7 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as 8 * modify it under the terms of the GNU General Public License as
@@ -10,22 +10,26 @@
10 * the License, or (at your option) any later version. 10 * the License, or (at your option) any later version.
11 */ 11 */
12 12
13#ifndef __FIRESAT_H 13#ifndef _FIREDTV_H
14#define __FIRESAT_H 14#define _FIREDTV_H
15 15
16#include "dvb_frontend.h"
17#include "dmxdev.h"
18#include "dvb_demux.h"
19#include "dvb_net.h"
20
21#include <linux/version.h>
22#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 25)
23#include <linux/semaphore.h>
24#endif
25#include <linux/dvb/frontend.h>
26#include <linux/dvb/dmx.h> 16#include <linux/dvb/dmx.h>
27#include <iso.h> 17#include <linux/dvb/frontend.h>
18#include <linux/list.h>
19#include <linux/mutex.h>
20#include <linux/spinlock_types.h>
21#include <linux/types.h>
22#include <linux/wait.h>
23#include <linux/workqueue.h>
24#include <asm/atomic.h>
25
26#include <demux.h>
27#include <dmxdev.h>
28#include <dvb_demux.h>
29#include <dvb_net.h>
30#include <dvbdev.h>
28 31
32#include <linux/version.h>
29#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 25) 33#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 25)
30#define DVB_REGISTER_ADAPTER(x, y, z, w, v) dvb_register_adapter(x, y, z, w, v) 34#define DVB_REGISTER_ADAPTER(x, y, z, w, v) dvb_register_adapter(x, y, z, w, v)
31#else 35#else
@@ -116,15 +120,19 @@
116 120
117 121
118enum model_type { 122enum model_type {
119 FireSAT_DVB_S = 1, 123 FireSAT_UNKNOWN = 0,
120 FireSAT_DVB_C = 2, 124 FireSAT_DVB_S = 1,
121 FireSAT_DVB_T = 3, 125 FireSAT_DVB_C = 2,
122 FireSAT_DVB_S2 = 4 126 FireSAT_DVB_T = 3,
127 FireSAT_DVB_S2 = 4,
123}; 128};
124 129
130struct hpsb_host;
131struct hpsb_iso;
132struct node_entry;
133
125struct firesat { 134struct firesat {
126 struct dvb_demux dvb_demux; 135 struct dvb_demux dvb_demux;
127 char *model_name;
128 136
129 /* DVB bits */ 137 /* DVB bits */
130 struct dvb_adapter *adapter; 138 struct dvb_adapter *adapter;
@@ -139,11 +147,10 @@ struct firesat {
139 int ca_last_command; 147 int ca_last_command;
140 int ca_time_interval; 148 int ca_time_interval;
141 149
142 struct semaphore avc_sem; 150 struct mutex avc_mutex;
143 wait_queue_head_t avc_wait; 151 wait_queue_head_t avc_wait;
144 atomic_t avc_reply_received; 152 atomic_t avc_reply_received;
145 153 struct work_struct remote_ctrl_work;
146 atomic_t reschedule_remotecontrol;
147 154
148 struct firesat_channel { 155 struct firesat_channel {
149 struct firesat *firesat; 156 struct firesat *firesat;
@@ -154,7 +161,7 @@ struct firesat {
154 int pid; 161 int pid;
155 int type; /* 1 - TS, 2 - Filter */ 162 int type; /* 1 - TS, 2 - Filter */
156 } channel[16]; 163 } channel[16];
157 struct semaphore demux_sem; 164 struct mutex demux_mutex;
158 165
159 /* needed by avc_api */ 166 /* needed by avc_api */
160 void *respfrm; 167 void *respfrm;
@@ -210,22 +217,23 @@ struct CIPHeader {
210 }; 217 };
211}; 218};
212 219
220extern const char *firedtv_model_names[];
213extern struct list_head firesat_list; 221extern struct list_head firesat_list;
214extern spinlock_t firesat_list_lock; 222extern spinlock_t firesat_list_lock;
215 223
224struct device;
225
216/* firesat_dvb.c */ 226/* firesat_dvb.c */
217extern int firesat_start_feed(struct dvb_demux_feed *dvbdmxfeed); 227int firesat_start_feed(struct dvb_demux_feed *dvbdmxfeed);
218extern int firesat_stop_feed(struct dvb_demux_feed *dvbdmxfeed); 228int firesat_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
219extern int firesat_dvbdev_init(struct firesat *firesat, 229int firesat_dvbdev_init(struct firesat *firesat, struct device *dev,
220 struct device *dev, 230 struct dvb_frontend *fe);
221 struct dvb_frontend *fe);
222 231
223/* firesat_fe.c */ 232/* firesat_fe.c */
224extern int firesat_frontend_attach(struct firesat *firesat, 233int firesat_frontend_attach(struct firesat *firesat, struct dvb_frontend *fe);
225 struct dvb_frontend *fe);
226 234
227/* firesat_iso.c */ 235/* firesat_iso.c */
228extern int setup_iso_channel(struct firesat *firesat); 236int setup_iso_channel(struct firesat *firesat);
229extern void tear_down_iso_channel(struct firesat *firesat); 237void tear_down_iso_channel(struct firesat *firesat);
230 238
231#endif 239#endif /* _FIREDTV_H */
diff --git a/drivers/media/dvb/firesat/firesat_1394.c b/drivers/media/dvb/firesat/firesat_1394.c
index b19e59416b59..a13fbe6b3a3c 100644
--- a/drivers/media/dvb/firesat/firesat_1394.c
+++ b/drivers/media/dvb/firesat/firesat_1394.c
@@ -1,9 +1,9 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) 2004 Andreas Monitzer <andy@monitzer.com> 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (c) 2007-2008 Ben Backx <ben@bbackx.com> 5 * Copyright (C) 2007-2008 Ben Backx <ben@bbackx.com>
6 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 6 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
7 * 7 *
8 * This program is free software; you can redistribute it and/or 8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as 9 * modify it under the terms of the GNU General Public License as
@@ -11,26 +11,34 @@
11 * the License, or (at your option) any later version. 11 * the License, or (at your option) any later version.
12 */ 12 */
13 13
14#include <linux/init.h> 14#include <linux/device.h>
15#include <linux/slab.h>
16#include <linux/wait.h>
17#include <linux/module.h>
18#include <linux/delay.h>
19#include <linux/time.h>
20#include <linux/errno.h> 15#include <linux/errno.h>
21#include <linux/interrupt.h> 16#include <linux/kernel.h>
22#include <ieee1394_hotplug.h> 17#include <linux/list.h>
23#include <nodemgr.h> 18#include <linux/module.h>
19#include <linux/mutex.h>
20#include <linux/slab.h>
21#include <linux/spinlock.h>
22#include <linux/string.h>
23#include <linux/types.h>
24#include <asm/atomic.h>
25
26#include <dmxdev.h>
27#include <dvb_demux.h>
28#include <dvb_frontend.h>
29#include <dvbdev.h>
30
31#include <csr1212.h>
24#include <highlevel.h> 32#include <highlevel.h>
25#include <ohci1394.h>
26#include <hosts.h> 33#include <hosts.h>
27#include <dvbdev.h> 34#include <ieee1394_hotplug.h>
35#include <nodemgr.h>
28 36
29#include "firesat.h"
30#include "avc_api.h" 37#include "avc_api.h"
31#include "cmp.h" 38#include "cmp.h"
32#include "firesat-rc.h" 39#include "firesat.h"
33#include "firesat-ci.h" 40#include "firesat-ci.h"
41#include "firesat-rc.h"
34 42
35#define FIRESAT_Vendor_ID 0x001287 43#define FIRESAT_Vendor_ID 0x001287
36 44
@@ -75,52 +83,6 @@ MODULE_DEVICE_TABLE(ieee1394, firesat_id_table);
75LIST_HEAD(firesat_list); 83LIST_HEAD(firesat_list);
76spinlock_t firesat_list_lock = SPIN_LOCK_UNLOCKED; 84spinlock_t firesat_list_lock = SPIN_LOCK_UNLOCKED;
77 85
78static void firesat_add_host(struct hpsb_host *host);
79static void firesat_remove_host(struct hpsb_host *host);
80static void firesat_host_reset(struct hpsb_host *host);
81
82static void fcp_request(struct hpsb_host *host,
83 int nodeid,
84 int direction,
85 int cts,
86 u8 *data,
87 size_t length);
88
89static struct hpsb_highlevel firesat_highlevel = {
90 .name = "FireSAT",
91 .add_host = firesat_add_host,
92 .remove_host = firesat_remove_host,
93 .host_reset = firesat_host_reset,
94 .fcp_request = fcp_request,
95};
96
97static void firesat_add_host (struct hpsb_host *host)
98{
99 struct ti_ohci *ohci = (struct ti_ohci *)host->hostdata;
100
101 /* We only work with the OHCI-1394 driver */
102 if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
103 return;
104
105 if (!hpsb_create_hostinfo(&firesat_highlevel, host, 0)) {
106 printk(KERN_ERR "Cannot allocate hostinfo\n");
107 return;
108 }
109
110 hpsb_set_hostinfo(&firesat_highlevel, host, ohci);
111 hpsb_set_hostinfo_key(&firesat_highlevel, host, ohci->host->id);
112}
113
114static void firesat_remove_host (struct hpsb_host *host)
115{
116
117}
118
119static void firesat_host_reset(struct hpsb_host *host)
120{
121 printk(KERN_INFO "FireSAT host_reset (nodeid = 0x%x, hosts active = %d)\n",host->node_id,host->nodes_active);
122}
123
124static void fcp_request(struct hpsb_host *host, 86static void fcp_request(struct hpsb_host *host,
125 int nodeid, 87 int nodeid,
126 int direction, 88 int direction,
@@ -156,6 +118,14 @@ static void fcp_request(struct hpsb_host *host,
156 printk("%s: received invalid fcp request, ignored\n", __func__); 118 printk("%s: received invalid fcp request, ignored\n", __func__);
157} 119}
158 120
121const char *firedtv_model_names[] = {
122 [FireSAT_UNKNOWN] = "unknown type",
123 [FireSAT_DVB_S] = "FireDTV S/CI",
124 [FireSAT_DVB_C] = "FireDTV C/CI",
125 [FireSAT_DVB_T] = "FireDTV T/CI",
126 [FireSAT_DVB_S2] = "FireDTV S2 ",
127};
128
159static int firesat_probe(struct device *dev) 129static int firesat_probe(struct device *dev)
160{ 130{
161 struct unit_directory *ud = container_of(dev, struct unit_directory, device); 131 struct unit_directory *ud = container_of(dev, struct unit_directory, device);
@@ -165,6 +135,7 @@ static int firesat_probe(struct device *dev)
165 unsigned char subunitcount = 0xff, subunit; 135 unsigned char subunitcount = 0xff, subunit;
166 struct firesat **firesats = kmalloc(sizeof (void*) * 2,GFP_KERNEL); 136 struct firesat **firesats = kmalloc(sizeof (void*) * 2,GFP_KERNEL);
167 int kv_len; 137 int kv_len;
138 int i;
168 char *kv_buf; 139 char *kv_buf;
169 140
170 if (!firesats) { 141 if (!firesats) {
@@ -207,11 +178,11 @@ static int firesat_probe(struct device *dev)
207 return -ENOMEM; 178 return -ENOMEM;
208 } 179 }
209 180
210 sema_init(&firesat->avc_sem, 1); 181 mutex_init(&firesat->avc_mutex);
211 init_waitqueue_head(&firesat->avc_wait); 182 init_waitqueue_head(&firesat->avc_wait);
212 atomic_set(&firesat->avc_reply_received, 1); 183 atomic_set(&firesat->avc_reply_received, 1);
213 sema_init(&firesat->demux_sem, 1); 184 mutex_init(&firesat->demux_mutex);
214 atomic_set(&firesat->reschedule_remotecontrol, 0); 185 INIT_WORK(&firesat->remote_ctrl_work, avc_remote_ctrl_work);
215 186
216 spin_lock_irqsave(&firesat_list_lock, flags); 187 spin_lock_irqsave(&firesat_list_lock, flags);
217 INIT_LIST_HEAD(&firesat->list); 188 INIT_LIST_HEAD(&firesat->list);
@@ -244,23 +215,13 @@ static int firesat_probe(struct device *dev)
244 while ((kv_buf + kv_len - 1) == '\0') kv_len--; 215 while ((kv_buf + kv_len - 1) == '\0') kv_len--;
245 kv_buf[kv_len++] = '\0'; 216 kv_buf[kv_len++] = '\0';
246 217
247 /* Determining the device model */ 218 for (i = ARRAY_SIZE(firedtv_model_names); --i;)
248 if (strcmp(kv_buf, "FireDTV S/CI") == 0) { 219 if (strcmp(kv_buf, firedtv_model_names[i]) == 0)
249 printk(KERN_INFO "%s: found DVB/S\n", __func__); 220 break;
250 firesat->type = 1; 221 firesat->type = i;
251 } else if (strcmp(kv_buf, "FireDTV C/CI") == 0) {
252 printk(KERN_INFO "%s: found DVB/C\n", __func__);
253 firesat->type = 2;
254 } else if (strcmp(kv_buf, "FireDTV T/CI") == 0) {
255 printk(KERN_INFO "%s: found DVB/T\n", __func__);
256 firesat->type = 3;
257 } else if (strcmp(kv_buf, "FireDTV S2 ") == 0) {
258 printk(KERN_INFO "%s: found DVB/S2\n", __func__);
259 firesat->type = 4;
260 }
261 kfree(kv_buf); 222 kfree(kv_buf);
262 223
263 if (AVCIdentifySubunit(firesat, NULL, (int*)&firesat->type)) { 224 if (AVCIdentifySubunit(firesat)) {
264 printk("%s: cannot identify subunit %d\n", __func__, subunit); 225 printk("%s: cannot identify subunit %d\n", __func__, subunit);
265 spin_lock_irqsave(&firesat_list_lock, flags); 226 spin_lock_irqsave(&firesat_list_lock, flags);
266 list_del(&firesat->list); 227 list_del(&firesat->list);
@@ -270,14 +231,14 @@ static int firesat_probe(struct device *dev)
270 } 231 }
271 232
272// ---- 233// ----
234 /* FIXME: check for error return */
273 firesat_dvbdev_init(firesat, dev, fe); 235 firesat_dvbdev_init(firesat, dev, fe);
274// ---- 236// ----
275 firesats[subunit] = firesat; 237 firesats[subunit] = firesat;
276 } // loop for all tuners 238 } // loop for all tuners
277 239
278 //beta ;-) Disable remote control stuff to avoid crashing 240 if (firesats[0])
279 //if(firesats[0]) 241 AVCRegisterRemoteControl(firesats[0]);
280 // AVCRegisterRemoteControl(firesats[0]);
281 242
282 return 0; 243 return 0;
283} 244}
@@ -306,6 +267,8 @@ static int firesat_remove(struct device *dev)
306 list_del(&firesats[k]->list); 267 list_del(&firesats[k]->list);
307 spin_unlock_irqrestore(&firesat_list_lock, flags); 268 spin_unlock_irqrestore(&firesat_list_lock, flags);
308 269
270 cancel_work_sync(&firesats[k]->remote_ctrl_work);
271
309 kfree(firesats[k]->fe); 272 kfree(firesats[k]->fe);
310 kfree(firesats[k]->adapter); 273 kfree(firesats[k]->adapter);
311 kfree(firesats[k]->respfrm); 274 kfree(firesats[k]->respfrm);
@@ -339,7 +302,7 @@ static int firesat_update(struct unit_directory *ud)
339 302
340static struct hpsb_protocol_driver firesat_driver = { 303static struct hpsb_protocol_driver firesat_driver = {
341 304
342 .name = "FireSAT", 305 .name = "firedtv",
343 .id_table = firesat_id_table, 306 .id_table = firesat_id_table,
344 .update = firesat_update, 307 .update = firesat_update,
345 308
@@ -352,32 +315,41 @@ static struct hpsb_protocol_driver firesat_driver = {
352 }, 315 },
353}; 316};
354 317
318static struct hpsb_highlevel firesat_highlevel = {
319 .name = "firedtv",
320 .fcp_request = fcp_request,
321};
322
355static int __init firesat_init(void) 323static int __init firesat_init(void)
356{ 324{
357 int ret; 325 int ret;
358 326
359 printk(KERN_INFO "FireSAT loaded\n");
360 hpsb_register_highlevel(&firesat_highlevel); 327 hpsb_register_highlevel(&firesat_highlevel);
361 ret = hpsb_register_protocol(&firesat_driver); 328 ret = hpsb_register_protocol(&firesat_driver);
362 if (ret) { 329 if (ret) {
363 printk(KERN_ERR "FireSAT: failed to register protocol\n"); 330 printk(KERN_ERR "firedtv: failed to register protocol\n");
364 hpsb_unregister_highlevel(&firesat_highlevel); 331 goto fail;
365 return ret;
366 } 332 }
367 333
368 //Crash in this function, just disable RC for the time being... 334 ret = firesat_register_rc();
369 //Don't forget to uncomment in firesat_exit and firesat_probe when you enable this. 335 if (ret) {
370 /*if((ret=firesat_register_rc())) 336 printk(KERN_ERR "firedtv: failed to register input device\n");
371 printk("%s: firesat_register_rc return error code %d (ignored)\n", __func__, ret);*/ 337 goto fail_rc;
338 }
372 339
373 return 0; 340 return 0;
341fail_rc:
342 hpsb_unregister_protocol(&firesat_driver);
343fail:
344 hpsb_unregister_highlevel(&firesat_highlevel);
345 return ret;
374} 346}
375 347
376static void __exit firesat_exit(void) 348static void __exit firesat_exit(void)
377{ 349{
350 firesat_unregister_rc();
378 hpsb_unregister_protocol(&firesat_driver); 351 hpsb_unregister_protocol(&firesat_driver);
379 hpsb_unregister_highlevel(&firesat_highlevel); 352 hpsb_unregister_highlevel(&firesat_highlevel);
380 printk(KERN_INFO "FireSAT quit\n");
381} 353}
382 354
383module_init(firesat_init); 355module_init(firesat_init);
@@ -385,6 +357,6 @@ module_exit(firesat_exit);
385 357
386MODULE_AUTHOR("Andreas Monitzer <andy@monitzer.com>"); 358MODULE_AUTHOR("Andreas Monitzer <andy@monitzer.com>");
387MODULE_AUTHOR("Ben Backx <ben@bbackx.com>"); 359MODULE_AUTHOR("Ben Backx <ben@bbackx.com>");
388MODULE_DESCRIPTION("FireSAT DVB Driver"); 360MODULE_DESCRIPTION("FireDTV DVB Driver");
389MODULE_LICENSE("GPL"); 361MODULE_LICENSE("GPL");
390MODULE_SUPPORTED_DEVICE("FireSAT DVB"); 362MODULE_SUPPORTED_DEVICE("FireDTV DVB");
diff --git a/drivers/media/dvb/firesat/firesat_dvb.c b/drivers/media/dvb/firesat/firesat_dvb.c
index 9e87402289a6..e944cee19f0a 100644
--- a/drivers/media/dvb/firesat/firesat_dvb.c
+++ b/drivers/media/dvb/firesat/firesat_dvb.c
@@ -1,8 +1,8 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) ? 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 5 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
6 * 6 *
7 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as 8 * modify it under the terms of the GNU General Public License as
@@ -10,64 +10,52 @@
10 * the License, or (at your option) any later version. 10 * the License, or (at your option) any later version.
11 */ 11 */
12 12
13#include <linux/init.h>
14#include <linux/slab.h>
15#include <linux/wait.h>
16#include <linux/module.h>
17#include <linux/delay.h>
18#include <linux/time.h>
19#include <linux/errno.h> 13#include <linux/errno.h>
20#include <linux/interrupt.h> 14#include <linux/kernel.h>
21#include <ieee1394_hotplug.h> 15#include <linux/mutex.h>
22#include <nodemgr.h> 16#include <linux/types.h>
23#include <highlevel.h> 17
24#include <ohci1394.h> 18#include <dvb_demux.h>
25#include <hosts.h> 19#include <dvb_frontend.h>
26#include <dvbdev.h> 20#include <dvbdev.h>
27 21
28#include "firesat.h"
29#include "avc_api.h" 22#include "avc_api.h"
30#include "cmp.h" 23#include "firesat.h"
31#include "firesat-rc.h"
32#include "firesat-ci.h" 24#include "firesat-ci.h"
33 25
34DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 26DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
35 27
36static struct firesat_channel *firesat_channel_allocate(struct firesat *firesat) 28static struct firesat_channel *firesat_channel_allocate(struct firesat *firesat)
37{ 29{
30 struct firesat_channel *c = NULL;
38 int k; 31 int k;
39 32
40 //printk(KERN_INFO "%s\n", __func__); 33 if (mutex_lock_interruptible(&firesat->demux_mutex))
41
42 if (down_interruptible(&firesat->demux_sem))
43 return NULL; 34 return NULL;
44 35
45 for (k = 0; k < 16; k++) { 36 for (k = 0; k < 16; k++)
46 //printk(KERN_INFO "%s: channel %d: active = %d, pid = 0x%x\n",__func__,k,firesat->channel[k].active,firesat->channel[k].pid);
47
48 if (firesat->channel[k].active == 0) { 37 if (firesat->channel[k].active == 0) {
49 firesat->channel[k].active = 1; 38 firesat->channel[k].active = 1;
50 up(&firesat->demux_sem); 39 c = &firesat->channel[k];
51 return &firesat->channel[k]; 40 break;
52 } 41 }
53 }
54 42
55 up(&firesat->demux_sem); 43 mutex_unlock(&firesat->demux_mutex);
56 return NULL; // no more channels available 44 return c;
57} 45}
58 46
59static int firesat_channel_collect(struct firesat *firesat, int *pidc, u16 pid[]) 47static int firesat_channel_collect(struct firesat *firesat, int *pidc, u16 pid[])
60{ 48{
61 int k, l = 0; 49 int k, l = 0;
62 50
63 if (down_interruptible(&firesat->demux_sem)) 51 if (mutex_lock_interruptible(&firesat->demux_mutex))
64 return -EINTR; 52 return -EINTR;
65 53
66 for (k = 0; k < 16; k++) 54 for (k = 0; k < 16; k++)
67 if (firesat->channel[k].active == 1) 55 if (firesat->channel[k].active == 1)
68 pid[l++] = firesat->channel[k].pid; 56 pid[l++] = firesat->channel[k].pid;
69 57
70 up(&firesat->demux_sem); 58 mutex_unlock(&firesat->demux_mutex);
71 59
72 *pidc = l; 60 *pidc = l;
73 61
@@ -77,12 +65,12 @@ static int firesat_channel_collect(struct firesat *firesat, int *pidc, u16 pid[]
77static int firesat_channel_release(struct firesat *firesat, 65static int firesat_channel_release(struct firesat *firesat,
78 struct firesat_channel *channel) 66 struct firesat_channel *channel)
79{ 67{
80 if (down_interruptible(&firesat->demux_sem)) 68 if (mutex_lock_interruptible(&firesat->demux_mutex))
81 return -EINTR; 69 return -EINTR;
82 70
83 channel->active = 0; 71 channel->active = 0;
84 72
85 up(&firesat->demux_sem); 73 mutex_unlock(&firesat->demux_mutex);
86 return 0; 74 return 0;
87} 75}
88 76
@@ -172,7 +160,8 @@ int firesat_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
172{ 160{
173 struct dvb_demux *demux = dvbdmxfeed->demux; 161 struct dvb_demux *demux = dvbdmxfeed->demux;
174 struct firesat *firesat = (struct firesat*)demux->priv; 162 struct firesat *firesat = (struct firesat*)demux->priv;
175 int k, l = 0; 163 struct firesat_channel *c = dvbdmxfeed->priv;
164 int k, l;
176 u16 pids[16]; 165 u16 pids[16];
177 166
178 //printk(KERN_INFO "%s (pid %u)\n", __func__, dvbdmxfeed->pid); 167 //printk(KERN_INFO "%s (pid %u)\n", __func__, dvbdmxfeed->pid);
@@ -197,30 +186,24 @@ int firesat_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
197 return 0; 186 return 0;
198 } 187 }
199 188
200 if (down_interruptible(&firesat->demux_sem)) 189 if (mutex_lock_interruptible(&firesat->demux_mutex))
201 return -EINTR; 190 return -EINTR;
202 191
203 192 /* list except channel to be removed */
204 // list except channel to be removed 193 for (k = 0, l = 0; k < 16; k++)
205 for (k = 0; k < 16; k++)
206 if (firesat->channel[k].active == 1) { 194 if (firesat->channel[k].active == 1) {
207 if (&firesat->channel[k] != 195 if (&firesat->channel[k] != c)
208 (struct firesat_channel *)dvbdmxfeed->priv)
209 pids[l++] = firesat->channel[k].pid; 196 pids[l++] = firesat->channel[k].pid;
210 else 197 else
211 firesat->channel[k].active = 0; 198 firesat->channel[k].active = 0;
212 } 199 }
213 200
214 if ((k = AVCTuner_SetPIDs(firesat, l, pids))) { 201 k = AVCTuner_SetPIDs(firesat, l, pids);
215 up(&firesat->demux_sem); 202 if (!k)
216 return k; 203 c->active = 0;
217 }
218 204
219 ((struct firesat_channel *)dvbdmxfeed->priv)->active = 0; 205 mutex_unlock(&firesat->demux_mutex);
220 206 return k;
221 up(&firesat->demux_sem);
222
223 return 0;
224} 207}
225 208
226int firesat_dvbdev_init(struct firesat *firesat, 209int firesat_dvbdev_init(struct firesat *firesat,
@@ -229,60 +212,20 @@ int firesat_dvbdev_init(struct firesat *firesat,
229{ 212{
230 int result; 213 int result;
231 214
232#if 0 215 firesat->adapter = kmalloc(sizeof(*firesat->adapter), GFP_KERNEL);
233 switch (firesat->type) { 216 if (!firesat->adapter) {
234 case FireSAT_DVB_S: 217 printk(KERN_ERR "firedtv: couldn't allocate memory\n");
235 firesat->model_name = "FireSAT DVB-S"; 218 return -ENOMEM;
236 firesat->frontend_info = &firesat_S_frontend_info; 219 }
237 break;
238 case FireSAT_DVB_C:
239 firesat->model_name = "FireSAT DVB-C";
240 firesat->frontend_info = &firesat_C_frontend_info;
241 break;
242 case FireSAT_DVB_T:
243 firesat->model_name = "FireSAT DVB-T";
244 firesat->frontend_info = &firesat_T_frontend_info;
245 break;
246 default:
247 printk("%s: unknown model type 0x%x on subunit %d!\n",
248 __func__, firesat->type,subunit);
249 firesat->model_name = "Unknown";
250 firesat->frontend_info = NULL;
251 }
252#endif
253/* // ------- CRAP -----------
254 if (!firesat->frontend_info) {
255 spin_lock_irqsave(&firesat_list_lock, flags);
256 list_del(&firesat->list);
257 spin_unlock_irqrestore(&firesat_list_lock, flags);
258 kfree(firesat);
259 continue;
260 }
261*/
262 //initialising firesat->adapter before calling dvb_register_adapter
263 if (!(firesat->adapter = kmalloc(sizeof (struct dvb_adapter), GFP_KERNEL))) {
264 printk("%s: couldn't allocate memory.\n", __func__);
265 kfree(firesat->adapter);
266 kfree(firesat);
267 return -ENOMEM;
268 }
269
270 if ((result = DVB_REGISTER_ADAPTER(firesat->adapter,
271 firesat->model_name,
272 THIS_MODULE,
273 dev, adapter_nr)) < 0) {
274
275 printk("%s: dvb_register_adapter failed: error %d\n", __func__, result);
276#if 0
277 /* ### cleanup */
278 spin_lock_irqsave(&firesat_list_lock, flags);
279 list_del(&firesat->list);
280 spin_unlock_irqrestore(&firesat_list_lock, flags);
281#endif
282 kfree(firesat);
283 220
284 return result; 221 result = DVB_REGISTER_ADAPTER(firesat->adapter,
285 } 222 firedtv_model_names[firesat->type],
223 THIS_MODULE, dev, adapter_nr);
224 if (result < 0) {
225 printk(KERN_ERR "firedtv: dvb_register_adapter failed\n");
226 kfree(firesat->adapter);
227 return result;
228 }
286 229
287 memset(&firesat->demux, 0, sizeof(struct dvb_demux)); 230 memset(&firesat->demux, 0, sizeof(struct dvb_demux));
288 firesat->demux.dmx.capabilities = 0/*DMX_TS_FILTERING | DMX_SECTION_FILTERING*/; 231 firesat->demux.dmx.capabilities = 0/*DMX_TS_FILTERING | DMX_SECTION_FILTERING*/;
diff --git a/drivers/media/dvb/firesat/firesat_fe.c b/drivers/media/dvb/firesat/firesat_fe.c
index 1c86c3e61373..ec614ea8de22 100644
--- a/drivers/media/dvb/firesat/firesat_fe.c
+++ b/drivers/media/dvb/firesat/firesat_fe.c
@@ -1,8 +1,8 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireDTV driver (formerly known as FireSAT)
3 * 3 *
4 * Copyright (c) ? 4 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
5 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 5 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
6 * 6 *
7 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as 8 * modify it under the terms of the GNU General Public License as
@@ -10,26 +10,15 @@
10 * the License, or (at your option) any later version. 10 * the License, or (at your option) any later version.
11 */ 11 */
12 12
13#include <linux/init.h>
14#include <linux/slab.h>
15#include <linux/wait.h>
16#include <linux/module.h>
17#include <linux/delay.h>
18#include <linux/time.h>
19#include <linux/errno.h> 13#include <linux/errno.h>
20#include <linux/interrupt.h> 14#include <linux/kernel.h>
21#include <ieee1394_hotplug.h> 15#include <linux/types.h>
22#include <nodemgr.h> 16
23#include <highlevel.h> 17#include <dvb_frontend.h>
24#include <ohci1394.h>
25#include <hosts.h>
26#include <dvbdev.h>
27 18
28#include "firesat.h"
29#include "avc_api.h" 19#include "avc_api.h"
30#include "cmp.h" 20#include "cmp.h"
31#include "firesat-rc.h" 21#include "firesat.h"
32#include "firesat-ci.h"
33 22
34static int firesat_dvb_init(struct dvb_frontend *fe) 23static int firesat_dvb_init(struct dvb_frontend *fe)
35{ 24{
@@ -209,21 +198,17 @@ int firesat_frontend_attach(struct firesat *firesat, struct dvb_frontend *fe)
209{ 198{
210 switch (firesat->type) { 199 switch (firesat->type) {
211 case FireSAT_DVB_S: 200 case FireSAT_DVB_S:
212 firesat->model_name = "FireSAT DVB-S";
213 firesat->frontend_info = &firesat_S_frontend_info; 201 firesat->frontend_info = &firesat_S_frontend_info;
214 break; 202 break;
215 case FireSAT_DVB_C: 203 case FireSAT_DVB_C:
216 firesat->model_name = "FireSAT DVB-C";
217 firesat->frontend_info = &firesat_C_frontend_info; 204 firesat->frontend_info = &firesat_C_frontend_info;
218 break; 205 break;
219 case FireSAT_DVB_T: 206 case FireSAT_DVB_T:
220 firesat->model_name = "FireSAT DVB-T";
221 firesat->frontend_info = &firesat_T_frontend_info; 207 firesat->frontend_info = &firesat_T_frontend_info;
222 break; 208 break;
223 default: 209 default:
224 printk("%s: unknown model type 0x%x !\n", 210 printk(KERN_ERR "firedtv: no frontend for model type 0x%x\n",
225 __func__, firesat->type); 211 firesat->type);
226 firesat->model_name = "Unknown";
227 firesat->frontend_info = NULL; 212 firesat->frontend_info = NULL;
228 } 213 }
229 fe->ops = firesat_ops; 214 fe->ops = firesat_ops;
@@ -235,7 +220,7 @@ int firesat_frontend_attach(struct firesat *firesat, struct dvb_frontend *fe)
235 220
236static struct dvb_frontend_info firesat_S_frontend_info = { 221static struct dvb_frontend_info firesat_S_frontend_info = {
237 222
238 .name = "FireSAT DVB-S Frontend", 223 .name = "FireDTV DVB-S Frontend",
239 .type = FE_QPSK, 224 .type = FE_QPSK,
240 225
241 .frequency_min = 950000, 226 .frequency_min = 950000,
@@ -256,7 +241,7 @@ static struct dvb_frontend_info firesat_S_frontend_info = {
256 241
257static struct dvb_frontend_info firesat_C_frontend_info = { 242static struct dvb_frontend_info firesat_C_frontend_info = {
258 243
259 .name = "FireSAT DVB-C Frontend", 244 .name = "FireDTV DVB-C Frontend",
260 .type = FE_QAM, 245 .type = FE_QAM,
261 246
262 .frequency_min = 47000000, 247 .frequency_min = 47000000,
@@ -276,7 +261,7 @@ static struct dvb_frontend_info firesat_C_frontend_info = {
276 261
277static struct dvb_frontend_info firesat_T_frontend_info = { 262static struct dvb_frontend_info firesat_T_frontend_info = {
278 263
279 .name = "FireSAT DVB-T Frontend", 264 .name = "FireDTV DVB-T Frontend",
280 .type = FE_OFDM, 265 .type = FE_OFDM,
281 266
282 .frequency_min = 49000000, 267 .frequency_min = 49000000,
diff --git a/drivers/media/dvb/firesat/firesat_iso.c b/drivers/media/dvb/firesat/firesat_iso.c
index 15e23cf7d503..bc94afe57f63 100644
--- a/drivers/media/dvb/firesat/firesat_iso.c
+++ b/drivers/media/dvb/firesat/firesat_iso.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * FireSAT DVB driver 2 * FireSAT DVB driver
3 * 3 *
4 * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se> 4 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
5 * 5 *
6 * This program is free software; you can redistribute it and/or 6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as 7 * modify it under the terms of the GNU General Public License as
@@ -9,6 +9,16 @@
9 * the License, or (at your option) any later version. 9 * the License, or (at your option) any later version.
10 */ 10 */
11 11
12#include <linux/errno.h>
13#include <linux/kernel.h>
14#include <linux/list.h>
15#include <linux/spinlock.h>
16
17#include <dvb_demux.h>
18
19#include <dma.h>
20#include <iso.h>
21
12#include "firesat.h" 22#include "firesat.h"
13 23
14static void rawiso_activity_cb(struct hpsb_iso *iso); 24static void rawiso_activity_cb(struct hpsb_iso *iso);