1 /* 2 Mantis PCI bridge driver 3 4 Copyright (C) Manu Abraham (abraham.manu@gmail.com) 5 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. 10 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. 15 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. 19 */ 20 21 #include <linux/kernel.h> 22 23 #include <linux/signal.h> 24 #include <linux/sched.h> 25 #include <linux/interrupt.h> 26 #include <asm/io.h> 27 28 #include <media/dmxdev.h> 29 #include <media/dvbdev.h> 30 #include <media/dvb_demux.h> 31 #include <media/dvb_frontend.h> 32 #include <media/dvb_net.h> 33 34 #include "mantis_common.h" 35 #include "mantis_link.h" /* temporary due to physical layer stuff */ 36 #include "mantis_reg.h" 37 38 /* 39 * If Slot state is already PLUG_IN event and we are called 40 * again, definitely it is jitter alone 41 */ 42 void mantis_event_cam_plugin(struct mantis_ca *ca) 43 { 44 struct mantis_pci *mantis = ca->ca_priv; 45 46 u32 gpif_irqcfg; 47 48 if (ca->slot_state == MODULE_XTRACTED) { 49 dprintk(MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num); 50 udelay(50); 51 mmwrite(0xda000000, MANTIS_CARD_RESET); 52 gpif_irqcfg = mmread(MANTIS_GPIF_IRQCFG); 53 gpif_irqcfg |= MANTIS_MASK_PLUGOUT; 54 gpif_irqcfg &= ~MANTIS_MASK_PLUGIN; 55 mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG); 56 udelay(500); 57 ca->slot_state = MODULE_INSERTED; 58 } 59 udelay(100); 60 } 61 62 /* 63 * If Slot state is already UN_PLUG event and we are called 64 * again, definitely it is jitter alone 65 */ 66 void mantis_event_cam_unplug(struct mantis_ca *ca) 67 { 68 struct mantis_pci *mantis = ca->ca_priv; 69 70 u32 gpif_irqcfg; 71 72 if (ca->slot_state == MODULE_INSERTED) { 73 dprintk(MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num); 74 udelay(50); 75 mmwrite(0x00da0000, MANTIS_CARD_RESET); 76 gpif_irqcfg = mmread(MANTIS_GPIF_IRQCFG); 77 gpif_irqcfg |= MANTIS_MASK_PLUGIN; 78 gpif_irqcfg &= ~MANTIS_MASK_PLUGOUT; 79 mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG); 80 udelay(500); 81 ca->slot_state = MODULE_XTRACTED; 82 } 83 udelay(100); 84 } 85 86 int mantis_pcmcia_init(struct mantis_ca *ca) 87 { 88 struct mantis_pci *mantis = ca->ca_priv; 89 90 u32 gpif_stat, card_stat; 91 92 mantis_unmask_ints(mantis, MANTIS_INT_IRQ0); 93 gpif_stat = mmread(MANTIS_GPIF_STATUS); 94 card_stat = mmread(MANTIS_GPIF_IRQCFG); 95 96 if (gpif_stat & MANTIS_GPIF_DETSTAT) { 97 dprintk(MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num); 98 mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG); 99 ca->slot_state = MODULE_INSERTED; 100 dvb_ca_en50221_camchange_irq(&ca->en50221, 101 0, 102 DVB_CA_EN50221_CAMCHANGE_INSERTED); 103 } else { 104 dprintk(MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num); 105 mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG); 106 ca->slot_state = MODULE_XTRACTED; 107 dvb_ca_en50221_camchange_irq(&ca->en50221, 108 0, 109 DVB_CA_EN50221_CAMCHANGE_REMOVED); 110 } 111 112 return 0; 113 } 114 115 void mantis_pcmcia_exit(struct mantis_ca *ca) 116 { 117 struct mantis_pci *mantis = ca->ca_priv; 118 119 mmwrite(mmread(MANTIS_GPIF_STATUS) & (~MANTIS_CARD_PLUGOUT | ~MANTIS_CARD_PLUGIN), MANTIS_GPIF_STATUS); 120 mantis_mask_ints(mantis, MANTIS_INT_IRQ0); 121 } 122