aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/dvb/firesat/firesat-ci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/firesat/firesat-ci.c')
-rw-r--r--drivers/media/dvb/firesat/firesat-ci.c244
1 files changed, 71 insertions, 173 deletions
diff --git a/drivers/media/dvb/firesat/firesat-ci.c b/drivers/media/dvb/firesat/firesat-ci.c
index 3ef25cc4bfd..0deb47eefa1 100644
--- a/drivers/media/dvb/firesat/firesat-ci.c
+++ b/drivers/media/dvb/firesat/firesat-ci.c
@@ -20,29 +20,18 @@
#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)");
-
static int firesat_ca_ready(ANTENNA_INPUT_INFO *info)
{
- if (ca_debug != 0)
- printk("%s: CaMmi=%d, CaInit=%d, CaError=%d, CaDvb=%d, "
- "CaModule=%d, CaAppInfo=%d, CaDateTime=%d, "
- "CaPmt=%d\n", __func__, info->CaMmi,
- info->CaInitializationStatus, info->CaErrorFlag,
- info->CaDvbFlag, info->CaModulePresentStatus,
- info->CaApplicationInfo,
- info->CaDateTimeRequest, info->CaPmtReply);
return info->CaInitializationStatus == 1 &&
- info->CaErrorFlag == 0 &&
- info->CaDvbFlag == 1 &&
- info->CaModulePresentStatus == 1;
+ info->CaErrorFlag == 0 &&
+ info->CaDvbFlag == 1 &&
+ info->CaModulePresentStatus == 1;
}
static int firesat_get_ca_flags(ANTENNA_INPUT_INFO *info)
{
int flags = 0;
+
if (info->CaModulePresentStatus == 1)
flags |= CA_CI_MODULE_PRESENT;
if (info->CaInitializationStatus == 1 &&
@@ -54,103 +43,63 @@ static int firesat_get_ca_flags(ANTENNA_INPUT_INFO *info)
static int firesat_ca_reset(struct firesat *firesat)
{
- if (ca_debug)
- printk(KERN_INFO "%s: ioctl CA_RESET\n", __func__);
- if (avc_ca_reset(firesat))
- return -EFAULT;
- return 0;
+ return avc_ca_reset(firesat) ? -EFAULT : 0;
}
-static int firesat_ca_get_caps(struct firesat *firesat, void *arg)
+static int firesat_ca_get_caps(void *arg)
{
- struct ca_caps *cap_p = (struct ca_caps*)arg;
- int err = 0;
-
- cap_p->slot_num = 1;
- cap_p->slot_type = CA_CI;
- cap_p->descr_num = 1;
- cap_p->descr_type = CA_ECD;
- if (ca_debug)
- printk(KERN_INFO "%s: ioctl CA_GET_CAP\n", __func__);
- return err;
+ struct ca_caps *cap = arg;
+
+ cap->slot_num = 1;
+ cap->slot_type = CA_CI;
+ cap->descr_num = 1;
+ cap->descr_type = CA_ECD;
+ return 0;
}
static int firesat_ca_get_slot_info(struct firesat *firesat, void *arg)
{
ANTENNA_INPUT_INFO info;
- struct ca_slot_info *slot_p = (struct ca_slot_info*)arg;
+ struct ca_slot_info *slot = arg;
- if (ca_debug)
- printk(KERN_INFO "%s: ioctl CA_GET_SLOT_INFO on slot %d.\n",
- __func__, slot_p->num);
- if (AVCTunerStatus(firesat, &info))
+ if (avc_tuner_status(firesat, &info))
return -EFAULT;
- if (slot_p->num == 0) {
- slot_p->type = CA_CI;
- slot_p->flags = firesat_get_ca_flags(&info);
- }
- else {
+ if (slot->num != 0)
return -EFAULT;
- }
+
+ slot->type = CA_CI;
+ slot->flags = firesat_get_ca_flags(&info);
return 0;
}
static int firesat_ca_app_info(struct firesat *firesat, void *arg)
{
- struct ca_msg *reply_p = (struct ca_msg*)arg;
- int i;
+ struct ca_msg *reply = arg;
- if (avc_ca_app_info(firesat, reply_p->msg, &reply_p->length))
- return -EFAULT;
- if (ca_debug) {
- printk(KERN_INFO "%s: Creating TAG_APP_INFO message:",
- __func__);
- for (i = 0; i < reply_p->length; i++)
- printk("0x%02X, ", (unsigned char)reply_p->msg[i]);
- printk("\n");
- }
- return 0;
+ return
+ avc_ca_app_info(firesat, reply->msg, &reply->length) ? -EFAULT : 0;
}
static int firesat_ca_info(struct firesat *firesat, void *arg)
{
- struct ca_msg *reply_p = (struct ca_msg*)arg;
- int i;
+ struct ca_msg *reply = arg;
- if (avc_ca_info(firesat, reply_p->msg, &reply_p->length))
- return -EFAULT;
- if (ca_debug) {
- printk(KERN_INFO "%s: Creating TAG_CA_INFO message:",
- __func__);
- for (i = 0; i < reply_p->length; i++)
- printk("0x%02X, ", (unsigned char)reply_p->msg[i]);
- printk("\n");
- }
- return 0;
+ return avc_ca_info(firesat, reply->msg, &reply->length) ? -EFAULT : 0;
}
static int firesat_ca_get_mmi(struct firesat *firesat, void *arg)
{
- struct ca_msg *reply_p = (struct ca_msg*)arg;
- int i;
+ struct ca_msg *reply = arg;
- if (avc_ca_get_mmi(firesat, reply_p->msg, &reply_p->length))
- return -EFAULT;
- if (ca_debug) {
- printk(KERN_INFO "%s: Creating MMI reply INFO message:",
- __func__);
- for (i = 0; i < reply_p->length; i++)
- printk("0x%02X, ", (unsigned char)reply_p->msg[i]);
- printk("\n");
- }
- return 0;
+ return
+ avc_ca_get_mmi(firesat, reply->msg, &reply->length) ? -EFAULT : 0;
}
static int firesat_ca_get_msg(struct firesat *firesat, void *arg)
{
- int err;
ANTENNA_INPUT_INFO info;
+ int err;
switch (firesat->ca_last_command) {
case TAG_APP_INFO_ENQUIRY:
@@ -160,11 +109,10 @@ static int firesat_ca_get_msg(struct firesat *firesat, void *arg)
err = firesat_ca_info(firesat, arg);
break;
default:
- if (AVCTunerStatus(firesat, &info))
+ if (avc_tuner_status(firesat, &info))
err = -EFAULT;
- else if (info.CaMmi == 1) {
+ else if (info.CaMmi == 1)
err = firesat_ca_get_mmi(firesat, arg);
- }
else {
printk(KERN_INFO "%s: Unhandled message 0x%08X\n",
__func__, firesat->ca_last_command);
@@ -177,51 +125,39 @@ static int firesat_ca_get_msg(struct firesat *firesat, void *arg)
static int firesat_ca_pmt(struct firesat *firesat, void *arg)
{
- struct ca_msg *msg_p = (struct ca_msg*)arg;
+ struct ca_msg *msg = arg;
int data_pos;
- if (msg_p->msg[3] & 0x80)
- data_pos = (msg_p->msg[4] && 0x7F) + 4;
+ if (msg->msg[3] & 0x80)
+ data_pos = (msg->msg[4] && 0x7F) + 4;
else
data_pos = 4;
- if (avc_ca_pmt(firesat, &msg_p->msg[data_pos],
- msg_p->length - data_pos))
- return -EFAULT;
- return 0;
+
+ return avc_ca_pmt(firesat, &msg->msg[data_pos],
+ msg->length - data_pos) ? -EFAULT : 0;
}
static int firesat_ca_send_msg(struct firesat *firesat, void *arg)
{
+ struct ca_msg *msg = arg;
int err;
- struct ca_msg *msg_p = (struct ca_msg*)arg;
- // Do we need a semaphore for this?
+ /* Do we need a semaphore for this? */
firesat->ca_last_command =
- (msg_p->msg[0] << 16) + (msg_p->msg[1] << 8) + msg_p->msg[2];
+ (msg->msg[0] << 16) + (msg->msg[1] << 8) + msg->msg[2];
switch (firesat->ca_last_command) {
case TAG_CA_PMT:
- if (ca_debug != 0)
- printk(KERN_INFO "%s: Message received: TAG_CA_PMT\n",
- __func__);
err = firesat_ca_pmt(firesat, arg);
break;
case TAG_APP_INFO_ENQUIRY:
- // This is all handled in ca_get_msg
- if (ca_debug != 0)
- printk(KERN_INFO "%s: Message received: "
- "TAG_APP_INFO_ENQUIRY\n", __func__);
+ /* handled in ca_get_msg */
err = 0;
break;
case TAG_CA_INFO_ENQUIRY:
- // This is all handled in ca_get_msg
- if (ca_debug != 0)
- printk(KERN_INFO "%s: Message received: "
- "TAG_CA_APP_INFO_ENQUIRY\n", __func__);
+ /* handled in ca_get_msg */
err = 0;
break;
case TAG_ENTER_MENU:
- if (ca_debug != 0)
- printk(KERN_INFO "%s: Entering CA menu.\n", __func__);
err = avc_ca_enter_menu(firesat);
break;
default:
@@ -235,17 +171,17 @@ static int firesat_ca_send_msg(struct firesat *firesat, void *arg)
static int firesat_ca_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *arg)
{
- struct dvb_device* dvbdev = (struct dvb_device*) file->private_data;
+ struct dvb_device *dvbdev = file->private_data;
struct firesat *firesat = dvbdev->priv;
- int err;
ANTENNA_INPUT_INFO info;
+ int err;
switch(cmd) {
case CA_RESET:
err = firesat_ca_reset(firesat);
break;
case CA_GET_CAP:
- err = firesat_ca_get_caps(firesat, arg);
+ err = firesat_ca_get_caps(arg);
break;
case CA_GET_SLOT_INFO:
err = firesat_ca_get_slot_info(firesat, arg);
@@ -262,90 +198,52 @@ static int firesat_ca_ioctl(struct inode *inode, struct file *file,
err = -EOPNOTSUPP;
}
- if (AVCTunerStatus(firesat, &info))
- return err;
-
- firesat_ca_ready(&info);
+ /* FIXME Is this necessary? */
+ avc_tuner_status(firesat, &info);
return err;
}
-static int firesat_get_date_time_request(struct firesat *firesat)
-{
- if (ca_debug)
- printk(KERN_INFO "%s: Retrieving Time/Date request\n",
- __func__);
- if (avc_ca_get_time_date(firesat, &firesat->ca_time_interval))
- return -EFAULT;
- if (ca_debug)
- printk(KERN_INFO "%s: Time/Date interval is %d\n",
- __func__, firesat->ca_time_interval);
-
- return 0;
-}
-
-static int firesat_ca_io_open(struct inode *inode, struct file *file)
-{
- if (ca_debug != 0)
- printk(KERN_INFO "%s\n",__func__);
- return dvb_generic_open(inode, file);
-}
-
-static int firesat_ca_io_release(struct inode *inode, struct file *file)
-{
- if (ca_debug != 0)
- printk(KERN_INFO "%s\n",__func__);
- return dvb_generic_release(inode, file);
-}
-
static unsigned int firesat_ca_io_poll(struct file *file, poll_table *wait)
{
- if (ca_debug != 0)
- printk(KERN_INFO "%s\n",__func__);
return POLLIN;
}
static struct file_operations firesat_ca_fops = {
- .owner = THIS_MODULE,
- .read = NULL, // There is no low level read anymore
- .write = NULL, // There is no low level write anymore
- .ioctl = dvb_generic_ioctl,
- .open = firesat_ca_io_open,
- .release = firesat_ca_io_release,
- .poll = firesat_ca_io_poll,
+ .owner = THIS_MODULE,
+ .ioctl = dvb_generic_ioctl,
+ .open = dvb_generic_open,
+ .release = dvb_generic_release,
+ .poll = firesat_ca_io_poll,
};
static struct dvb_device firesat_ca = {
- .priv = NULL,
- .users = 1,
- .readers = 1,
- .writers = 1,
- .fops = &firesat_ca_fops,
- .kernel_ioctl = firesat_ca_ioctl,
+ .users = 1,
+ .readers = 1,
+ .writers = 1,
+ .fops = &firesat_ca_fops,
+ .kernel_ioctl = firesat_ca_ioctl,
};
-int firesat_ca_init(struct firesat *firesat)
+int firesat_ca_register(struct firesat *firesat)
{
- int err;
ANTENNA_INPUT_INFO info;
+ int err;
- if (AVCTunerStatus(firesat, &info))
+ if (avc_tuner_status(firesat, &info))
return -EINVAL;
- if (firesat_ca_ready(&info)) {
- err = dvb_register_device(firesat->adapter,
- &firesat->cadev,
- &firesat_ca, firesat,
- DVB_DEVICE_CA);
-
- if (info.CaApplicationInfo == 0)
- printk(KERN_ERR "%s: CaApplicationInfo is not set.\n",
- __func__);
- if (info.CaDateTimeRequest == 1)
- firesat_get_date_time_request(firesat);
- }
- else
- err = -EFAULT;
+ if (!firesat_ca_ready(&info))
+ return -EFAULT;
+
+ err = dvb_register_device(&firesat->adapter, &firesat->cadev,
+ &firesat_ca, firesat, DVB_DEVICE_CA);
+
+ if (info.CaApplicationInfo == 0)
+ printk(KERN_ERR "%s: CaApplicationInfo is not set.\n",
+ __func__);
+ if (info.CaDateTimeRequest == 1)
+ avc_ca_get_time_date(firesat, &firesat->ca_time_interval);
return err;
}
@@ -353,5 +251,5 @@ int firesat_ca_init(struct firesat *firesat)
void firesat_ca_release(struct firesat *firesat)
{
if (firesat->cadev)
- dvb_unregister_device(firesat->cadev);
+ dvb_unregister_device(firesat->cadev);
}