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