static u_char ReadISAC(struct IsdnCardState *cs, u_char offset) { u_short off2 = offset; switch (cs->subtyp) { case R647: off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf)); case R685: return (readreg(cs->hw.gazel.isac, off2)); case R753: case R742: return (readreg_ipac(cs->hw.gazel.ipac, 0x80 + off2)); } return 0; }
static u_char ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset) { u_short off2 = offset; switch (cs->subtyp) { case R647: off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf)); case R685: return (readreg(cs->hw.gazel.hscx[hscx], off2)); case R753: case R742: return (readreg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2)); } return 0; }
static int __devinit setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs) { printk(KERN_INFO "Gazel: ISA PnP card automatic recognition\n"); // we got an irq parameter, assume it is an ISA card // R742 decodes address even in not started... // R647 returns FF if not present or not started // eventually needs improvment if (readreg_ipac(card->para[1], IPAC_ID) == 1) cs->subtyp = R742; else cs->subtyp = R647; setup_isac(cs); cs->hw.gazel.cfg_reg = card->para[1] + 0xC000; cs->hw.gazel.ipac = card->para[1]; cs->hw.gazel.isac = card->para[1] + 0x8000; cs->hw.gazel.hscx[0] = card->para[1]; cs->hw.gazel.hscx[1] = card->para[1] + 0x4000; cs->irq = card->para[0]; cs->hw.gazel.isacfifo = cs->hw.gazel.isac; cs->hw.gazel.hscxfifo[0] = cs->hw.gazel.hscx[0]; cs->hw.gazel.hscxfifo[1] = cs->hw.gazel.hscx[1]; switch (cs->subtyp) { case R647: printk(KERN_INFO "Gazel: Card ISA R647/R648 found\n"); cs->dc.isac.adf2 = 0x87; printk(KERN_INFO "Gazel: config irq:%d isac:0x%X cfg:0x%X\n", cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg); printk(KERN_INFO "Gazel: hscx A:0x%X hscx B:0x%X\n", cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]); break; case R742: printk(KERN_INFO "Gazel: Card ISA R742 found\n"); test_and_set_bit(HW_IPAC, &cs->HW_Flags); printk(KERN_INFO "Gazel: config irq:%d ipac:0x%X\n", cs->irq, cs->hw.gazel.ipac); break; } return (0); }
static int __devinit setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs) { printk(KERN_INFO "Gazel: ISA PnP card automatic recognition\n"); if (readreg_ipac(card->para[1], IPAC_ID) == 1) cs->subtyp = R742; else cs->subtyp = R647; setup_isac(cs); cs->hw.gazel.cfg_reg = card->para[1] + 0xC000; cs->hw.gazel.ipac = card->para[1]; cs->hw.gazel.isac = card->para[1] + 0x8000; cs->hw.gazel.hscx[0] = card->para[1]; cs->hw.gazel.hscx[1] = card->para[1] + 0x4000; cs->irq = card->para[0]; cs->hw.gazel.isacfifo = cs->hw.gazel.isac; cs->hw.gazel.hscxfifo[0] = cs->hw.gazel.hscx[0]; cs->hw.gazel.hscxfifo[1] = cs->hw.gazel.hscx[1]; switch (cs->subtyp) { case R647: printk(KERN_INFO "Gazel: Card ISA R647/R648 found\n"); cs->dc.isac.adf2 = 0x87; printk(KERN_INFO "Gazel: config irq:%d isac:0x%X cfg:0x%X\n", cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg); printk(KERN_INFO "Gazel: hscx A:0x%X hscx B:0x%X\n", cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]); break; case R742: printk(KERN_INFO "Gazel: Card ISA R742 found\n"); test_and_set_bit(HW_IPAC, &cs->HW_Flags); printk(KERN_INFO "Gazel: config irq:%d ipac:0x%X\n", cs->irq, cs->hw.gazel.ipac); break; } return (0); }