The patch number 13743 was added via Manu Abraham <m...@linuxtv.org>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Manu Abraham  <abraham.m...@gmail.com>
[Mantis CA] Use DVB_CA Tuple parser

Signed-off-by: Manu Abraham <m...@linuxtv.org>


---

 linux/drivers/media/dvb/mantis/mantis_ca.c     |  135 ++++++++---------
 linux/drivers/media/dvb/mantis/mantis_common.h |    2 
 linux/drivers/media/dvb/mantis/mantis_hif.c    |   10 -
 linux/drivers/media/dvb/mantis/mantis_link.h   |    9 -
 4 files changed, 83 insertions(+), 73 deletions(-)

diff -r a689da500422 -r 4821bce5dc92 linux/drivers/media/dvb/mantis/mantis_ca.c
--- a/linux/drivers/media/dvb/mantis/mantis_ca.c        Fri Dec 04 12:10:25 
2009 +0400
+++ b/linux/drivers/media/dvb/mantis/mantis_ca.c        Fri Dec 04 12:11:14 
2009 +0400
@@ -22,96 +22,104 @@
 #include "mantis_link.h"
 #include "mantis_hif.h"
 
+static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, 
int addr)
+{
+       struct mantis_ca *ca = en50221->data;
 
-static int mantis_ca_ioctl(struct inode *inode, struct file *file, unsigned 
int cmd, unsigned long parg)
+       if (slot != 0)
+               return -EINVAL;
+
+       return mantis_hif_read_mem(ca, addr);
+}
+
+static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, 
int addr, u8 data)
+{
+       struct mantis_ca *ca = en50221->data;
+
+       if (slot != 0)
+               return -EINVAL;
+
+       return mantis_hif_write_mem(ca, addr, data);
+}
+
+static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 
addr)
+{
+       struct mantis_ca *ca = en50221->data;
+
+       if (slot != 0)
+               return -EINVAL;
+
+       return mantis_hif_read_iom(ca, addr);
+}
+
+static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, 
u8 addr, u8 data)
+{
+       struct mantis_ca *ca = en50221->data;
+
+       if (slot != 0)
+               return -EINVAL;
+
+       return mantis_hif_write_iom(ca, addr, data);
+}
+
+static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
 {
        return 0;
 }
 
-static int mantis_ca_open(struct inode *inode, struct file *file)
+static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
 {
        return 0;
 }
 
-static int mantis_ca_release(struct inode *inode, struct file *file)
+static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
 {
        return 0;
 }
 
-static ssize_t mantis_ca_read(struct file *file, char __user *buffer, size_t 
count, loff_t *ofset)
+static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int 
open)
 {
-       struct dvb_device *dvbdev       = file->private_data;
-       struct mantis_ca *ca            = dvbdev->priv;
-
-       int status;
-
        return 0;
-error:
-       return status;
 }
 
-static ssize_t mantis_ca_write(struct file *file, const char __user *buffer, 
size_t count, loff_t *offset)
+int mantis_ca_init(struct mantis_pci *mantis)
 {
-       struct dvb_device *dvbdev       = file->private_data;
-       struct mantis_ca *ca            = dvbdev->priv;
-
-       int status;
-
-       return 0;
-error:
-       return status;
-}
-
-static struct file_operations mantis_fops = {
-       .owner          = THIS_MODULE,
-       .ioctl          = mantis_ca_ioctl,
-       .open           = mantis_ca_open,
-       .release        = mantis_ca_release,
-       .read           = mantis_ca_read,
-       .write          = mantis_ca_write,
-};
-
-static struct dvb_device mantis_ca = {
-       .priv           = NULL,
-       .users          = 1,
-       .readers        = 1,
-       .writers        = 1,
-       .fops           = &mantis_fops,
-};
-
-struct dvb_device *mantis_ca_init(struct mantis_pci *mantis)
-{
-       int ret;
-
-       struct dvb_device *dvbdev;
        struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
        struct mantis_ca *ca;
+       int ca_flags = 0, result;
 
        if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
                dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
-               return NULL;
+               result = -ENOMEM;
+               goto err;
        }
 
        ca->ca_priv = mantis;
+       mantis->mantis_ca = ca;
 
-       dprintk(verbose, MANTIS_ERROR, 0, "CA: Registering Mantis Adapter(%d) 
Slot(0)\n", mantis->num);
-       if (dvb_register_device(dvb_adapter, &dvbdev, &mantis_ca, ca, 
DVB_DEVICE_CA) == 0) {
-               ca->ca_dev = dvbdev;
-               mantis->mantis_ca = ca;
-               mantis_evmgr_init(ca);
-               return ca->ca_dev;
+       /* register CA interface */
+       ca->en50221.owner               = THIS_MODULE;
+       ca->en50221.read_attribute_mem  = mantis_ca_read_attr_mem;
+       ca->en50221.write_attribute_mem = mantis_ca_write_attr_mem;
+       ca->en50221.read_cam_control    = mantis_ca_read_cam_ctl;
+       ca->en50221.write_cam_control   = mantis_ca_write_cam_ctl;
+       ca->en50221.slot_reset          = mantis_ca_slot_reset;
+       ca->en50221.slot_shutdown       = mantis_ca_slot_shutdown;
+       ca->en50221.slot_ts_enable      = mantis_ts_control;
+       ca->en50221.poll_slot_status    = mantis_slot_status;
+       ca->en50221.data                = ca;
+
+       dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
+       if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 
1)) != 0) {
+               dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization 
failed");
+               goto err;
        }
