]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - drivers/media/dvb/mantis/mantis_ca.c
V4L/DVB (13782): [Mantis] Temporarily disable FRDA irq
[mirror_ubuntu-hirsute-kernel.git] / drivers / media / dvb / mantis / mantis_ca.c
CommitLineData
50d82602
MA
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
6053240f 25static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
50d82602 26{
6053240f 27 struct mantis_ca *ca = en50221->data;
2133ffbf
MA
28 struct mantis_pci *mantis = ca->ca_priv;
29
30 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
6053240f
MA
31
32 if (slot != 0)
33 return -EINVAL;
34
35 return mantis_hif_read_mem(ca, addr);
50d82602
MA
36}
37
6053240f 38static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr, u8 data)
50d82602 39{
6053240f 40 struct mantis_ca *ca = en50221->data;
2133ffbf
MA
41 struct mantis_pci *mantis = ca->ca_priv;
42
43 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
6053240f
MA
44
45 if (slot != 0)
46 return -EINVAL;
47
48 return mantis_hif_write_mem(ca, addr, data);
50d82602
MA
49}
50
6053240f 51static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
50d82602 52{
6053240f 53 struct mantis_ca *ca = en50221->data;
2133ffbf
MA
54 struct mantis_pci *mantis = ca->ca_priv;
55
56 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
6053240f
MA
57
58 if (slot != 0)
59 return -EINVAL;
60
61 return mantis_hif_read_iom(ca, addr);
50d82602
MA
62}
63
6053240f 64static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr, u8 data)
50d82602 65{
6053240f 66 struct mantis_ca *ca = en50221->data;
2133ffbf
MA
67 struct mantis_pci *mantis = ca->ca_priv;
68
69 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
50d82602 70
6053240f
MA
71 if (slot != 0)
72 return -EINVAL;
50d82602 73
6053240f 74 return mantis_hif_write_iom(ca, addr, data);
50d82602
MA
75}
76
6053240f 77static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
50d82602 78{
2133ffbf
MA
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);
fb6de9c5
MA
83 udelay(500); /* Wait.. */
84 mmwrite(0xda, MANTIS_PCMCIA_RESET); /* Leading edge assert */
85 udelay(500);
86 mmwrite(0x00, MANTIS_PCMCIA_RESET); /* Trailing edge deassert */
87 msleep(1000);
2ec9b00b 88 dvb_ca_en50221_camready_irq(&ca->en50221, 0);
2133ffbf 89
6053240f
MA
90 return 0;
91}
50d82602 92
6053240f
MA
93static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
94{
2133ffbf
MA
95 struct mantis_ca *ca = en50221->data;
96 struct mantis_pci *mantis = ca->ca_priv;
97
98 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot shutdown", slot);
99
6053240f
MA
100 return 0;
101}
50d82602 102
6053240f
MA
103static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
104{
2133ffbf
MA
105 struct mantis_ca *ca = en50221->data;
106 struct mantis_pci *mantis = ca->ca_priv;
107
108 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
990f8d1e 109 mantis_set_direction(mantis, 1); /* Enable TS through CAM */
2133ffbf 110
50d82602 111 return 0;
50d82602
MA
112}
113
6053240f 114static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
50d82602 115{
4e9fbeee 116 struct mantis_ca *ca = en50221->data;
2133ffbf
MA
117 struct mantis_pci *mantis = ca->ca_priv;
118
119 dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
4e9fbeee 120
5e2a0c99
MA
121 if (ca->slot_state == MODULE_INSERTED) {
122 dprintk(verbose, MANTIS_DEBUG, 1, "CA Module present and ready");
4e9fbeee 123 return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
5e2a0c99
MA
124 } else {
125 dprintk(verbose, MANTIS_DEBUG, 1, "CA Module not present or not ready");
126 }
4e9fbeee 127
6053240f
MA
128 return 0;
129}
50d82602 130
6053240f
MA
131int mantis_ca_init(struct mantis_pci *mantis)
132{
50d82602
MA
133 struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
134 struct mantis_ca *ca;
6053240f 135 int ca_flags = 0, result;
50d82602 136
2133ffbf 137 dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis CA");
50d82602
MA
138 if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
139 dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
6053240f
MA
140 result = -ENOMEM;
141 goto err;
50d82602
MA
142 }
143
144 ca->ca_priv = mantis;
6053240f 145 mantis->mantis_ca = ca;
e26c2b46 146 ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE;
6053240f
MA
147 /* register CA interface */
148 ca->en50221.owner = THIS_MODULE;
149 ca->en50221.read_attribute_mem = mantis_ca_read_attr_mem;
150 ca->en50221.write_attribute_mem = mantis_ca_write_attr_mem;
151 ca->en50221.read_cam_control = mantis_ca_read_cam_ctl;
152 ca->en50221.write_cam_control = mantis_ca_write_cam_ctl;
153 ca->en50221.slot_reset = mantis_ca_slot_reset;
154 ca->en50221.slot_shutdown = mantis_ca_slot_shutdown;
155 ca->en50221.slot_ts_enable = mantis_ts_control;
156 ca->en50221.poll_slot_status = mantis_slot_status;
157 ca->en50221.data = ca;
158
159 dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
160 if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
161 dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
162 goto err;
50d82602 163 }
6053240f
MA
164 dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
165 mantis_evmgr_init(ca);
50d82602 166 return 0;
6053240f
MA
167err:
168 kfree(ca);
169 return result;
50d82602
MA
170}
171
172void mantis_ca_exit(struct mantis_pci *mantis)
173{
174 struct mantis_ca *ca = mantis->mantis_ca;
2133ffbf
MA
175
176 dprintk(verbose, MANTIS_DEBUG, 1, "Mantis CA exit");
50d82602
MA
177
178 mantis_evmgr_exit(ca);
6053240f
MA
179 dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
180 dvb_ca_en50221_release(&ca->en50221);
50d82602
MA
181
182 kfree(ca);
183}