1d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham/*
2d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	Mantis PCI bridge driver
3d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
48825a0970cef408fb2f1a44e3cb05d6ba41a18dbManu Abraham	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
6d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	This program is free software; you can redistribute it and/or modify
7d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	it under the terms of the GNU General Public License as published by
8d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	the Free Software Foundation; either version 2 of the License, or
9d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	(at your option) any later version.
10d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
11d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	This program is distributed in the hope that it will be useful,
12d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	but WITHOUT ANY WARRANTY; without even the implied warranty of
13d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	GNU General Public License for more details.
15d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
16d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	You should have received a copy of the GNU General Public License
17d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	along with this program; if not, write to the Free Software
18d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham*/
20d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
21b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/kernel.h>
22b3b961448f702339444036f94252ff2ba7a99febManu Abraham
23b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/signal.h>
24b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/sched.h>
25b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/interrupt.h>
26b7f080cfe223b3b7424872639d153695615a9255Alexey Dobriyan#include <asm/io.h>
27b3b961448f702339444036f94252ff2ba7a99febManu Abraham
28b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dmxdev.h"
29b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvbdev.h"
30b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_demux.h"
31b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_frontend.h"
32b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_net.h"
33b3b961448f702339444036f94252ff2ba7a99febManu Abraham
34d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham#include "mantis_common.h"
35d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham#include "mantis_link.h"
36fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham#include "mantis_hif.h"
37b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_reg.h"
38fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
3912855cac87218d0c92ffdebb7270cec040cf5a6aManu Abrahamstatic void mantis_hifevm_work(struct work_struct *work)
40fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham{
4112855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham	struct mantis_ca *ca = container_of(work, struct mantis_ca, hif_evm_work);
42fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	struct mantis_pci *mantis = ca->ca_priv;
43fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
4417b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham	u32 gpif_stat, gpif_mask;
45fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
46fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	gpif_stat = mmread(MANTIS_GPIF_STATUS);
473062b1571a1d3520c4d3160ebbfca8002b1d6963Manu Abraham	gpif_mask = mmread(MANTIS_GPIF_IRQCFG);
48fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
49fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
50fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham		if (gpif_stat & MANTIS_CARD_PLUGIN) {
51b3b961448f702339444036f94252ff2ba7a99febManu Abraham			dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
52fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham			mmwrite(0xdada0000, MANTIS_CARD_RESET);
5312855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham			mantis_event_cam_plugin(ca);
5405691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham			dvb_ca_en50221_camchange_irq(&ca->en50221,
5505691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham						     0,
5605691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham						     DVB_CA_EN50221_CAMCHANGE_INSERTED);
57fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham		}
58fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	} else {
59fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham		if (gpif_stat & MANTIS_CARD_PLUGOUT) {
60b3b961448f702339444036f94252ff2ba7a99febManu Abraham			dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
61fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham			mmwrite(0xdada0000, MANTIS_CARD_RESET);
6212855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham			mantis_event_cam_unplug(ca);
6305691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham			dvb_ca_en50221_camchange_irq(&ca->en50221,
6405691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham						     0,
6505691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham						     DVB_CA_EN50221_CAMCHANGE_REMOVED);
66fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham		}
67fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	}
68fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
6917b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham	if (mantis->gpif_status & MANTIS_GPIF_EXTIRQ)
70b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
71fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
7217b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham	if (mantis->gpif_status & MANTIS_SBUF_WSTO)
73b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
74fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
7517b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham	if (mantis->gpif_status & MANTIS_GPIF_OTHERR)
76b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
77fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
78fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	if (gpif_stat & MANTIS_SBUF_OVFLW)
79b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
80fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
819e49e8d913209e7221f761193f18a91d130b9e2dManu Abraham	if (gpif_stat & MANTIS_GPIF_BRRDY)
82b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
839e49e8d913209e7221f761193f18a91d130b9e2dManu Abraham
84fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	if (gpif_stat & MANTIS_GPIF_INTSTAT)
85b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
86fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
87fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	if (gpif_stat & MANTIS_SBUF_EMPTY)
88b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
89fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham
90fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	if (gpif_stat & MANTIS_SBUF_OPDONE) {
91b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
92cc0e4aacaf4c3660fa759ce1299377baaf9efd8bManu Abraham		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
93c02e15150c85619f22a98675124503ed93bf1914Sigmund Augdal		ca->hif_event = MANTIS_SBUF_OPDONE;
94c02e15150c85619f22a98675124503ed93bf1914Sigmund Augdal		wake_up(&ca->hif_opdone_wq);
95fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham	}
96fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham}
97d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
98d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abrahamint mantis_evmgr_init(struct mantis_ca *ca)
99d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham{
100d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	struct mantis_pci *mantis = ca->ca_priv;
101d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
102b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
10312855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham	INIT_WORK(&ca->hif_evm_work, mantis_hifevm_work);
10450d82602760c99d2c954c33360990c00146532cdManu Abraham	mantis_pcmcia_init(ca);
10512855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham	schedule_work(&ca->hif_evm_work);
106d8b14f8a76d71c84622a211f57baf15f61cc9703Manu Abraham	mantis_hif_init(ca);
107d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	return 0;
108d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham}
109d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
110d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abrahamvoid mantis_evmgr_exit(struct mantis_ca *ca)
111d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham{
112d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham	struct mantis_pci *mantis = ca->ca_priv;
113d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham
114b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
1150d9c76aedbac3ad8ac4e99a2b441bc3f91dd6679Tejun Heo	flush_work_sync(&ca->hif_evm_work);
116d8b14f8a76d71c84622a211f57baf15f61cc9703Manu Abraham	mantis_hif_exit(ca);
11750d82602760c99d2c954c33360990c00146532cdManu Abraham	mantis_pcmcia_exit(ca);
118d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham}
119