2 Mantis PCI bridge driver
4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)
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.
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.
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.
21 #include <linux/kernel.h>
23 #include <linux/signal.h>
24 #include <linux/sched.h>
25 #include <linux/interrupt.h>
30 #include "dvb_demux.h"
31 #include "dvb_frontend.h"
34 #include "mantis_common.h"
35 #include "mantis_link.h"
36 #include "mantis_hif.h"
37 #include "mantis_reg.h"
39 static void mantis_hifevm_work(struct work_struct
*work
)
41 struct mantis_ca
*ca
= container_of(work
, struct mantis_ca
, hif_evm_work
);
42 struct mantis_pci
*mantis
= ca
->ca_priv
;
46 gpif_stat
= mmread(MANTIS_GPIF_STATUS
);
48 if (gpif_stat
& MANTIS_GPIF_DETSTAT
) {
49 if (gpif_stat
& MANTIS_CARD_PLUGIN
) {
50 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis
->num
);
51 mmwrite(0xdada0000, MANTIS_CARD_RESET
);
52 mantis_event_cam_plugin(ca
);
53 dvb_ca_en50221_camchange_irq(&ca
->en50221
,
55 DVB_CA_EN50221_CAMCHANGE_INSERTED
);
58 if (gpif_stat
& MANTIS_CARD_PLUGOUT
) {
59 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis
->num
);
60 mmwrite(0xdada0000, MANTIS_CARD_RESET
);
61 mantis_event_cam_unplug(ca
);
62 dvb_ca_en50221_camchange_irq(&ca
->en50221
,
64 DVB_CA_EN50221_CAMCHANGE_REMOVED
);
68 if (mantis
->gpif_status
& MANTIS_GPIF_EXTIRQ
)
69 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis
->num
);
71 if (mantis
->gpif_status
& MANTIS_SBUF_WSTO
)
72 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis
->num
);
74 if (mantis
->gpif_status
& MANTIS_GPIF_OTHERR
)
75 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis
->num
);
77 if (gpif_stat
& MANTIS_SBUF_OVFLW
)
78 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis
->num
);
80 if (gpif_stat
& MANTIS_GPIF_BRRDY
)
81 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis
->num
);
83 if (gpif_stat
& MANTIS_GPIF_INTSTAT
)
84 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis
->num
);
86 if (gpif_stat
& MANTIS_SBUF_EMPTY
)
87 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis
->num
);
89 if (gpif_stat
& MANTIS_SBUF_OPDONE
) {
90 dprintk(MANTIS_DEBUG
, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis
->num
);
91 ca
->sbuf_status
= MANTIS_SBUF_DATA_AVAIL
;
92 ca
->hif_event
= MANTIS_SBUF_OPDONE
;
93 wake_up(&ca
->hif_opdone_wq
);
97 int mantis_evmgr_init(struct mantis_ca
*ca
)
99 struct mantis_pci
*mantis
= ca
->ca_priv
;
101 dprintk(MANTIS_DEBUG
, 1, "Initializing Mantis Host I/F Event manager");
102 INIT_WORK(&ca
->hif_evm_work
, mantis_hifevm_work
);
103 mantis_pcmcia_init(ca
);
104 schedule_work(&ca
->hif_evm_work
);
109 void mantis_evmgr_exit(struct mantis_ca
*ca
)
111 struct mantis_pci
*mantis
= ca
->ca_priv
;
113 dprintk(MANTIS_DEBUG
, 1, "Mantis Host I/F Event manager exiting");
114 flush_work(&ca
->hif_evm_work
);
116 mantis_pcmcia_exit(ca
);