11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* $Id: hfcscard.c,v 1.10.2.4 2004/01/14 16:04:48 keil Exp $ 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * low level stuff for hfcs based cards (Teles3c, ACER P10) 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author Karsten Keil 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright by Karsten Keil <keil@isdn4linux.de> 7475be4d85a274d0961593db41cf85689db1d583cJoe Perches * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/isapnp.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hisax.h" 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hfc_2bds0.h" 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "isdnl1.h" 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *hfcs_revision = "$Revision: 1.10.2.4 $"; 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic irqreturn_t 227d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellshfcs_interrupt(int intno, void *dev_id) 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct IsdnCardState *cs = dev_id; 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_char val, stat; 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_long flags; 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_lock_irqsave(&cs->lock, flags); 29475be4d85a274d0961593db41cf85689db1d583cJoe Perches if ((HFCD_ANYINT | HFCD_BUSY_NBUSY) & 30475be4d85a274d0961593db41cf85689db1d583cJoe Perches (stat = cs->BC_Read_Reg(cs, HFCD_DATA, HFCD_STAT))) { 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds val = cs->BC_Read_Reg(cs, HFCD_DATA, HFCD_INT_S1); 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->debug & L1_DEB_ISAC) 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds debugl1(cs, "HFCS: stat(%02x) s1(%02x)", stat, val); 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hfc2bds0_interrupt(cs, val); 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->debug & L1_DEB_ISAC) 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds debugl1(cs, "HFCS: irq_no_irq stat(%02x)", stat); 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_unlock_irqrestore(&cs->lock, flags); 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return IRQ_HANDLED; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldshfcs_Timer(struct IsdnCardState *cs) 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.timer.expires = jiffies + 75; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* WD RESET */ 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt | 0x80); 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds add_timer(&cs->hw.hfcD.timer); 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 53672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunkstatic void 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsrelease_io_hfcs(struct IsdnCardState *cs) 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds release2bds0(cs); 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds del_timer(&cs->hw.hfcD.timer); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->hw.hfcD.addr) 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds release_region(cs->hw.hfcD.addr, 2); 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsreset_hfcs(struct IsdnCardState *cs) 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "HFCS: resetting card\n"); 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cirm = HFCD_RESET; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->typ == ISDN_CTYPE_TELES3C) 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cirm |= HFCD_MEM8K; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CIRM, cs->hw.hfcD.cirm); /* Reset On */ 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(10); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cirm = 0; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->typ == ISDN_CTYPE_TELES3C) 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cirm |= HFCD_MEM8K; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CIRM, cs->hw.hfcD.cirm); /* Reset Off */ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(10); 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->typ == ISDN_CTYPE_TELES3C) 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cirm |= HFCD_INTB; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (cs->typ == ISDN_CTYPE_ACERP10) 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cirm |= HFCD_INTA; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CIRM, cs->hw.hfcD.cirm); 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CLKDEL, 0x0e); 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_TEST, HFCD_AUTO_AWAKE); /* S/T Auto awake */ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.ctmt = HFCD_TIM25 | HFCD_AUTO_TIMER; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.int_m2 = HFCD_IRQ_ENABLE; 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.int_m1 = HFCD_INTS_B1TRANS | HFCD_INTS_B2TRANS | 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds HFCD_INTS_DTRANS | HFCD_INTS_B1REC | HFCD_INTS_B2REC | 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds HFCD_INTS_DREC | HFCD_INTS_L1STATE; 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_INT_M1, cs->hw.hfcD.int_m1); 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_INT_M2, cs->hw.hfcD.int_m2); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_STATES, HFCD_LOAD_STATE | 2); /* HFC ST 2 */ 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(10); 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_STATES, 2); /* HFC ST 2 */ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.mst_m = HFCD_MASTER; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_MST_MODE, cs->hw.hfcD.mst_m); /* HFC Master */ 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.sctrl = 0; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_SCTRL, cs->hw.hfcD.sctrl); 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldshfcs_card_msg(struct IsdnCardState *cs, int mt, void *arg) 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_long flags; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int delay; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->debug & L1_DEB_ISAC) 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds debugl1(cs, "HFCS: card_msg %x", mt); 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (mt) { 109475be4d85a274d0961593db41cf85689db1d583cJoe Perches case CARD_RESET: 110475be4d85a274d0961593db41cf85689db1d583cJoe Perches spin_lock_irqsave(&cs->lock, flags); 111475be4d85a274d0961593db41cf85689db1d583cJoe Perches reset_hfcs(cs); 112475be4d85a274d0961593db41cf85689db1d583cJoe Perches spin_unlock_irqrestore(&cs->lock, flags); 113475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 114475be4d85a274d0961593db41cf85689db1d583cJoe Perches case CARD_RELEASE: 115475be4d85a274d0961593db41cf85689db1d583cJoe Perches release_io_hfcs(cs); 116475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 117475be4d85a274d0961593db41cf85689db1d583cJoe Perches case CARD_INIT: 118475be4d85a274d0961593db41cf85689db1d583cJoe Perches delay = (75 * HZ) / 100 + 1; 119475be4d85a274d0961593db41cf85689db1d583cJoe Perches mod_timer(&cs->hw.hfcD.timer, jiffies + delay); 120475be4d85a274d0961593db41cf85689db1d583cJoe Perches spin_lock_irqsave(&cs->lock, flags); 121475be4d85a274d0961593db41cf85689db1d583cJoe Perches reset_hfcs(cs); 122475be4d85a274d0961593db41cf85689db1d583cJoe Perches init2bds0(cs); 123475be4d85a274d0961593db41cf85689db1d583cJoe Perches spin_unlock_irqrestore(&cs->lock, flags); 124475be4d85a274d0961593db41cf85689db1d583cJoe Perches delay = (80 * HZ) / 1000 + 1; 125475be4d85a274d0961593db41cf85689db1d583cJoe Perches msleep(80); 126475be4d85a274d0961593db41cf85689db1d583cJoe Perches spin_lock_irqsave(&cs->lock, flags); 127475be4d85a274d0961593db41cf85689db1d583cJoe Perches cs->hw.hfcD.ctmt |= HFCD_TIM800; 128475be4d85a274d0961593db41cf85689db1d583cJoe Perches cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt); 129475be4d85a274d0961593db41cf85689db1d583cJoe Perches cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_MST_MODE, cs->hw.hfcD.mst_m); 130475be4d85a274d0961593db41cf85689db1d583cJoe Perches spin_unlock_irqrestore(&cs->lock, flags); 131475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 132475be4d85a274d0961593db41cf85689db1d583cJoe Perches case CARD_TEST: 133475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 135475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __ISAPNP__ 13967eb5db5874076db01febed5a1a9281628fa9fb4Karsten Keilstatic struct isapnp_device_id hfc_ids[] __devinitdata = { 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114), 141475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114), 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "Acer P10" }, 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002), 144475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002), 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "Billion 2" }, 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001), 147475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001), 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "Billion 1" }, 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410), 150475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410), 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "IStar PnP" }, 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610), 153475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610), 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "Teles 16.3c" }, 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001), 156475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001), 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "Tornado Tipa C" }, 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001), 159475be4d85a274d0961593db41cf85689db1d583cJoe Perches ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001), 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (unsigned long) "Genius Speed Surfer" }, 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0, } 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16467eb5db5874076db01febed5a1a9281628fa9fb4Karsten Keilstatic struct isapnp_device_id *ipid __devinitdata = &hfc_ids[0]; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pnp_card *pnp_c __devinitdata = NULL; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16867eb5db5874076db01febed5a1a9281628fa9fb4Karsten Keilint __devinit 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssetup_hfcs(struct IsdnCard *card) 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct IsdnCardState *cs = card->cs; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char tmp[64]; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(tmp, hfcs_revision); 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "HiSax: HFC-S driver Rev. %s\n", HiSax_getrev(tmp)); 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __ISAPNP__ 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!card->para[1] && isapnp_present()) { 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pnp_dev *pnp_d; 180475be4d85a274d0961593db41cf85689db1d583cJoe Perches while (ipid->card_vendor) { 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((pnp_c = pnp_find_card(ipid->card_vendor, 182475be4d85a274d0961593db41cf85689db1d583cJoe Perches ipid->card_device, pnp_c))) { 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pnp_d = NULL; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((pnp_d = pnp_find_dev(pnp_c, 185475be4d85a274d0961593db41cf85689db1d583cJoe Perches ipid->vendor, ipid->function, pnp_d))) { 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "HiSax: %s detected\n", 189475be4d85a274d0961593db41cf85689db1d583cJoe Perches (char *)ipid->driver_data); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pnp_disable_dev(pnp_d); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = pnp_activate_dev(pnp_d); 192475be4d85a274d0961593db41cf85689db1d583cJoe Perches if (err < 0) { 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n", 194475be4d85a274d0961593db41cf85689db1d583cJoe Perches __func__, err); 195475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->para[1] = pnp_port_start(pnp_d, 0); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->para[0] = pnp_irq(pnp_d, 0); 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!card->para[0] || !card->para[1]) { 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n", 201475be4d85a274d0961593db41cf85689db1d583cJoe Perches card->para[0], card->para[1]); 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pnp_disable_dev(pnp_d); 203475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR "HFC PnP: PnP error card found, no device\n"); 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ipid++; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pnp_c = NULL; 212475be4d85a274d0961593db41cf85689db1d583cJoe Perches } 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ipid->card_vendor) { 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "HFC PnP: no ISAPnP card found\n"); 215475be4d85a274d0961593db41cf85689db1d583cJoe Perches return (0); 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.addr = card->para[1] & 0xfffe; 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->irq = card->para[0]; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.cip = 0; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.int_s1 = 0; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.send = NULL; 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->bcs[0].hw.hfc.send = NULL; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->bcs[1].hw.hfc.send = NULL; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.dfifosize = 512; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->dc.hfcd.ph_state = 0; 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.fifo = 255; 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->typ == ISDN_CTYPE_TELES3C) { 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.bfifosize = 1024 + 512; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (cs->typ == ISDN_CTYPE_ACERP10) { 232475be4d85a274d0961593db41cf85689db1d583cJoe Perches cs->hw.hfcD.bfifosize = 7 * 1024 + 512; 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (0); 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!request_region(cs->hw.hfcD.addr, 2, "HFCS isdn")) { 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_WARNING 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "HiSax: %s config port %x-%x already in use\n", 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds CardType[card->typ], 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.addr, 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.addr + 2); 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (0); 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "HFCS: defined at 0x%x IRQ %d HZ %d\n", 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.addr, 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->irq, HZ); 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cs->typ == ISDN_CTYPE_TELES3C) { 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Teles 16.3c IO ADR is 0x200 | YY0U (YY Bit 15/14 address) */ 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(0x00, cs->hw.hfcD.addr); 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(0x56, cs->hw.hfcD.addr | 1); 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (cs->typ == ISDN_CTYPE_ACERP10) { 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Acer P10 IO ADR is 0x300 */ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(0x00, cs->hw.hfcD.addr); 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(0x57, cs->hw.hfcD.addr | 1); 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds set_cs_func(cs); 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.timer.function = (void *) hfcs_Timer; 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->hw.hfcD.timer.data = (long) cs; 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds init_timer(&cs->hw.hfcD.timer); 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->cardmsg = &hfcs_card_msg; 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cs->irq_func = &hfcs_interrupt; 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (1); 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 264