+       dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
+       mantis_evmgr_init(ca);
        return 0;
-
-error:
-       if (ca != NULL) {
-               dprintk(verbose, MANTIS_ERROR, 1, "Error ..");
-               if (ca->ca_dev != NULL)
-                       dvb_unregister_device(ca->ca_dev);
-
-               kfree(ca);
-       }
-       return NULL;
+err:
+       kfree(ca);
+       return result;
 }
 
 void mantis_ca_exit(struct mantis_pci *mantis)
@@ -119,9 +127,8 @@
        struct mantis_ca *ca = mantis->mantis_ca;
 
        mantis_evmgr_exit(ca);
-       dprintk(verbose, MANTIS_ERROR, 0, "CA: Unregister Mantis Adapter(%d) 
Slot(0)\n", mantis->num);
-       if (ca->ca_dev)
-               dvb_unregister_device(ca->ca_dev);
+       dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
+       dvb_ca_en50221_release(&ca->en50221);
 
        kfree(ca);
 }
diff -r a689da500422 -r 4821bce5dc92 
linux/drivers/media/dvb/mantis/mantis_common.h
--- a/linux/drivers/media/dvb/mantis/mantis_common.h    Fri Dec 04 12:10:25 
2009 +0400
+++ b/linux/drivers/media/dvb/mantis/mantis_common.h    Fri Dec 04 12:11:14 
2009 +0400
@@ -151,7 +151,7 @@
 extern void mantis_dma_xfer(unsigned long data);
 extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
 
-extern struct dvb_device *mantis_ca_init(struct mantis_pci *mantis);
+extern int mantis_ca_init(struct mantis_pci *mantis);
 extern void mantis_ca_exit(struct mantis_pci *mantis);
 
 
diff -r a689da500422 -r 4821bce5dc92 linux/drivers/media/dvb/mantis/mantis_hif.c
--- a/linux/drivers/media/dvb/mantis/mantis_hif.c       Fri Dec 04 12:10:25 
2009 +0400
+++ b/linux/drivers/media/dvb/mantis/mantis_hif.c       Fri Dec 04 12:11:14 
2009 +0400
@@ -111,10 +111,10 @@
        return 0;
 }
 
-int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 *data)
+int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
 {
        struct mantis_pci *mantis = ca->ca_priv;
-       u32 hif_addr = 0;
+       u32 data, hif_addr = 0;
 
        hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
        hif_addr |=  MANTIS_GPIF_HIFRDWRN;
@@ -131,14 +131,14 @@
        }
        udelay(50);
        ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
-       *data = mmread(MANTIS_GPIF_HIFDIN);
+       data = mmread(MANTIS_GPIF_HIFDIN);
        hif_addr |= MANTIS_GPIF_PCMCIAREG;
        mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
 
-       return 0;
+       return data;
 }
 
-int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u32 data)
+int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
 {
        struct mantis_pci *mantis = ca->ca_priv;
        u32 hif_addr = 0;
diff -r a689da500422 -r 4821bce5dc92 
linux/drivers/media/dvb/mantis/mantis_link.h
--- a/linux/drivers/media/dvb/mantis/mantis_link.h      Fri Dec 04 12:10:25 
2009 +0400
+++ b/linux/drivers/media/dvb/mantis/mantis_link.h      Fri Dec 04 12:11:14 
2009 +0400
@@ -22,6 +22,7 @@
 #define __MANTIS_LINK_H
 
 #include <linux/workqueue.h>
+#include "dvb_ca_en50221.h"
 
 enum mantis_sbuf_status {
        MANTIS_SBUF_DATA_AVAIL          = 1,
@@ -56,8 +57,10 @@
 
        enum mantis_slot_state          slot_state;
 
-       struct dvb_device               *ca_dev;
+//     struct dvb_device               *ca_dev;
        void                            *ca_priv;
+
+       struct dvb_ca_en50221           en50221;
 };
 
 /* CA */
@@ -73,7 +76,7 @@
 extern void mantis_hif_exit(struct mantis_ca *ca);
 extern int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr);
 extern int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data);
-extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 
*data);
-extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u32 data);
+extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr);
+extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data);
 
 #endif // __MANTIS_LINK_H


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/4821bce5dc924f6af58be20b041da2f859b48412

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to