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