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