]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/media/dvb/mantis/mantis_ca.c
V4L/DVB (13745): [Mantis CA] Add some debug statements
[karo-tx-linux.git] / drivers / media / dvb / mantis / mantis_ca.c
1 /*
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
25 static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
26 {
27         struct mantis_ca *ca = en50221->data;
28         struct mantis_pci *mantis = ca->ca_priv;
29
30         dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
31
32         if (slot != 0)
33                 return -EINVAL;
34
35         return mantis_hif_read_mem(ca, addr);
36 }
37
38 static 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;
41         struct mantis_pci *mantis = ca->ca_priv;
42
43         dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
44
45         if (slot != 0)
46                 return -EINVAL;
47
48         return mantis_hif_write_mem(ca, addr, data);
49 }
50
51 static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
52 {
53         struct mantis_ca *ca = en50221->data;
54         struct mantis_pci *mantis = ca->ca_priv;
55
56         dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
57
58         if (slot != 0)
59                 return -EINVAL;
60
61         return mantis_hif_read_iom(ca, addr);
62 }
63
64 static 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;
67         struct mantis_pci *mantis = ca->ca_priv;
68
69         dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
70
71         if (slot != 0)
72                 return -EINVAL;
73
74         return mantis_hif_write_iom(ca, addr, data);
75 }
76
77 static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
78 {
79         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
84         return 0;
85 }
86
87 static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
88 {
89         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
94         return 0;
95 }
96
97 static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
98 {
99         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
104         return 0;
105 }
106
107 static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
108 {
109         struct mantis_ca *ca = en50221->data;
110         struct mantis_pci *mantis = ca->ca_priv;
111
112         dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
113
114         if (ca->slot_state == MODULE_INSERTED)
115                 return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
116
117         return 0;
118 }
119
120 int mantis_ca_init(struct mantis_pci *mantis)
121 {
122         struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
123         struct mantis_ca *ca;
124         int ca_flags = 0, result;
125
126         dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis CA");
127         if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
128                 dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
129                 result = -ENOMEM;
130                 goto err;
131         }
132
133         ca->ca_priv = mantis;
134         mantis->mantis_ca = ca;
135
136         /* 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;
152         }
153         dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
154         mantis_evmgr_init(ca);
155         return 0;
156 err:
157         kfree(ca);
158         return result;
159 }
160
161 void mantis_ca_exit(struct mantis_pci *mantis)
162 {
163         struct mantis_ca *ca = mantis->mantis_ca;
164         struct mantis_pci *mantis = ca->ca_priv;
165
166         dprintk(verbose, MANTIS_DEBUG, 1, "Mantis CA exit");
167
168         mantis_evmgr_exit(ca);
169         dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
170         dvb_ca_en50221_release(&ca->en50221);
171
172         kfree(ca);
173 }