1 /* $Id: teles3c.c,v 1.3 1998/11/15 23:55:27 keil Exp $
3 * teles3c.c low level stuff for teles 16.3c
5 * Author Karsten Keil (keil@isdn4linux.de)
9 * Revision 1.3 1998/11/15 23:55:27 keil
12 * Revision 1.2 1998/02/02 13:27:07 keil
19 #define __NO_VERSION__
21 #include "hfc_2bds0.h"
24 extern const char *CardType
[];
26 const char *teles163c_revision
= "$Revision: 1.3 $";
29 t163c_interrupt(int intno
, void *dev_id
, struct pt_regs
*regs
)
31 struct IsdnCardState
*cs
= dev_id
;
35 printk(KERN_WARNING
"teles3c: Spurious interrupt!\n");
38 if ((HFCD_ANYINT
| HFCD_BUSY_NBUSY
) &
39 (stat
= cs
->BC_Read_Reg(cs
, HFCD_DATA
, HFCD_STAT
))) {
40 val
= cs
->BC_Read_Reg(cs
, HFCD_DATA
, HFCD_INT_S1
);
41 if (cs
->debug
& L1_DEB_ISAC
)
42 debugl1(cs
, "teles3c: stat(%02x) s1(%02x)", stat
, val
);
43 hfc2bds0_interrupt(cs
, val
);
45 if (cs
->debug
& L1_DEB_ISAC
)
46 debugl1(cs
, "teles3c: irq_no_irq stat(%02x)", stat
);
51 t163c_Timer(struct IsdnCardState
*cs
)
53 cs
->hw
.hfcD
.timer
.expires
= jiffies
+ 75;
55 /* WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt | 0x80);
56 add_timer(&cs->hw.hfcD.timer);
61 release_io_t163c(struct IsdnCardState
*cs
)
64 del_timer(&cs
->hw
.hfcD
.timer
);
66 release_region(cs
->hw
.hfcD
.addr
, 2);
70 reset_t163c(struct IsdnCardState
*cs
)
74 printk(KERN_INFO
"teles3c: resetting card\n");
75 cs
->hw
.hfcD
.cirm
= HFCD_RESET
| HFCD_MEM8K
;
76 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_CIRM
, cs
->hw
.hfcD
.cirm
); /* Reset On */
79 current
->state
= TASK_INTERRUPTIBLE
;
81 cs
->hw
.hfcD
.cirm
= HFCD_MEM8K
;
82 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_CIRM
, cs
->hw
.hfcD
.cirm
); /* Reset Off */
83 current
->state
= TASK_INTERRUPTIBLE
;
85 cs
->hw
.hfcD
.cirm
|= HFCD_INTB
;
86 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_CIRM
, cs
->hw
.hfcD
.cirm
); /* INT B */
87 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_CLKDEL
, 0x0e);
88 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_TEST
, HFCD_AUTO_AWAKE
); /* S/T Auto awake */
89 cs
->hw
.hfcD
.ctmt
= HFCD_TIM25
| HFCD_AUTO_TIMER
;
90 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_CTMT
, cs
->hw
.hfcD
.ctmt
);
91 cs
->hw
.hfcD
.int_m2
= HFCD_IRQ_ENABLE
;
92 cs
->hw
.hfcD
.int_m1
= HFCD_INTS_B1TRANS
| HFCD_INTS_B2TRANS
|
93 HFCD_INTS_DTRANS
| HFCD_INTS_B1REC
| HFCD_INTS_B2REC
|
94 HFCD_INTS_DREC
| HFCD_INTS_L1STATE
;
95 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_INT_M1
, cs
->hw
.hfcD
.int_m1
);
96 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_INT_M2
, cs
->hw
.hfcD
.int_m2
);
97 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_STATES
, HFCD_LOAD_STATE
| 2); /* HFC ST 2 */
99 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_STATES
, 2); /* HFC ST 2 */
100 cs
->hw
.hfcD
.mst_m
= 0;
101 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_MST_MODE
, HFCD_MASTER
); /* HFC Master */
102 cs
->hw
.hfcD
.sctrl
= 0;
103 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_SCTRL
, cs
->hw
.hfcD
.sctrl
);
104 restore_flags(flags
);
108 t163c_card_msg(struct IsdnCardState
*cs
, int mt
, void *arg
)
112 if (cs
->debug
& L1_DEB_ISAC
)
113 debugl1(cs
, "teles3c: card_msg %x", mt
);
119 release_io_t163c(cs
);
122 cs
->hw
.hfcD
.timer
.expires
= jiffies
+ 75;
123 add_timer(&cs
->hw
.hfcD
.timer
);
124 return(request_irq(cs
->irq
, &t163c_interrupt
,
125 I4L_IRQ_FLAG
, "HiSax", cs
));
130 current
->state
= TASK_INTERRUPTIBLE
;
131 schedule_timeout((80*HZ
)/1000);
132 cs
->hw
.hfcD
.ctmt
|= HFCD_TIM800
;
133 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_CTMT
, cs
->hw
.hfcD
.ctmt
);
134 cs
->BC_Write_Reg(cs
, HFCD_DATA
, HFCD_MST_MODE
, cs
->hw
.hfcD
.mst_m
);
135 restore_flags(flags
);
144 setup_t163c(struct IsdnCard
*card
)
146 struct IsdnCardState
*cs
= card
->cs
;
149 strcpy(tmp
, teles163c_revision
);
150 printk(KERN_INFO
"HiSax: Teles 16.3c driver Rev. %s\n", HiSax_getrev(tmp
));
151 if (cs
->typ
!= ISDN_CTYPE_TELES3C
)
154 cs
->hw
.hfcD
.addr
= card
->para
[1] & 0xfffe;
155 cs
->irq
= card
->para
[0];
157 cs
->hw
.hfcD
.int_s1
= 0;
158 cs
->hw
.hfcD
.send
= NULL
;
159 cs
->bcs
[0].hw
.hfc
.send
= NULL
;
160 cs
->bcs
[1].hw
.hfc
.send
= NULL
;
161 cs
->hw
.hfcD
.bfifosize
= 1024 + 512;
162 cs
->hw
.hfcD
.dfifosize
= 512;
164 cs
->hw
.hfcD
.fifo
= 255;
165 if (check_region((cs
->hw
.hfcD
.addr
), 2)) {
167 "HiSax: %s config port %x-%x already in use\n",
170 cs
->hw
.hfcD
.addr
+ 2);
173 request_region(cs
->hw
.hfcD
.addr
, 2, "teles3c isdn");
175 /* Teles 16.3c IO ADR is 0x200 | YY0U (YY Bit 15/14 address) */
176 outb(0x00, cs
->hw
.hfcD
.addr
);
177 outb(0x56, cs
->hw
.hfcD
.addr
| 1);
179 "teles3c: defined at 0x%x IRQ %d HZ %d\n",
184 cs
->hw
.hfcD
.timer
.function
= (void *) t163c_Timer
;
185 cs
->hw
.hfcD
.timer
.data
= (long) cs
;
186 init_timer(&cs
->hw
.hfcD
.timer
);
188 cs
->cardmsg
= &t163c_card_msg
;