1bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham/*
2bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	Mantis PCI bridge driver
3bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
48825a0970cef408fb2f1a44e3cb05d6ba41a18dbManu Abraham	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
6bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	This program is free software; you can redistribute it and/or modify
7bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	it under the terms of the GNU General Public License as published by
8bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	the Free Software Foundation; either version 2 of the License, or
9bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	(at your option) any later version.
10bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
11bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	This program is distributed in the hope that it will be useful,
12bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	but WITHOUT ANY WARRANTY; without even the implied warranty of
13bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	GNU General Public License for more details.
15bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
16bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	You should have received a copy of the GNU General Public License
17bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	along with this program; if not, write to the Free Software
18bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham*/
20bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu 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
34bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham#include "mantis_common.h"
358ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham#include "mantis_link.h" /* temporary due to physical layer stuff */
36b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_reg.h"
378ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
388ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham/*
398ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * If Slot state is already PLUG_IN event and we are called
408ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * again, definitely it is jitter alone
418ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham */
428ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abrahamvoid mantis_event_cam_plugin(struct mantis_ca *ca)
438ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham{
448ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	struct mantis_pci *mantis = ca->ca_priv;
458ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
468ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	u32 gpif_irqcfg;
478ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
488ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	if (ca->slot_state == MODULE_XTRACTED) {
49b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
508ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(50);
518ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(0xda000000, MANTIS_CARD_RESET);
528ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
538ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg |= MANTIS_MASK_PLUGOUT;
548ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg &= ~MANTIS_MASK_PLUGIN;
558ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
568ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(500);
578ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_INSERTED;
588ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	}
598ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	udelay(100);
608ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham}
618ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
628ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham/*
638ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * If Slot state is already UN_PLUG event and we are called
648ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * again, definitely it is jitter alone
658ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham */
668ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abrahamvoid mantis_event_cam_unplug(struct mantis_ca *ca)
678ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham{
688ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	struct mantis_pci *mantis = ca->ca_priv;
698ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
708ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	u32 gpif_irqcfg;
718ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
728ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	if (ca->slot_state == MODULE_INSERTED) {
73b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
748ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(50);
758ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(0x00da0000, MANTIS_CARD_RESET);
768ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
778ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg |= MANTIS_MASK_PLUGIN;
788ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg &= ~MANTIS_MASK_PLUGOUT;
798ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
808ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(500);
818ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_XTRACTED;
828ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	}
838ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	udelay(100);
848ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham}
85bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
86bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abrahamint mantis_pcmcia_init(struct mantis_ca *ca)
87bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham{
88bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	struct mantis_pci *mantis = ca->ca_priv;
89bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
908ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	u32 gpif_stat, card_stat;
918ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
92d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ0, MANTIS_INT_MASK);
938ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	gpif_stat = mmread(MANTIS_GPIF_STATUS);
948ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	card_stat = mmread(MANTIS_GPIF_IRQCFG);
958ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
968ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
97b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
988ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
998ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_INSERTED;
10086c75c5c2b9318f4b3218615ada18badabd3f166Sigmund Augdal		dvb_ca_en50221_camchange_irq(&ca->en50221,
10186c75c5c2b9318f4b3218615ada18badabd3f166Sigmund Augdal					     0,
10286c75c5c2b9318f4b3218615ada18badabd3f166Sigmund Augdal					     DVB_CA_EN50221_CAMCHANGE_INSERTED);
1038ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	} else {
104b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
1058ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
1068ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_XTRACTED;
10788a6fa9dfec0a585409acbb49a7f86a933b35d2bManu Abraham		dvb_ca_en50221_camchange_irq(&ca->en50221,
10888a6fa9dfec0a585409acbb49a7f86a933b35d2bManu Abraham					     0,
10988a6fa9dfec0a585409acbb49a7f86a933b35d2bManu Abraham					     DVB_CA_EN50221_CAMCHANGE_REMOVED);
1108ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	}
1118ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
112bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	return 0;
113bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham}
114bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
115bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abrahamvoid mantis_pcmcia_exit(struct mantis_ca *ca)
116bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham{
117bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	struct mantis_pci *mantis = ca->ca_priv;
118bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
1198ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	mmwrite(mmread(MANTIS_GPIF_STATUS) & (~MANTIS_CARD_PLUGOUT | ~MANTIS_CARD_PLUGIN), MANTIS_GPIF_STATUS);
1208ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	mmwrite(mmread(MANTIS_INT_MASK) & ~MANTIS_INT_IRQ0, MANTIS_INT_MASK);
121bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham}
122