diff options
Diffstat (limited to 'drivers/media/dvb/mantis/mantis_pcmcia.c')
-rw-r--r-- | drivers/media/dvb/mantis/mantis_pcmcia.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c new file mode 100644 index 00000000000..2f188c08966 --- /dev/null +++ b/drivers/media/dvb/mantis/mantis_pcmcia.c | |||
@@ -0,0 +1,121 @@ | |||
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 "dmxdev.h" | ||
29 | #include "dvbdev.h" | ||
30 | #include "dvb_demux.h" | ||
31 | #include "dvb_frontend.h" | ||
32 | #include "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 | mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ0, MANTIS_INT_MASK); | ||
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 | mmwrite(mmread(MANTIS_INT_MASK) & ~MANTIS_INT_IRQ0, MANTIS_INT_MASK); | ||
121 | } | ||