blob: cd6bed73729688d59b8d6d5afe2674b19f8d2710 [file] [log] [blame]
Manu Abraham50d82602009-12-04 05:06:38 -03001/*
2 Mantis PCI bridge driver
3
4 Copyright (C) 2005, 2006 Manu Abraham (abraham.manu@gmail.com)
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "mantis_common.h"
22#include "mantis_link.h"
23#include "mantis_hif.h"
24
Manu Abraham60532402009-12-04 05:11:14 -030025static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
26{
27 struct mantis_ca *ca = en50221->data;
Manu Abraham50d82602009-12-04 05:06:38 -030028
Manu Abraham60532402009-12-04 05:11:14 -030029 if (slot != 0)
30 return -EINVAL;
31
32 return mantis_hif_read_mem(ca, addr);
33}
34
35static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr, u8 data)
36{
37 struct mantis_ca *ca = en50221->data;
38
39 if (slot != 0)
40 return -EINVAL;
41
42 return mantis_hif_write_mem(ca, addr, data);
43}
44
45static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
46{
47 struct mantis_ca *ca = en50221->data;
48
49 if (slot != 0)
50 return -EINVAL;
51
52 return mantis_hif_read_iom(ca, addr);
53}
54
55static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr, u8 data)
56{
57 struct mantis_ca *ca = en50221->data;
58
59 if (slot != 0)
60 return -EINVAL;
61
62 return mantis_hif_write_iom(ca, addr, data);
63}
64
65static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
Manu Abraham50d82602009-12-04 05:06:38 -030066{
67 return 0;
68}
69
Manu Abraham60532402009-12-04 05:11:14 -030070static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
Manu Abraham50d82602009-12-04 05:06:38 -030071{
72 return 0;
73}
74
Manu Abraham60532402009-12-04 05:11:14 -030075static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
Manu Abraham50d82602009-12-04 05:06:38 -030076{
77 return 0;
78}
79
Manu Abraham60532402009-12-04 05:11:14 -030080static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
Manu Abraham50d82602009-12-04 05:06:38 -030081{
Manu Abraham4e9fbee2009-12-04 05:11:41 -030082 struct mantis_ca *ca = en50221->data;
83
84 if (ca->slot_state == MODULE_INSERTED)
85 return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
86
Manu Abraham50d82602009-12-04 05:06:38 -030087 return 0;
Manu Abraham50d82602009-12-04 05:06:38 -030088}
89
Manu Abraham60532402009-12-04 05:11:14 -030090int mantis_ca_init(struct mantis_pci *mantis)
Manu Abraham50d82602009-12-04 05:06:38 -030091{
Manu Abraham50d82602009-12-04 05:06:38 -030092 struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
93 struct mantis_ca *ca;
Manu Abraham60532402009-12-04 05:11:14 -030094 int ca_flags = 0, result;
Manu Abraham50d82602009-12-04 05:06:38 -030095
96 if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
97 dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
Manu Abraham60532402009-12-04 05:11:14 -030098 result = -ENOMEM;
99 goto err;
Manu Abraham50d82602009-12-04 05:06:38 -0300100 }
101
102 ca->ca_priv = mantis;
Manu Abraham60532402009-12-04 05:11:14 -0300103 mantis->mantis_ca = ca;
Manu Abraham50d82602009-12-04 05:06:38 -0300104
Manu Abraham60532402009-12-04 05:11:14 -0300105 /* register CA interface */
106 ca->en50221.owner = THIS_MODULE;
107 ca->en50221.read_attribute_mem = mantis_ca_read_attr_mem;
108 ca->en50221.write_attribute_mem = mantis_ca_write_attr_mem;
109 ca->en50221.read_cam_control = mantis_ca_read_cam_ctl;
110 ca->en50221.write_cam_control = mantis_ca_write_cam_ctl;
111 ca->en50221.slot_reset = mantis_ca_slot_reset;
112 ca->en50221.slot_shutdown = mantis_ca_slot_shutdown;
113 ca->en50221.slot_ts_enable = mantis_ts_control;
114 ca->en50221.poll_slot_status = mantis_slot_status;
115 ca->en50221.data = ca;
116
117 dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
118 if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
119 dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
120 goto err;
Manu Abraham50d82602009-12-04 05:06:38 -0300121 }
Manu Abraham60532402009-12-04 05:11:14 -0300122 dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
123 mantis_evmgr_init(ca);
Manu Abraham50d82602009-12-04 05:06:38 -0300124 return 0;
Manu Abraham60532402009-12-04 05:11:14 -0300125err:
126 kfree(ca);
127 return result;
Manu Abraham50d82602009-12-04 05:06:38 -0300128}
129
130void mantis_ca_exit(struct mantis_pci *mantis)
131{
132 struct mantis_ca *ca = mantis->mantis_ca;
133
134 mantis_evmgr_exit(ca);
Manu Abraham60532402009-12-04 05:11:14 -0300135 dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
136 dvb_ca_en50221_release(&ca->en50221);
Manu Abraham50d82602009-12-04 05:06:38 -0300137
138 kfree(ca);
139}