blob: a8b8c88238e0874e448025a441a5e2606c1d5942 [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 Abraham2133ffb2009-12-04 05:12:16 -030028 struct mantis_pci *mantis = ca->ca_priv;
29
30 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
Manu Abraham50d82602009-12-04 05:06:38 -030031
Manu Abraham60532402009-12-04 05:11:14 -030032 if (slot != 0)
33 return -EINVAL;
34
35 return mantis_hif_read_mem(ca, addr);
36}
37
38static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr, u8 data)
39{
40 struct mantis_ca *ca = en50221->data;
Manu Abraham2133ffb2009-12-04 05:12:16 -030041 struct mantis_pci *mantis = ca->ca_priv;
42
43 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
Manu Abraham60532402009-12-04 05:11:14 -030044
45 if (slot != 0)
46 return -EINVAL;
47
48 return mantis_hif_write_mem(ca, addr, data);
49}
50
51static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
52{
53 struct mantis_ca *ca = en50221->data;
Manu Abraham2133ffb2009-12-04 05:12:16 -030054 struct mantis_pci *mantis = ca->ca_priv;
55
56 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
Manu Abraham60532402009-12-04 05:11:14 -030057
58 if (slot != 0)
59 return -EINVAL;
60
61 return mantis_hif_read_iom(ca, addr);
62}
63
64static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr, u8 data)
65{
66 struct mantis_ca *ca = en50221->data;
Manu Abraham2133ffb2009-12-04 05:12:16 -030067 struct mantis_pci *mantis = ca->ca_priv;
68
69 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
Manu Abraham60532402009-12-04 05:11:14 -030070
71 if (slot != 0)
72 return -EINVAL;
73
74 return mantis_hif_write_iom(ca, addr, data);
75}
76
77static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
Manu Abraham50d82602009-12-04 05:06:38 -030078{
Manu Abraham2133ffb2009-12-04 05:12:16 -030079 struct mantis_ca *ca = en50221->data;
80 struct mantis_pci *mantis = ca->ca_priv;
81
82 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot RESET", slot);
83
Manu Abraham50d82602009-12-04 05:06:38 -030084 return 0;
85}
86
Manu Abraham60532402009-12-04 05:11:14 -030087static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
Manu Abraham50d82602009-12-04 05:06:38 -030088{
Manu Abraham2133ffb2009-12-04 05:12:16 -030089 struct mantis_ca *ca = en50221->data;
90 struct mantis_pci *mantis = ca->ca_priv;
91
92 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot shutdown", slot);
93
Manu Abraham50d82602009-12-04 05:06:38 -030094 return 0;
95}
96
Manu Abraham60532402009-12-04 05:11:14 -030097static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
Manu Abraham50d82602009-12-04 05:06:38 -030098{
Manu Abraham2133ffb2009-12-04 05:12:16 -030099 struct mantis_ca *ca = en50221->data;
100 struct mantis_pci *mantis = ca->ca_priv;
101
102 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
103
Manu Abraham50d82602009-12-04 05:06:38 -0300104 return 0;
105}
106
Manu Abraham60532402009-12-04 05:11:14 -0300107static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
Manu Abraham50d82602009-12-04 05:06:38 -0300108{
Manu Abraham4e9fbee2009-12-04 05:11:41 -0300109 struct mantis_ca *ca = en50221->data;
Manu Abraham2133ffb2009-12-04 05:12:16 -0300110 struct mantis_pci *mantis = ca->ca_priv;
111
112 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
Manu Abraham4e9fbee2009-12-04 05:11:41 -0300113
114 if (ca->slot_state == MODULE_INSERTED)
115 return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
116
Manu Abraham50d82602009-12-04 05:06:38 -0300117 return 0;
Manu Abraham50d82602009-12-04 05:06:38 -0300118}
119
Manu Abraham60532402009-12-04 05:11:14 -0300120int mantis_ca_init(struct mantis_pci *mantis)
Manu Abraham50d82602009-12-04 05:06:38 -0300121{
Manu Abraham50d82602009-12-04 05:06:38 -0300122 struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
123 struct mantis_ca *ca;
Manu Abraham60532402009-12-04 05:11:14 -0300124 int ca_flags = 0, result;
Manu Abraham50d82602009-12-04 05:06:38 -0300125
Manu Abraham2133ffb2009-12-04 05:12:16 -0300126 dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis CA");
Manu Abraham50d82602009-12-04 05:06:38 -0300127 if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
128 dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
Manu Abraham60532402009-12-04 05:11:14 -0300129 result = -ENOMEM;
130 goto err;
Manu Abraham50d82602009-12-04 05:06:38 -0300131 }
132
133 ca->ca_priv = mantis;
Manu Abraham60532402009-12-04 05:11:14 -0300134 mantis->mantis_ca = ca;
Manu Abraham50d82602009-12-04 05:06:38 -0300135
Manu Abraham60532402009-12-04 05:11:14 -0300136 /* register CA interface */
137 ca->en50221.owner = THIS_MODULE;
138 ca->en50221.read_attribute_mem = mantis_ca_read_attr_mem;
139 ca->en50221.write_attribute_mem = mantis_ca_write_attr_mem;
140 ca->en50221.read_cam_control = mantis_ca_read_cam_ctl;
141 ca->en50221.write_cam_control = mantis_ca_write_cam_ctl;
142 ca->en50221.slot_reset = mantis_ca_slot_reset;
143 ca->en50221.slot_shutdown = mantis_ca_slot_shutdown;
144 ca->en50221.slot_ts_enable = mantis_ts_control;
145 ca->en50221.poll_slot_status = mantis_slot_status;
146 ca->en50221.data = ca;
147
148 dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
149 if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
150 dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
151 goto err;
Manu Abraham50d82602009-12-04 05:06:38 -0300152 }
Manu Abraham60532402009-12-04 05:11:14 -0300153 dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
154 mantis_evmgr_init(ca);
Manu Abraham50d82602009-12-04 05:06:38 -0300155 return 0;
Manu Abraham60532402009-12-04 05:11:14 -0300156err:
157 kfree(ca);
158 return result;
Manu Abraham50d82602009-12-04 05:06:38 -0300159}
160
161void mantis_ca_exit(struct mantis_pci *mantis)
162{
163 struct mantis_ca *ca = mantis->mantis_ca;
Manu Abraham2133ffb2009-12-04 05:12:16 -0300164 struct mantis_pci *mantis = ca->ca_priv;
165
166 dprintk(verbose, MANTIS_DEBUG, 1, "Mantis CA exit");
Manu Abraham50d82602009-12-04 05:06:38 -0300167
168 mantis_evmgr_exit(ca);
Manu Abraham60532402009-12-04 05:11:14 -0300169 dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
170 dvb_ca_en50221_release(&ca->en50221);
Manu Abraham50d82602009-12-04 05:06:38 -0300171
172 kfree(ca);
173}