2009-12-04 05:03:35 -03:00
/*
Mantis PCI bridge driver
2009-12-15 09:13:49 -03:00
Copyright ( C ) Manu Abraham ( abraham . manu @ gmail . com )
2009-12-04 05:03:35 -03:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2009-12-04 05:41:11 -03:00
# include <linux/kernel.h>
# include <linux/signal.h>
# include <linux/sched.h>
# include <linux/interrupt.h>
# include "dmxdev.h"
# include "dvbdev.h"
# include "dvb_demux.h"
# include "dvb_frontend.h"
# include "dvb_net.h"
2009-12-04 05:03:35 -03:00
# include "mantis_common.h"
2009-12-04 05:06:00 -03:00
# include "mantis_link.h" /* temporary due to physical layer stuff */
2009-12-04 05:41:11 -03:00
# include "mantis_reg.h"
2009-12-04 05:06:00 -03:00
/*
* If Slot state is already PLUG_IN event and we are called
* again , definitely it is jitter alone
*/
void mantis_event_cam_plugin ( struct mantis_ca * ca )
{
struct mantis_pci * mantis = ca - > ca_priv ;
u32 gpif_irqcfg ;
if ( ca - > slot_state = = MODULE_XTRACTED ) {
2009-12-04 05:41:11 -03:00
dprintk ( MANTIS_DEBUG , 1 , " Event: CAM Plugged IN: Adapter(%d) Slot(0) " , mantis - > num ) ;
2009-12-04 05:06:00 -03:00
udelay ( 50 ) ;
mmwrite ( 0xda000000 , MANTIS_CARD_RESET ) ;
gpif_irqcfg = mmread ( MANTIS_GPIF_IRQCFG ) ;
gpif_irqcfg | = MANTIS_MASK_PLUGOUT ;
gpif_irqcfg & = ~ MANTIS_MASK_PLUGIN ;
mmwrite ( gpif_irqcfg , MANTIS_GPIF_IRQCFG ) ;
udelay ( 500 ) ;
ca - > slot_state = MODULE_INSERTED ;
}
udelay ( 100 ) ;
}
/*
* If Slot state is already UN_PLUG event and we are called
* again , definitely it is jitter alone
*/
void mantis_event_cam_unplug ( struct mantis_ca * ca )
{
struct mantis_pci * mantis = ca - > ca_priv ;
u32 gpif_irqcfg ;
if ( ca - > slot_state = = MODULE_INSERTED ) {
2009-12-04 05:41:11 -03:00
dprintk ( MANTIS_DEBUG , 1 , " Event: CAM Unplugged: Adapter(%d) Slot(0) " , mantis - > num ) ;
2009-12-04 05:06:00 -03:00
udelay ( 50 ) ;
mmwrite ( 0x00da0000 , MANTIS_CARD_RESET ) ;
gpif_irqcfg = mmread ( MANTIS_GPIF_IRQCFG ) ;
gpif_irqcfg | = MANTIS_MASK_PLUGIN ;
gpif_irqcfg & = ~ MANTIS_MASK_PLUGOUT ;
mmwrite ( gpif_irqcfg , MANTIS_GPIF_IRQCFG ) ;
udelay ( 500 ) ;
ca - > slot_state = MODULE_XTRACTED ;
}
udelay ( 100 ) ;
}
2009-12-04 05:03:35 -03:00
int mantis_pcmcia_init ( struct mantis_ca * ca )
{
struct mantis_pci * mantis = ca - > ca_priv ;
2009-12-04 05:06:00 -03:00
u32 gpif_stat , card_stat ;
2009-12-04 05:07:41 -03:00
mmwrite ( mmread ( MANTIS_INT_MASK ) | MANTIS_INT_IRQ0 , MANTIS_INT_MASK ) ;
2009-12-04 05:06:00 -03:00
gpif_stat = mmread ( MANTIS_GPIF_STATUS ) ;
card_stat = mmread ( MANTIS_GPIF_IRQCFG ) ;
if ( gpif_stat & MANTIS_GPIF_DETSTAT ) {
2009-12-04 05:41:11 -03:00
dprintk ( MANTIS_DEBUG , 1 , " CAM found on Adapter(%d) Slot(0) " , mantis - > num ) ;
2009-12-04 05:06:00 -03:00
mmwrite ( card_stat | MANTIS_MASK_PLUGOUT , MANTIS_GPIF_IRQCFG ) ;
ca - > slot_state = MODULE_INSERTED ;
2009-12-04 05:21:27 -03:00
dvb_ca_en50221_camchange_irq ( & ca - > en50221 ,
0 ,
DVB_CA_EN50221_CAMCHANGE_INSERTED ) ;
2009-12-04 05:06:00 -03:00
} else {
2009-12-04 05:41:11 -03:00
dprintk ( MANTIS_DEBUG , 1 , " Empty Slot on Adapter(%d) Slot(0) " , mantis - > num ) ;
2009-12-04 05:06:00 -03:00
mmwrite ( card_stat | MANTIS_MASK_PLUGIN , MANTIS_GPIF_IRQCFG ) ;
ca - > slot_state = MODULE_XTRACTED ;
2009-12-04 05:22:33 -03:00
dvb_ca_en50221_camchange_irq ( & ca - > en50221 ,
0 ,
DVB_CA_EN50221_CAMCHANGE_REMOVED ) ;
2009-12-04 05:06:00 -03:00
}
2009-12-04 05:03:35 -03:00
return 0 ;
}
void mantis_pcmcia_exit ( struct mantis_ca * ca )
{
struct mantis_pci * mantis = ca - > ca_priv ;
2009-12-04 05:06:00 -03:00
mmwrite ( mmread ( MANTIS_GPIF_STATUS ) & ( ~ MANTIS_CARD_PLUGOUT | ~ MANTIS_CARD_PLUGIN ) , MANTIS_GPIF_STATUS ) ;
mmwrite ( mmread ( MANTIS_INT_MASK ) & ~ MANTIS_INT_IRQ0 , MANTIS_INT_MASK ) ;
2009-12-04 05:03:35 -03:00
}