1d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham/* 2d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham Mantis PCI bridge driver 3d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 48825a0970cef408fb2f1a44e3cb05d6ba41a18dbManu Abraham Copyright (C) Manu Abraham (abraham.manu@gmail.com) 5d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 6d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham This program is free software; you can redistribute it and/or modify 7d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham it under the terms of the GNU General Public License as published by 8d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham the Free Software Foundation; either version 2 of the License, or 9d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham (at your option) any later version. 10d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 11d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham This program is distributed in the hope that it will be useful, 12d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham but WITHOUT ANY WARRANTY; without even the implied warranty of 13d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham GNU General Public License for more details. 15d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 16d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham You should have received a copy of the GNU General Public License 17d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham along with this program; if not, write to the Free Software 18d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham*/ 20d575571e8eda92c2cfd727ef050d17e30878fee6Manu 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 34d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham#include "mantis_common.h" 35d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham#include "mantis_link.h" 36fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham#include "mantis_hif.h" 37b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_reg.h" 38fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 3912855cac87218d0c92ffdebb7270cec040cf5a6aManu Abrahamstatic void mantis_hifevm_work(struct work_struct *work) 40fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham{ 4112855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham struct mantis_ca *ca = container_of(work, struct mantis_ca, hif_evm_work); 42fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham struct mantis_pci *mantis = ca->ca_priv; 43fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 4417b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham u32 gpif_stat, gpif_mask; 45fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 46fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham gpif_stat = mmread(MANTIS_GPIF_STATUS); 473062b1571a1d3520c4d3160ebbfca8002b1d6963Manu Abraham gpif_mask = mmread(MANTIS_GPIF_IRQCFG); 48fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 49fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_GPIF_DETSTAT) { 50fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_CARD_PLUGIN) { 51b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num); 52fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham mmwrite(0xdada0000, MANTIS_CARD_RESET); 5312855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham mantis_event_cam_plugin(ca); 5405691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham dvb_ca_en50221_camchange_irq(&ca->en50221, 5505691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham 0, 5605691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham DVB_CA_EN50221_CAMCHANGE_INSERTED); 57fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham } 58fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham } else { 59fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_CARD_PLUGOUT) { 60b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num); 61fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham mmwrite(0xdada0000, MANTIS_CARD_RESET); 6212855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham mantis_event_cam_unplug(ca); 6305691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham dvb_ca_en50221_camchange_irq(&ca->en50221, 6405691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham 0, 6505691cdbf479282e3d3c2e3386cb865cbf611e3aManu Abraham DVB_CA_EN50221_CAMCHANGE_REMOVED); 66fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham } 67fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham } 68fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 6917b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham if (mantis->gpif_status & MANTIS_GPIF_EXTIRQ) 70b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num); 71fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 7217b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham if (mantis->gpif_status & MANTIS_SBUF_WSTO) 73b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num); 74fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 7517b77fc2d404910ca691661038ceb4c02d912d16Manu Abraham if (mantis->gpif_status & MANTIS_GPIF_OTHERR) 76b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num); 77fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 78fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_SBUF_OVFLW) 79b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num); 80fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 819e49e8d913209e7221f761193f18a91d130b9e2dManu Abraham if (gpif_stat & MANTIS_GPIF_BRRDY) 82b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num); 839e49e8d913209e7221f761193f18a91d130b9e2dManu Abraham 84fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_GPIF_INTSTAT) 85b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num); 86fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 87fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_SBUF_EMPTY) 88b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num); 89fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham 90fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham if (gpif_stat & MANTIS_SBUF_OPDONE) { 91b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num); 92cc0e4aacaf4c3660fa759ce1299377baaf9efd8bManu Abraham ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL; 93c02e15150c85619f22a98675124503ed93bf1914Sigmund Augdal ca->hif_event = MANTIS_SBUF_OPDONE; 94c02e15150c85619f22a98675124503ed93bf1914Sigmund Augdal wake_up(&ca->hif_opdone_wq); 95fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham } 96fadfa070d30434dd228362c933827eb6ce137f2dManu Abraham} 97d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 98d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abrahamint mantis_evmgr_init(struct mantis_ca *ca) 99d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham{ 100d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham struct mantis_pci *mantis = ca->ca_priv; 101d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 102b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager"); 10312855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham INIT_WORK(&ca->hif_evm_work, mantis_hifevm_work); 10450d82602760c99d2c954c33360990c00146532cdManu Abraham mantis_pcmcia_init(ca); 10512855cac87218d0c92ffdebb7270cec040cf5a6aManu Abraham schedule_work(&ca->hif_evm_work); 106d8b14f8a76d71c84622a211f57baf15f61cc9703Manu Abraham mantis_hif_init(ca); 107d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham return 0; 108d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham} 109d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 110d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abrahamvoid mantis_evmgr_exit(struct mantis_ca *ca) 111d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham{ 112d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham struct mantis_pci *mantis = ca->ca_priv; 113d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham 114b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting"); 1150d9c76aedbac3ad8ac4e99a2b441bc3f91dd6679Tejun Heo flush_work_sync(&ca->hif_evm_work); 116d8b14f8a76d71c84622a211f57baf15f61cc9703Manu Abraham mantis_hif_exit(ca); 11750d82602760c99d2c954c33360990c00146532cdManu Abraham mantis_pcmcia_exit(ca); 118d575571e8eda92c2cfd727ef050d17e30878fee6Manu Abraham} 119