cregit-Linux how code gets into the kernel

Release 4.7 drivers/isdn/hisax/bkm_a4t.c

/* $Id: bkm_a4t.c,v 1.22.2.4 2004/01/14 16:04:48 keil Exp $
 *
 * low level stuff for T-Berkom A4T
 *
 * Author       Roland Klabunde
 * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 *
 */


#include <linux/init.h>
#include "hisax.h"
#include "isac.h"
#include "hscx.h"
#include "jade.h"
#include "isdnl1.h"
#include <linux/pci.h>
#include "bkm_ax.h"


static const char *bkm_a4t_revision = "$Revision: 1.22.2.4 $";



static inline u_char readreg(unsigned int ale, unsigned long adr, u_char off) { register u_int ret; unsigned int *po = (unsigned int *) adr; /* Postoffice */ *po = (GCS_2 | PO_WRITE | off); __WAITI20__(po); *po = (ale | PO_READ); __WAITI20__(po); ret = *po; return ((unsigned char) ret); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git7493.67%125.00%
andrew mortonandrew morton33.80%125.00%
kai germaschewskikai germaschewski11.27%125.00%
linus torvaldslinus torvalds11.27%125.00%
Total79100.00%4100.00%


static inline void readfifo(unsigned int ale, unsigned long adr, u_char off, u_char *data, int size) { int i; for (i = 0; i < size; i++) *data++ = readreg(ale, adr, off); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton3768.52%133.33%
pre-gitpre-git1629.63%133.33%
linus torvaldslinus torvalds11.85%133.33%
Total54100.00%3100.00%


static inline void writereg(unsigned int ale, unsigned long adr, u_char off, u_char data) { unsigned int *po = (unsigned int *) adr; /* Postoffice */ *po = (GCS_2 | PO_WRITE | off); __WAITI20__(po); *po = (ale | PO_WRITE | data); __WAITI20__(po); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4669.70%125.00%
andrew mortonandrew morton1827.27%125.00%
kai germaschewskikai germaschewski23.03%250.00%
Total66100.00%4100.00%


static inline void writefifo(unsigned int ale, unsigned long adr, u_char off, u_char *data, int size) { int i; for (i = 0; i < size; i++) writereg(ale, adr, off, *data++); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4888.89%125.00%
kai germaschewskikai germaschewski35.56%125.00%
andrew mortonandrew morton23.70%125.00%
linus torvaldslinus torvalds11.85%125.00%
Total54100.00%4100.00%

/* Interface functions */
static u_char ReadISAC(struct IsdnCardState *cs, u_char offset) { return (readreg(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, offset)); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git3592.11%150.00%
andrew mortonandrew morton37.89%150.00%
Total38100.00%2100.00%


static void WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value) { writereg(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, offset, value); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git3792.50%150.00%
andrew mortonandrew morton37.50%150.00%
Total40100.00%2100.00%


static void ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size) { readfifo(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, 0, data, size); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4195.35%150.00%
andrew mortonandrew morton24.65%150.00%
Total43100.00%2100.00%


static void WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size) { writefifo(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, 0, data, size); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4195.35%150.00%
andrew mortonandrew morton24.65%150.00%
Total43100.00%2100.00%


static u_char ReadJADE(struct IsdnCardState *cs, int jade, u_char offset) { return (readreg(cs->hw.ax.jade_ale, cs->hw.ax.jade_adr, offset + (jade == -1 ? 0 : (jade ? 0xC0 : 0x80)))); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git5391.38%150.00%
andrew mortonandrew morton58.62%150.00%
Total58100.00%2100.00%


static void WriteJADE(struct IsdnCardState *cs, int jade, u_char offset, u_char value) { writereg(cs->hw.ax.jade_ale, cs->hw.ax.jade_adr, offset + (jade == -1 ? 0 : (jade ? 0xC0 : 0x80)), value); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git5795.00%150.00%
andrew mortonandrew morton35.00%150.00%
Total60100.00%2100.00%

/* * fast interrupt JADE stuff goes here */ #define READJADE(cs, nr, reg) readreg(cs->hw.ax.jade_ale, \ cs->hw.ax.jade_adr, reg + (nr == -1 ? 0 : (nr ? 0xC0 : 0x80))) #define WRITEJADE(cs, nr, reg, data) writereg(cs->hw.ax.jade_ale, \ cs->hw.ax.jade_adr, reg + (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), data) #define READJADEFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ax.jade_ale, \ cs->hw.ax.jade_adr, (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), ptr, cnt) #define WRITEJADEFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.ax.jade_ale, \ cs->hw.ax.jade_adr, (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), ptr, cnt) #include "jade_irq.c"
static irqreturn_t bkm_interrupt(int intno, void *dev_id) { struct IsdnCardState *cs = dev_id; u_char val = 0; u_long flags; I20_REGISTER_FILE *pI20_Regs; spin_lock_irqsave(&cs->lock, flags); pI20_Regs = (I20_REGISTER_FILE *) (cs->hw.ax.base); /* ISDN interrupt pending? */ if (pI20_Regs->i20IntStatus & intISDN) { /* Reset the ISDN interrupt */ pI20_Regs->i20IntStatus = intISDN; /* Disable ISDN interrupt */ pI20_Regs->i20IntCtrl &= ~intISDN; /* Channel A first */ val = readreg(cs->hw.ax.jade_ale, cs->hw.ax.jade_adr, jade_HDLC_ISR + 0x80); if (val) { jade_int_main(cs, val, 0); } /* Channel B */ val = readreg(cs->hw.ax.jade_ale, cs->hw.ax.jade_adr, jade_HDLC_ISR + 0xC0); if (val) { jade_int_main(cs, val, 1); } /* D-Channel */ val = readreg(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, ISAC_ISTA); if (val) { isac_interrupt(cs, val); } /* Reenable ISDN interrupt */ pI20_Regs->i20IntCtrl |= intISDN; spin_unlock_irqrestore(&cs->lock, flags); return IRQ_HANDLED; } else { spin_unlock_irqrestore(&cs->lock, flags); return IRQ_NONE; } }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git16167.36%120.00%
andrew mortonandrew morton6728.03%240.00%
kai germaschewskikai germaschewski114.60%240.00%
Total239100.00%5100.00%


static void release_io_bkm(struct IsdnCardState *cs) { if (cs->hw.ax.base) { iounmap((void *) cs->hw.ax.base); cs->hw.ax.base = 0; } }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton4797.92%150.00%
adrian bunkadrian bunk12.08%150.00%
Total48100.00%2100.00%


static void enable_bkm_int(struct IsdnCardState *cs, unsigned bEnable) { if (cs->typ == ISDN_CTYPE_BKM_A4T) { I20_REGISTER_FILE *pI20_Regs = (I20_REGISTER_FILE *) (cs->hw.ax.base); if (bEnable) pI20_Regs->i20IntCtrl |= (intISDN | intPCI); else /* CAUTION: This disables the video capture driver too */ pI20_Regs->i20IntCtrl &= ~(intISDN | intPCI); } }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git5985.51%150.00%
andrew mortonandrew morton1014.49%150.00%
Total69100.00%2100.00%


static void reset_bkm(struct IsdnCardState *cs) { if (cs->typ == ISDN_CTYPE_BKM_A4T) { I20_REGISTER_FILE *pI20_Regs = (I20_REGISTER_FILE *) (cs->hw.ax.base); /* Issue the I20 soft reset */ pI20_Regs->i20SysControl = 0xFF; /* all in */ mdelay(10); /* Remove the soft reset */ pI20_Regs->i20SysControl = sysRESET | 0xFF; mdelay(10); /* Set our configuration */ pI20_Regs->i20SysControl = sysRESET | sysCFG; /* Issue ISDN reset */ pI20_Regs->i20GuestControl = guestWAIT_CFG | g_A4T_JADE_RES | g_A4T_ISAR_RES | g_A4T_ISAC_RES | g_A4T_JADE_BOOTR | g_A4T_ISAR_BOOTR; mdelay(10); /* Remove RESET state from ISDN */ pI20_Regs->i20GuestControl &= ~(g_A4T_ISAC_RES | g_A4T_JADE_RES | g_A4T_ISAR_RES); mdelay(10); } }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git10187.07%266.67%
andrew mortonandrew morton1512.93%133.33%
Total116100.00%3100.00%


static int BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg) { u_long flags; switch (mt) { case CARD_RESET: /* Disable ints */ spin_lock_irqsave(&cs->lock, flags); enable_bkm_int(cs, 0); reset_bkm(cs); spin_unlock_irqrestore(&cs->lock, flags); return (0); case CARD_RELEASE: /* Sanity */ spin_lock_irqsave(&cs->lock, flags); enable_bkm_int(cs, 0); reset_bkm(cs); spin_unlock_irqrestore(&cs->lock, flags); release_io_bkm(cs); return (0); case CARD_INIT: spin_lock_irqsave(&cs->lock, flags); clear_pending_isac_ints(cs); clear_pending_jade_ints(cs); initisac(cs); initjade(cs); /* Enable ints */ enable_bkm_int(cs, 1); spin_unlock_irqrestore(&cs->lock, flags); return (0); case CARD_TEST: return (0); } return (0); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton13674.32%125.00%
pre-gitpre-git3418.58%125.00%
kai germaschewskikai germaschewski137.10%250.00%
Total183100.00%4100.00%


static int a4t_pci_probe(struct pci_dev *dev_a4t, struct IsdnCardState *cs, u_int *found, u_int *pci_memaddr) { u16 sub_sys; u16 sub_vendor; sub_vendor = dev_a4t->subsystem_vendor; sub_sys = dev_a4t->subsystem_device; if ((sub_sys == PCI_DEVICE_ID_BERKOM_A4T) && (sub_vendor == PCI_VENDOR_ID_BERKOM)) { if (pci_enable_device(dev_a4t)) return (0); /* end loop & function */ *found = 1; *pci_memaddr = pci_resource_start(dev_a4t, 0); cs->irq = dev_a4t->irq; return (1); /* end loop */ } return (-1); /* continue looping */ }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton6964.49%114.29%
jeff garzikjeff garzik2321.50%114.29%
kai germaschewskikai germaschewski1110.28%342.86%
pre-gitpre-git43.74%228.57%
Total107100.00%7100.00%


static int a4t_cs_init(struct IsdnCard *card, struct IsdnCardState *cs, u_int pci_memaddr) { I20_REGISTER_FILE *pI20_Regs; if (!cs->irq) { /* IRQ range check ?? */ printk(KERN_WARNING "HiSax: Telekom A4T: No IRQ\n"); return (0); } cs->hw.ax.base = (long) ioremap(pci_memaddr, 4096); /* Check suspecious address */ pI20_Regs = (I20_REGISTER_FILE *) (cs->hw.ax.base); if ((pI20_Regs->i20IntStatus & 0x8EFFFFFF) != 0) { printk(KERN_WARNING "HiSax: Telekom A4T address " "%lx-%lx suspicious\n", cs->hw.ax.base, cs->hw.ax.base + 4096); iounmap((void *) cs->hw.ax.base); cs->hw.ax.base = 0; return (0); } cs->hw.ax.isac_adr = cs->hw.ax.base + PO_OFFSET; cs->hw.ax.jade_adr = cs->hw.ax.base + PO_OFFSET; cs->hw.ax.isac_ale = GCS_1; cs->hw.ax.jade_ale = GCS_3; printk(KERN_INFO "HiSax: Telekom A4T: Card configured at " "0x%lX IRQ %d\n", cs->hw.ax.base, cs->irq); setup_isac(cs); cs->readisac = &ReadISAC; cs->writeisac = &WriteISAC; cs->readisacfifo = &ReadISACfifo; cs->writeisacfifo = &WriteISACfifo; cs->BC_Read_Reg = &ReadJADE; cs->BC_Write_Reg = &WriteJADE; cs->BC_Send_Data = &jade_fill_fifo; cs->cardmsg = &BKM_card_msg; cs->irq_func = &bkm_interrupt; cs->irq_flags |= IRQF_SHARED; ISACVersion(cs, "Telekom A4T:"); /* Jade version */ JadeVersion(cs, "Telekom A4T:"); return (1); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton15649.21%114.29%
pre-gitpre-git9931.23%114.29%
kai germaschewskikai germaschewski3410.73%228.57%
jeff garzikjeff garzik278.52%228.57%
thomas gleixnerthomas gleixner10.32%114.29%
Total317100.00%7100.00%

static struct pci_dev *dev_a4t = NULL;
int setup_bkm_a4t(struct IsdnCard *card) { struct IsdnCardState *cs = card->cs; char tmp[64]; u_int pci_memaddr = 0, found = 0; int ret; strcpy(tmp, bkm_a4t_revision); printk(KERN_INFO "HiSax: T-Berkom driver Rev. %s\n", HiSax_getrev(tmp)); if (cs->typ == ISDN_CTYPE_BKM_A4T) { cs->subtyp = BKM_A4T; } else return (0); while ((dev_a4t = hisax_find_pci_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36120, dev_a4t))) { ret = a4t_pci_probe(dev_a4t, cs, &found, &pci_memaddr); if (!ret) return (0); if (ret > 0) break; } if (!found) { printk(KERN_WARNING "HiSax: Telekom A4T: Card not found\n"); return (0); } if (!pci_memaddr) { printk(KERN_WARNING "HiSax: Telekom A4T: " "No Memory base address\n"); return (0); } return a4t_cs_init(card, cs, pci_memaddr); }

Contributors

PersonTokensPropCommitsCommitProp
jeff garzikjeff garzik17198.84%250.00%
greg kroah-hartmangreg kroah-hartman10.58%125.00%
tilman schmidttilman schmidt10.58%125.00%
Total173100.00%4100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git93649.71%417.39%
andrew mortonandrew morton62433.14%28.70%
jeff garzikjeff garzik22912.16%28.70%
kai germaschewskikai germaschewski814.30%939.13%
joe perchesjoe perches50.27%14.35%
linus torvaldslinus torvalds30.16%14.35%
adrian bunkadrian bunk20.11%14.35%
tilman schmidttilman schmidt10.05%14.35%
thomas gleixnerthomas gleixner10.05%14.35%
greg kroah-hartmangreg kroah-hartman10.05%14.35%
Total1883100.00%23100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}