blob: 4be61ca02c20351483397c8df52963f7b9efbecc [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 Abraham50d82602009-12-04 05:06:38 -030082 return 0;
Manu Abraham50d82602009-12-04 05:06:38 -030083}
84
Manu Abraham60532402009-12-04 05:11:14 -030085int mantis_ca_init(struct mantis_pci *mantis)
Manu Abraham50d82602009-12-04 05:06:38 -030086{
Manu Abraham50d82602009-12-04 05:06:38 -030087 struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
88 struct mantis_ca *ca;
Manu Abraham60532402009-12-04 05:11:14 -030089 int ca_flags = 0, result;
Manu Abraham50d82602009-12-04 05:06:38 -030090
91 if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
92 dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
Manu Abraham60532402009-12-04 05:11:14 -030093 result = -ENOMEM;
94 goto err;
Manu Abraham50d82602009-12-04 05:06:38 -030095 }
96
97 ca->ca_priv = mantis;
Manu Abraham60532402009-12-04 05:11:14 -030098 mantis->mantis_ca = ca;
Manu Abraham50d82602009-12-04 05:06:38 -030099
Manu Abraham60532402009-12-04 05:11:14 -0300100 /* register CA interface */
101 ca->en50221.owner = THIS_MODULE;
102 ca->en50221.read_attribute_mem = mantis_ca_read_attr_mem;
103 ca->en50221.write_attribute_mem = mantis_ca_write_attr_mem;
104 ca->en50221.read_cam_control = mantis_ca_read_cam_ctl;
105 ca->en50221.write_cam_control = mantis_ca_write_cam_ctl;
106 ca->en50221.slot_reset = mantis_ca_slot_reset;
107 ca->en50221.slot_shutdown = mantis_ca_slot_shutdown;
108 ca->en50221.slot_ts_enable = mantis_ts_control;
109 ca->en50221.poll_slot_status = mantis_slot_status;
110 ca->en50221.data = ca;
111
112 dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
113 if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
114 dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
115 goto err;
Manu Abraham50d82602009-12-04 05:06:38 -0300116 }
Manu Abraham60532402009-12-04 05:11:14 -0300117 dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
118 mantis_evmgr_init(ca);
Manu Abraham50d82602009-12-04 05:06:38 -0300119 return 0;
Manu Abraham60532402009-12-04 05:11:14 -0300120err:
121 kfree(ca);
122 return result;
Manu Abraham50d82602009-12-04 05:06:38 -0300123}
124
125void mantis_ca_exit(struct mantis_pci *mantis)
126{
127 struct mantis_ca *ca = mantis->mantis_ca;
128
129 mantis_evmgr_exit(ca);
Manu Abraham60532402009-12-04 05:11:14 -0300130 dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
131 dvb_ca_en50221_release(&ca->en50221);
Manu Abraham50d82602009-12-04 05:06:38 -0300132
133 kfree(ca);
134}