summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 @@
#include <asm/types.h>
+struct file;
struct pci_dev;
struct scatterlist;
struct 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);
EXPORT_SYMBOL(hpsb_make_phypacket);
EXPORT_SYMBOL(hpsb_read);
EXPORT_SYMBOL(hpsb_write);
+EXPORT_SYMBOL(hpsb_lock);
EXPORT_SYMBOL(hpsb_packet_success);
/** 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,
return retval;
}
+
+int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+ u64 addr, int extcode, quadlet_t *data, quadlet_t arg)
+{
+ struct hpsb_packet *packet;
+ int retval = 0;
+
+ BUG_ON(in_interrupt());
+
+ packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
+ if (!packet)
+ return -ENOMEM;
+
+ packet->generation = generation;
+ retval = hpsb_send_packet_and_wait(packet);
+ if (retval < 0)
+ goto hpsb_lock_fail;
+
+ retval = hpsb_packet_success(packet);
+
+ if (retval == 0)
+ *data = packet->data[0];
+
+hpsb_lock_fail:
+ hpsb_free_tlabel(packet);
+ hpsb_free_packet(packet);
+
+ return retval;
+}
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,
u64 addr, quadlet_t *buffer, size_t length);
int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
u64 addr, quadlet_t *buffer, size_t length);
+int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+ u64 addr, int extcode, quadlet_t *data, quadlet_t arg);
#ifdef HPSB_DEBUG_TLABELS
extern 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 @@
#define IEEE1394_ISO_H
#include <linux/spinlock_types.h>
+#include <linux/wait.h>
#include <asm/atomic.h>
#include <asm/types.h>
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 @@
obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/
-obj-$(CONFIG_DVB_FIRESAT) += firesat/
+obj-$(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 @@
-config DVB_FIRESAT
- tristate "FireSAT devices"
+config DVB_FIREDTV
+ tristate "FireDTV (FireWire attached DVB receivers)"
depends on DVB_CORE && IEEE1394 && INPUT
help
- Support for external IEEE1394 adapters designed by Digital Everywhere and
- produced by El Gato, shipped under the brand name 'FireDTV/FloppyDTV'.
+ Support for DVB receivers from Digital Everywhere, known as FireDTV
+ and FloppyDTV, which are connected via IEEE 1394 (FireWire).
- These devices don't have a MPEG decoder built in, so you need
+ These devices don't have an MPEG decoder built in, so you need
an external software decoder to watch TV.
- Say Y if you own such a device and want to use it.
+ To compile this driver as a module, say M here: the module will be
+ 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 @@
-firesat-objs := firesat_1394.o \
+firedtv-objs := firesat_1394.o \
firesat_dvb.o \
firesat_fe.o \
firesat_iso.o \
@@ -7,7 +7,7 @@ firesat-objs := firesat_1394.o \
firesat-rc.o \
firesat-ci.o
-obj-$(CONFIG_DVB_FIRESAT) += firesat.o
+obj-$(CONFIG_DVB_FIREDTV) += firedtv.o
EXTRA_CFLAGS := -Idrivers/ieee1394
EXTRA_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 @@
/*
- * FireSAT AVC driver
+ * FireDTV driver (formerly known as FireSAT)
*
- * Copyright (c) 2004 Andreas Monitzer <andy@monitzer.com>
- * Copyright (c) 2008 Ben Backx <ben@bbackx.com>
- * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se>
+ * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+ * Copyright (C) 2008 Ben Backx <ben@bbackx.com>
+ * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -11,13 +11,20 @@
* the License, or (at your option) any later version.
*/
-#include "firesat.h"
+#include <linux/crc32.h>
+#include <linux/delay.h>
+#include <linux/kernel.h>
+#include <linux/moduleparam.h>
+#include <linux/mutex.h>
+#include <linux/wait.h>
+#include <linux/workqueue.h>
+#include <asm/atomic.h>
+
#include <ieee1394_transactions.h>
#include <nodemgr.h>
-#include <asm/byteorder.h>
-#include <linux/delay.h>
-#include <linux/crc32.h>
+
#include "avc_api.h"
+#include "firesat.h"
#include "firesat-rc.h"
#define RESPONSE_REGISTER 0xFFFFF0000D00ULL
@@ -28,8 +35,6 @@ static unsigned int avc_comm_debug = 0;
module_param(avc_comm_debug, int, 0644);
MODULE_PARM_DESC(avc_comm_debug, "debug logging level [0..2] of AV/C communication, default is 0 (no)");
-static int __AVCRegisterRemoteControl(struct firesat*firesat, int internal);
-
/* Frees an allocated packet */
static void avc_free_packet(struct hpsb_packet *packet)
{
@@ -232,67 +237,39 @@ static int __AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm,
return 0;
}
-int AVCWrite(struct firesat*firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm) {
+int AVCWrite(struct firesat*firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm)
+{
int ret;
- if(down_interruptible(&firesat->avc_sem))
+
+ if (mutex_lock_interruptible(&firesat->avc_mutex))
return -EINTR;
ret = __AVCWrite(firesat, CmdFrm, RspFrm);
- up(&firesat->avc_sem);
+ mutex_unlock(&firesat->avc_mutex);
return ret;
}
-static void do_schedule_remotecontrol(unsigned long ignored);
-DECLARE_TASKLET(schedule_remotecontrol, do_schedule_remotecontrol, 0);
-
-static void do_schedule_remotecontrol(unsigned long ignored) {
- struct firesat *firesat;
- unsigned long flags;
-
- spin_lock_irqsave(&firesat_list_lock, flags);
- list_for_each_entry(firesat,&firesat_list,list) {
- if(atomic_read(&firesat->reschedule_remotecontrol) == 1) {
- if(down_trylock(&firesat->avc_sem))
- tasklet_schedule(&schedule_remotecontrol);
- else {
- if(__AVCRegisterRemoteControl(firesat, 1) == 0)
- atomic_set(&firesat->reschedule_remotecontrol, 0);
- else
- tasklet_schedule(&schedule_remotecontrol);
-
- up(&firesat->avc_sem);
- }
+int AVCRecv(struct firesat *firesat, u8 *data, size_t length)
+{
+ AVCRspFrm *RspFrm = (AVCRspFrm *)data;
+
+ if (length >= 8 &&
+ RspFrm->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
+ RspFrm->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
+ RspFrm->operand[2] == SFE_VENDOR_DE_COMPANYID_2 &&
+ RspFrm->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
+ if (RspFrm->resp == CHANGED) {
+ firesat_handle_rc(RspFrm->operand[4] << 8 |
+ RspFrm->operand[5]);
+ schedule_work(&firesat->remote_ctrl_work);
+ } else if (RspFrm->resp != INTERIM) {
+ printk(KERN_INFO "firedtv: remote control result = "
+ "%d\n", RspFrm->resp);
}
- }
- spin_unlock_irqrestore(&firesat_list_lock, flags);
-}
-
-int AVCRecv(struct firesat *firesat, u8 *data, size_t length) {
-// printk(KERN_INFO "%s\n",__func__);
-
- // remote control handling
-
-#if 0
- AVCRspFrm *RspFrm = (AVCRspFrm*)data;
-
- if(/*RspFrm->length >= 8 && ###*/
- ((RspFrm->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
- RspFrm->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
- RspFrm->operand[2] == SFE_VENDOR_DE_COMPANYID_2)) &&
- RspFrm->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
- if(RspFrm->resp == CHANGED) {
-// printk(KERN_INFO "%s: code = %02x %02x\n",__func__,RspFrm->operand[4],RspFrm->operand[5]);
- firesat_got_remotecontrolcode((((u16)RspFrm->operand[4]) << 8) | ((u16)RspFrm->operand[5]));
-
- // schedule
- atomic_set(&firesat->reschedule_remotecontrol, 1);
- tasklet_schedule(&schedule_remotecontrol);
- } else if(RspFrm->resp != INTERIM)
- printk(KERN_INFO "%s: remote control result = %d\n",__func__, RspFrm->resp);
return 0;
}
-#endif
+
if(atomic_read(&firesat->avc_reply_received) == 1) {
printk(KERN_ERR "%s: received out-of-order AVC response, "
"ignored\n",__func__);
@@ -718,7 +695,8 @@ int AVCTuner_GetTS(struct firesat *firesat){
return 0;
}
-int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *transport) {
+int AVCIdentifySubunit(struct firesat *firesat)
+{
AVCCmdFrm CmdFrm;
AVCRspFrm RspFrm;
@@ -752,8 +730,6 @@ int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *tr
printk(KERN_ERR "%s: Invalid response length\n", __func__);
return -EINVAL;
}
- if(systemId)
- *systemId = RspFrm.operand[7];
return 0;
}
@@ -901,7 +877,7 @@ int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount)
return 0;
}
-static int __AVCRegisterRemoteControl(struct firesat*firesat, int internal)
+int AVCRegisterRemoteControl(struct firesat *firesat)
{
AVCCmdFrm CmdFrm;
@@ -922,19 +898,16 @@ static int __AVCRegisterRemoteControl(struct firesat*firesat, int internal)
CmdFrm.length = 8;
- if(internal) {
- if(__AVCWrite(firesat,&CmdFrm,NULL) < 0)
- return -EIO;
- } else
- if(AVCWrite(firesat,&CmdFrm,NULL) < 0)
- return -EIO;
-
- return 0;
+ return AVCWrite(firesat, &CmdFrm, NULL);
}
-int AVCRegisterRemoteControl(struct firesat*firesat)
+void avc_remote_ctrl_work(struct work_struct *work)
{
- return __AVCRegisterRemoteControl(firesat, 0);
+ struct firesat *firesat =
+ container_of(work, struct firesat, remote_ctrl_work);
+
+ /* Should it be rescheduled in failure cases? */
+ AVCRegisterRemoteControl(firesat);
}
int 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 @@
-/***************************************************************************
- avc_api.h - description
- -------------------
- begin : Wed May 1 2000
- copyright : (C) 2000 by Manfred Weihs
- copyright : (C) 2003 by Philipp Gutgsell
- copyright : (C) 2008 by Henrik Kurelid (henrik@kurelid.se)
- email : 0014guph@edu.fh-kaernten.ac.at
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
/*
- This is based on code written by Peter Halwachs,
- Thomas Groiss and Andreas Monitzer.
-*/
-
-
-#ifndef __AVC_API_H__
-#define __AVC_API_H__
-
-#include <linux/dvb/frontend.h>
+ * AV/C API
+ *
+ * Copyright (C) 2000 Manfred Weihs
+ * Copyright (C) 2003 Philipp Gutgsell <0014guph@edu.fh-kaernten.ac.at>
+ * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+ * Copyright (C) 2008 Ben Backx <ben@bbackx.com>
+ * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+ *
+ * This is based on code written by Peter Halwachs, Thomas Groiss and
+ * Andreas Monitzer.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _AVC_API_H
+#define _AVC_API_H
+
+#include <linux/types.h>
/*************************************************************
Constants from EN510221
@@ -416,34 +409,38 @@ typedef struct
#define LNBCONTROL_DONTCARE 0xff
-
-extern int AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm, AVCRspFrm *RspFrm);
-extern int AVCRecv(struct firesat *firesat, u8 *data, size_t length);
-
-extern int AVCTuner_DSIT(struct firesat *firesat,
- int Source_Plug,
- struct dvb_frontend_parameters *params,
- __u8 *status);
-
-extern int AVCTunerStatus(struct firesat *firesat, ANTENNA_INPUT_INFO *antenna_input_info);
-extern int AVCTuner_DSD(struct firesat *firesat, struct dvb_frontend_parameters *params, __u8 *status);
-extern int AVCTuner_SetPIDs(struct firesat *firesat, unsigned char pidc, u16 pid[]);
-extern int AVCTuner_GetTS(struct firesat *firesat);
-
-extern int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *transport);
-extern int AVCLNBControl(struct firesat *firesat, char voltage, char burst, char conttone, char nrdiseq, struct dvb_diseqc_master_cmd *diseqcmd);
-extern int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount);
-extern int AVCRegisterRemoteControl(struct firesat *firesat);
-extern int AVCTuner_Host2Ca(struct firesat *firesat);
-extern int avc_ca_app_info(struct firesat *firesat, char *app_info,
- int *length);
-extern int avc_ca_info(struct firesat *firesat, char *app_info, int *length);
-extern int avc_ca_reset(struct firesat *firesat);
-extern int avc_ca_pmt(struct firesat *firesat, char *app_info, int length);
-extern int avc_ca_get_time_date(struct firesat *firesat, int *interval);
-extern int avc_ca_enter_menu(struct firesat *firesat);
-extern int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object,
- int *length);
-
-#endif
-
+struct dvb_diseqc_master_cmd;
+struct dvb_frontend_parameters;
+struct firesat;
+
+int AVCWrite(struct firesat *firesat, const AVCCmdFrm *CmdFrm,
+ AVCRspFrm *RspFrm);
+int AVCRecv(struct firesat *firesat, u8 *data, size_t length);
+
+int AVCTuner_DSIT(struct firesat *firesat, int Source_Plug,
+ struct dvb_frontend_parameters *params, __u8 *status);
+
+int AVCTunerStatus(struct firesat *firesat,
+ ANTENNA_INPUT_INFO *antenna_input_info);
+int AVCTuner_DSD(struct firesat *firesat,
+ struct dvb_frontend_parameters *params, __u8 *status);
+int AVCTuner_SetPIDs(struct firesat *firesat, unsigned char pidc, u16 pid[]);
+int AVCTuner_GetTS(struct firesat *firesat);
+
+int AVCIdentifySubunit(struct firesat *firesat);
+int AVCLNBControl(struct firesat *firesat, char voltage, char burst,
+ char conttone, char nrdiseq,
+ struct dvb_diseqc_master_cmd *diseqcmd);
+int AVCSubUnitInfo(struct firesat *firesat, char *subunitcount);
+void avc_remote_ctrl_work(struct work_struct *work);
+int AVCRegisterRemoteControl(struct firesat *firesat);
+int AVCTuner_Host2Ca(struct firesat *firesat);
+int avc_ca_app_info(struct firesat *firesat, char *app_info, int *length);
+int avc_ca_info(struct firesat *firesat, char *app_info, int *length);
+int avc_ca_reset(struct firesat *firesat);
+int avc_ca_pmt(struct firesat *firesat, char *app_info, int length);
+int avc_ca_get_time_date(struct firesat *firesat, int *interval);
+int avc_ca_enter_menu(struct firesat *firesat);
+int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, int *length);
+
+#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 @@
/*
- * FireSAT DVB driver
+ * FireDTV driver (formerly known as FireSAT)
*
- * Copyright (c) ?
- * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se>
+ * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+ * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -10,15 +10,19 @@
* the License, or (at your option) any later version.
*/
-#include "cmp.h"
-#include <ieee1394.h>
-#include <nodemgr.h>
-#include <highlevel.h>
-#include <ohci1394.h>
+#include <linux/kernel.h>
+#include <linux/mutex.h>
+#include <linux/types.h>
+
#include <hosts.h>
+#include <ieee1394.h>
#include <ieee1394_core.h>
#include <ieee1394_transactions.h>
+#include <nodemgr.h>
+
#include "avc_api.h"
+#include "cmp.h"
+#include "firesat.h"
typedef struct _OPCR
{
@@ -38,63 +42,33 @@ typedef struct _OPCR
#define FIRESAT_SPEED IEEE1394_SPEED_400
-/* hpsb_lock is being removed from the kernel-source,
- * therefor we define our own 'firesat_hpsb_lock'*/
-
-int send_packet_and_wait(struct hpsb_packet *packet);
-
-int firesat_hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
- u64 addr, int extcode, quadlet_t * data, quadlet_t arg) {
-
- struct hpsb_packet *packet;
- int retval = 0;
-
- BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
-
- packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
- if (!packet)
- return -ENOMEM;
-
- packet->generation = generation;
- retval = send_packet_and_wait(packet);
- if (retval < 0)
- goto hpsb_lock_fail;
-
- retval = hpsb_packet_success(packet);
-
- if (retval == 0) {
- *data = packet->data[0];
- }
-
- hpsb_lock_fail:
- hpsb_free_tlabel(packet);
- hpsb_free_packet(packet);
-
- return retval;
-}
-
-
-static int cmp_read(struct firesat *firesat, void *buffer, u64 addr, size_t length) {
+static int cmp_read(struct firesat *firesat, void *buf, u64 addr, size_t len)
+{
int ret;
- if(down_interruptible(&firesat->avc_sem))
+
+ if (mutex_lock_interruptible(&firesat->avc_mutex))
return -EINTR;
- ret = hpsb_read(firesat->host, firesat->nodeentry->nodeid, firesat->nodeentry->generation,
- addr, buffer, length);
+ ret = hpsb_read(firesat->host, firesat->nodeentry->nodeid,
+ firesat->nodeentry->generation, addr, buf, len);
- up(&firesat->avc_sem);
+ mutex_unlock(&firesat->avc_mutex);
return ret;
}
-static int cmp_lock(struct firesat *firesat, quadlet_t *data, u64 addr, quadlet_t arg, int ext_tcode) {
+static int cmp_lock(struct firesat *firesat, quadlet_t *data, u64 addr,
+ quadlet_t arg, int ext_tcode)
+{
int ret;
- if(down_interruptible(&firesat->avc_sem))
+
+ if (mutex_lock_interruptible(&firesat->avc_mutex))
return -EINTR;
- ret = firesat_hpsb_lock(firesat->host, firesat->nodeentry->nodeid, firesat->nodeentry->generation,
- addr, ext_tcode, data, arg);
+ ret = hpsb_lock(firesat->host, firesat->nodeentry->nodeid,
+ firesat->nodeentry->generation,
+ addr, ext_tcode, data, arg);
- up(&firesat->avc_sem);
+ mutex_unlock(&firesat->avc_mutex);
return ret;
}
@@ -223,20 +197,3 @@ int try_CMPBreakPPconnection(struct firesat *firesat, int output_plug,int iso_ch
}
return 0;
}
-
-static void complete_packet(void *data) {
- complete((struct completion *) data);
-}
-
-int send_packet_and_wait(struct hpsb_packet *packet) {
- struct completion done;
- int retval;
-
- init_completion(&done);
- hpsb_set_packet_complete_task(packet, complete_packet, &done);
- retval = hpsb_send_packet(packet);
- if (retval == 0)
- wait_for_completion(&done);
-
- return retval;
-}
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 @@
-#ifndef __FIRESAT__CMP_H_
-#define __FIRESAT__CMP_H_
+#ifndef _CMP_H
+#define _CMP_H
-#include "firesat.h"
+struct firesat;
-extern int try_CMPEstablishPPconnection(struct firesat *firesat, int output_plug, int iso_channel);
-extern int try_CMPBreakPPconnection(struct firesat *firesat, int output_plug,int iso_channel);
+int try_CMPEstablishPPconnection(struct firesat *firesat, int output_plug,
+ int iso_channel);
+int try_CMPBreakPPconnection(struct firesat *firesat, int output_plug,
+ int iso_channel);
-#endif
+#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 @@
/*
- * FireSAT DVB driver
+ * FireDTV driver (formerly known as FireSAT)
*
- * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se>
+ * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+ * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -9,13 +10,16 @@
* the License, or (at your option) any later version.
*/
-#include "firesat-ci.h"
-#include "firesat.h"
-#include "avc_api.h"
-
#include <linux/dvb/ca.h>
+#include <linux/fs.h>
+#include <linux/module.h>
+
#include <dvbdev.h>
+#include "avc_api.h"
+#include "firesat.h"
+#include "firesat-ci.h"
+
static unsigned int ca_debug = 0;
module_param(ca_debug, int, 0644);
MODULE_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 @@
-#ifndef __FIRESAT_CA_H
-#define __FIRESAT_CA_H
+#ifndef _FIREDTV_CI_H
+#define _FIREDTV_CI_H
-#include "firesat.h"
+struct firesat;
int firesat_ca_init(struct firesat *firesat);
void firesat_ca_release(struct firesat *firesat);
-#endif
+#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 @@
-#include "firesat.h"
-#include "firesat-rc.h"
+/*
+ * FireDTV driver (formerly known as FireSAT)
+ *
+ * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+#include <linux/bitops.h>
#include <linux/input.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+
+#include "firesat-rc.h"
+
+/* fixed table with older keycodes, geared towards MythTV */
+const static u16 oldtable[] = {
+
+ /* code from device: 0x4501...0x451f */
-static u16 firesat_irtable[] = {
KEY_ESC,
KEY_F9,
KEY_1,
@@ -35,50 +52,124 @@ static u16 firesat_irtable[] = {
KEY_RIGHT,
KEY_P,
KEY_M,
+
+ /* code from device: 0x4540...0x4542 */
+
KEY_R,
KEY_V,
KEY_C,
- 0
};
-static struct input_dev firesat_idev;
+/* user-modifiable table for a remote as sold in 2008 */
+static u16 keytable[] = {
+
+ /* code from device: 0x0300...0x031f */
+
+ [0x00] = KEY_POWER,
+ [0x01] = KEY_SLEEP,
+ [0x02] = KEY_STOP,
+ [0x03] = KEY_OK,
+ [0x04] = KEY_RIGHT,
+ [0x05] = KEY_1,
+ [0x06] = KEY_2,
+ [0x07] = KEY_3,
+ [0x08] = KEY_LEFT,
+ [0x09] = KEY_4,
+ [0x0a] = KEY_5,
+ [0x0b] = KEY_6,
+ [0x0c] = KEY_UP,
+ [0x0d] = KEY_7,
+ [0x0e] = KEY_8,
+ [0x0f] = KEY_9,
+ [0x10] = KEY_DOWN,
+ [0x11] = KEY_TITLE, /* "OSD" - fixme */
+ [0x12] = KEY_0,
+ [0x13] = KEY_F20, /* "16:9" - fixme */
+ [0x14] = KEY_SCREEN, /* "FULL" - fixme */
+ [0x15] = KEY_MUTE,
+ [0x16] = KEY_SUBTITLE,
+ [0x17] = KEY_RECORD,
+ [0x18] = KEY_TEXT,
+ [0x19] = KEY_AUDIO,
+ [0x1a] = KEY_RED,
+ [0x1b] = KEY_PREVIOUS,
+ [0x1c] = KEY_REWIND,
+ [0x1d] = KEY_PLAYPAUSE,
+ [0x1e] = KEY_NEXT,
+ [0x1f] = KEY_VOLUMEUP,
+
+ /* code from device: 0x0340...0x0354 */
+
+ [0x20] = KEY_CHANNELUP,
+ [0x21] = KEY_F21, /* "4:3" - fixme */
+ [0x22] = KEY_TV,
+ [0x23] = KEY_DVD,
+ [0x24] = KEY_VCR,
+ [0x25] = KEY_AUX,
+ [0x26] = KEY_GREEN,
+ [0x27] = KEY_YELLOW,
+ [0x28] = KEY_BLUE,
+ [0x29] = KEY_CHANNEL, /* "CH.LIST" */
+ [0x2a] = KEY_VENDOR, /* "CI" - fixme */
+ [0x2b] = KEY_VOLUMEDOWN,
+ [0x2c] = KEY_CHANNELDOWN,
+ [0x2d] = KEY_LAST,
+ [0x2e] = KEY_INFO,
+ [0x2f] = KEY_FORWARD,
+ [0x30] = KEY_LIST,
+ [0x31] = KEY_FAVORITES,
+ [0x32] = KEY_MENU,
+ [0x33] = KEY_EPG,
+ [0x34] = KEY_EXIT,
+};
+
+static struct input_dev *idev;
int firesat_register_rc(void)
{
- int index;
+ int i, err;
+
+ idev = input_allocate_device();
+ if (!idev)
+ return -ENOMEM;
- memset(&firesat_idev, 0, sizeof(firesat_idev));
+ idev->name = "FireDTV remote control";
+ idev->evbit[0] = BIT_MASK(EV_KEY);
+ idev->keycode = keytable;
+ idev->keycodesize = sizeof(keytable[0]);
+ idev->keycodemax = ARRAY_SIZE(keytable);
- firesat_idev.evbit[0] = BIT(EV_KEY);
+ for (i = 0; i < ARRAY_SIZE(keytable); i++)
+ set_bit(keytable[i], idev->keybit);
- for (index = 0; firesat_irtable[index] != 0; index++)
- set_bit(firesat_irtable[index], firesat_idev.keybit);
+ err = input_register_device(idev);
+ if (err)
+ input_free_device(idev);
- return input_register_device(&firesat_idev);
+ return err;
}
-int firesat_unregister_rc(void)
+void firesat_unregister_rc(void)
{
- input_unregister_device(&firesat_idev);
- return 0;
+ input_unregister_device(idev);
}
-int firesat_got_remotecontrolcode(u16 code)
+void firesat_handle_rc(unsigned int code)
{
- u16 keycode;
-
- if (code > 0x4500 && code < 0x4520)
- keycode = firesat_irtable[code - 0x4501];
- else if (code > 0x453f && code < 0x4543)
- keycode = firesat_irtable[code - 0x4521];
+ if (code >= 0x0300 && code <= 0x031f)
+ code = keytable[code - 0x0300];
+ else if (code >= 0x0340 && code <= 0x0354)
+ code = keytable[code - 0x0320];
+ else if (code >= 0x4501 && code <= 0x451f)
+ code = oldtable[code - 0x4501];
+ else if (code >= 0x4540 && code <= 0x4542)
+ code = oldtable[code - 0x4521];
else {
- printk(KERN_DEBUG "%s: invalid key code 0x%04x\n", __func__,
- code);
- return -EINVAL;
+ printk(KERN_DEBUG "firedtv: invalid key code 0x%04x "
+ "from remote control\n", code);
+ return;
}
- input_report_key(&firesat_idev, keycode, 1);
- input_report_key(&firesat_idev, keycode, 0);
-
- return 0;
+ input_report_key(idev, code, 1);
+ input_report_key(idev, code, 0);
}
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 @@
-#ifndef __FIRESAT_LIRC_H
-#define __FIRESAT_LIRC_H
+#ifndef _FIREDTV_RC_H
+#define _FIREDTV_RC_H
-extern int firesat_register_rc(void);
-extern int firesat_unregister_rc(void);
-extern int firesat_got_remotecontrolcode(u16 code);
-
-#endif
+int firesat_register_rc(void);
+void firesat_unregister_rc(void);
+void firesat_handle_rc(unsigned int code);
+#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 @@
/*
- * FireSAT DVB driver
+ * FireDTV driver (formerly known as FireSAT)
*
- * Copyright (c) ?
- * Copyright (c) 2008 Henrik Kurelid <henrik@kurelid.se>
+ * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+ * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as