20 #include <linux/pci.h>
22 static const char *telespci_revision =
"$Revision: 2.23.2.3 $";
24 #define ZORAN_PO_RQ_PEN 0x02000000
25 #define ZORAN_PO_WR 0x00800000
26 #define ZORAN_PO_GID0 0x00000000
27 #define ZORAN_PO_GID1 0x00100000
28 #define ZORAN_PO_GREG0 0x00000000
29 #define ZORAN_PO_GREG1 0x00010000
30 #define ZORAN_PO_DMASK 0xFF
32 #define WRITE_ADDR_ISAC (ZORAN_PO_WR | ZORAN_PO_GID0 | ZORAN_PO_GREG0)
33 #define READ_DATA_ISAC (ZORAN_PO_GID0 | ZORAN_PO_GREG1)
34 #define WRITE_DATA_ISAC (ZORAN_PO_WR | ZORAN_PO_GID0 | ZORAN_PO_GREG1)
35 #define WRITE_ADDR_HSCX (ZORAN_PO_WR | ZORAN_PO_GID1 | ZORAN_PO_GREG0)
36 #define READ_DATA_HSCX (ZORAN_PO_GID1 | ZORAN_PO_GREG1)
37 #define WRITE_DATA_HSCX (ZORAN_PO_WR | ZORAN_PO_GID1 | ZORAN_PO_GREG1)
39 #define ZORAN_WAIT_NOBUSY do { \
40 portdata = readl(adr + 0x200); \
41 } while (portdata & ZORAN_PO_RQ_PEN)
46 register unsigned int portdata;
63 register unsigned int portdata;
79 register unsigned int portdata;
95 register unsigned int portdata;
110 register unsigned int portdata;
115 for (i = 0; i <
size; i++) {
128 register unsigned int portdata;
133 for (i = 0; i <
size; i++) {
143 read_fifo_hscx(
void __iomem *adr,
int hscx,
u_char *data,
int size)
145 register unsigned int portdata;
150 for (i = 0; i <
size; i++) {
161 write_fifo_hscx(
void __iomem *adr,
int hscx,
u_char *data,
int size)
163 unsigned int portdata;
168 for (i = 0; i <
size; i++) {
183 return (readisac(cs->hw.teles0.membase, offset));
189 writeisac(cs->hw.teles0.membase, offset, value);
193 ReadISACfifo(
struct IsdnCardState *cs,
u_char *data,
int size)
195 read_fifo_isac(cs->hw.teles0.membase, data, size);
199 WriteISACfifo(
struct IsdnCardState *cs,
u_char *data,
int size)
201 write_fifo_isac(cs->hw.teles0.membase, data, size);
207 return (readhscx(cs->hw.teles0.membase, hscx, offset));
213 writehscx(cs->hw.teles0.membase, hscx, offset, value);
220 #define READHSCX(cs, nr, reg) readhscx(cs->hw.teles0.membase, nr, reg)
221 #define WRITEHSCX(cs, nr, reg, data) writehscx(cs->hw.teles0.membase, nr, reg, data)
222 #define READHSCXFIFO(cs, nr, ptr, cnt) read_fifo_hscx(cs->hw.teles0.membase, nr, ptr, cnt)
223 #define WRITEHSCXFIFO(cs, nr, ptr, cnt) write_fifo_hscx(cs->hw.teles0.membase, nr, ptr, cnt)
228 telespci_interrupt(
int intno,
void *
dev_id)
230 struct IsdnCardState *cs =
dev_id;
235 hval = readhscx(cs->hw.teles0.membase, 1,
HSCX_ISTA);
237 hscx_int_main(cs, hval);
238 ival = readisac(cs->hw.teles0.membase,
ISAC_ISTA);
239 if ((hval | ival) == 0) {
240 spin_unlock_irqrestore(&cs->lock, flags);
246 writel(0x70000000, cs->hw.teles0.membase + 0x3C);
248 writehscx(cs->hw.teles0.membase, 0,
HSCX_MASK, 0xFF);
249 writehscx(cs->hw.teles0.membase, 1,
HSCX_MASK, 0xFF);
250 writeisac(cs->hw.teles0.membase,
ISAC_MASK, 0xFF);
251 writeisac(cs->hw.teles0.membase,
ISAC_MASK, 0x0);
252 writehscx(cs->hw.teles0.membase, 0,
HSCX_MASK, 0x0);
253 writehscx(cs->hw.teles0.membase, 1,
HSCX_MASK, 0x0);
254 spin_unlock_irqrestore(&cs->lock, flags);
259 release_io_telespci(
struct IsdnCardState *cs)
261 iounmap(cs->hw.teles0.membase);
265 TelesPCI_card_msg(
struct IsdnCardState *cs,
int mt,
void *
arg)
273 release_io_telespci(cs);
278 spin_unlock_irqrestore(&cs->lock, flags);
291 struct IsdnCardState *cs = card->
cs;
295 #error "not running on big endian machines now"
298 strcpy(tmp, telespci_revision);
306 cs->irq = dev_tel->irq;
322 writel(0x00000000, cs->hw.teles0.membase + 0x28);
323 writel(0x01000000, cs->hw.teles0.membase + 0x28);
324 writel(0x01000000, cs->hw.teles0.membase + 0x28);
325 writel(0x7BFFFFFF, cs->hw.teles0.membase + 0x2C);
326 writel(0x70000000, cs->hw.teles0.membase + 0x3C);
327 writel(0x61000000, cs->hw.teles0.membase + 0x40);
331 "HiSax: Teles PCI config irq:%d mem:%p\n",
333 cs->hw.teles0.membase);
338 cs->readisacfifo = &ReadISACfifo;
339 cs->writeisacfifo = &WriteISACfifo;
342 cs->BC_Send_Data = &hscx_fill_fifo;
343 cs->cardmsg = &TelesPCI_card_msg;
344 cs->irq_func = &telespci_interrupt;
349 "TelesPCI: wrong HSCX versions check IO/MEM addresses\n");
350 release_io_telespci(cs);