mantis_pcmcia.c revision 86c75c5c2b9318f4b3218615ada18badabd3f166
1bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham/*
2bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	Mantis PCI bridge driver
3bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
4bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	Copyright (C) 2005, 2006 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
21bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham#include "mantis_common.h"
228ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham#include "mantis_link.h" /* temporary due to physical layer stuff */
238ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
248ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham/*
258ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * If Slot state is already PLUG_IN event and we are called
268ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * again, definitely it is jitter alone
278ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham */
288ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abrahamvoid mantis_event_cam_plugin(struct mantis_ca *ca)
298ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham{
308ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	struct mantis_pci *mantis = ca->ca_priv;
318ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
328ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	u32 gpif_irqcfg;
338ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
348ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	if (ca->slot_state == MODULE_XTRACTED) {
35d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham		dprintk(verbose, MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
368ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(50);
378ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(0xda000000, MANTIS_CARD_RESET);
388ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
398ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg |= MANTIS_MASK_PLUGOUT;
408ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg &= ~MANTIS_MASK_PLUGIN;
418ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
428ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(500);
438ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_INSERTED;
448ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	}
458ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	udelay(100);
468ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham}
478ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
488ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham/*
498ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * If Slot state is already UN_PLUG event and we are called
508ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham * again, definitely it is jitter alone
518ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham */
528ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abrahamvoid mantis_event_cam_unplug(struct mantis_ca *ca)
538ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham{
548ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	struct mantis_pci *mantis = ca->ca_priv;
558ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
568ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	u32 gpif_irqcfg;
578ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
588ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	if (ca->slot_state == MODULE_INSERTED) {
59d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham		dprintk(verbose, MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
608ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(50);
618ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(0x00da0000, MANTIS_CARD_RESET);
628ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
638ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg |= MANTIS_MASK_PLUGIN;
648ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		gpif_irqcfg &= ~MANTIS_MASK_PLUGOUT;
658ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
668ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		udelay(500);
678ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_XTRACTED;
688ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	}
698ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	udelay(100);
708ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham}
71bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
72bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abrahamint mantis_pcmcia_init(struct mantis_ca *ca)
73bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham{
74bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	struct mantis_pci *mantis = ca->ca_priv;
75bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
768ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	u32 gpif_stat, card_stat;
778ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
78d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ0, MANTIS_INT_MASK);
798ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	gpif_stat = mmread(MANTIS_GPIF_STATUS);
808ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	card_stat = mmread(MANTIS_GPIF_IRQCFG);
818ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
828ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
83d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham		dprintk(verbose, MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
848ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
858ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_INSERTED;
8686c75c5c2b9318f4b3218615ada18badabd3f166Sigmund Augdal		dvb_ca_en50221_camchange_irq(&ca->en50221,
8786c75c5c2b9318f4b3218615ada18badabd3f166Sigmund Augdal					     0,
8886c75c5c2b9318f4b3218615ada18badabd3f166Sigmund Augdal					     DVB_CA_EN50221_CAMCHANGE_INSERTED);
898ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	} else {
90d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham		dprintk(verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
918ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
928ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham		ca->slot_state = MODULE_XTRACTED;
938ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	}
948ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham
95bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	return 0;
96bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham}
97bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
98bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abrahamvoid mantis_pcmcia_exit(struct mantis_ca *ca)
99bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham{
100bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham	struct mantis_pci *mantis = ca->ca_priv;
101bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham
1028ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	mmwrite(mmread(MANTIS_GPIF_STATUS) & (~MANTIS_CARD_PLUGOUT | ~MANTIS_CARD_PLUGIN), MANTIS_GPIF_STATUS);
1038ce571f5e7eb7186f676af3b60af7980c2fc7929Manu Abraham	mmwrite(mmread(MANTIS_INT_MASK) & ~MANTIS_INT_IRQ0, MANTIS_INT_MASK);
104bc4ed42fdf762a2049b255de92626ad1cfd86d8eManu Abraham}
105