/* * Function w83977af_close (self) * * Close driver instance * */ static int w83977af_close(struct w83977af_ir *self) { int iobase; IRDA_DEBUG(0, __FUNCTION__ "()\n"); iobase = self->io.fir_base; #ifdef CONFIG_USE_W977_PNP /* enter PnP configuration mode */ w977_efm_enter(efio); w977_select_device(W977_DEVICE_IR, efio); /* Deactivate device */ w977_write_reg(0x30, 0x00, efio); w977_efm_exit(efio); #endif /* CONFIG_USE_W977_PNP */ /* Remove netdevice */ if (self->netdev) { rtnl_lock(); unregister_netdevice(self->netdev); rtnl_unlock(); } /* Release the PORT that this driver is using */ IRDA_DEBUG(0 , __FUNCTION__ "(), Releasing Region %03x\n", self->io.fir_base); release_region(self->io.fir_base, self->io.fir_ext); if (self->tx_buff.head) kfree(self->tx_buff.head); if (self->rx_buff.head) kfree(self->rx_buff.head); kfree(self); return 0; }
/* * Function w83977af_close (self) * * Close driver instance * */ static int w83977af_close(struct w83977af_ir *self) { int iobase; IRDA_DEBUG(0, "%s()\n", __func__ ); iobase = self->io.fir_base; #ifdef CONFIG_USE_W977_PNP /* enter PnP configuration mode */ w977_efm_enter(efio); w977_select_device(W977_DEVICE_IR, efio); /* Deactivate device */ w977_write_reg(0x30, 0x00, efio); w977_efm_exit(efio); #endif /* CONFIG_USE_W977_PNP */ /* Remove netdevice */ unregister_netdev(self->netdev); /* Release the PORT that this driver is using */ IRDA_DEBUG(0 , "%s(), Releasing Region %03x\n", __func__ , self->io.fir_base); release_region(self->io.fir_base, self->io.fir_ext); if (self->tx_buff.head) dma_free_coherent(NULL, self->tx_buff.truesize, self->tx_buff.head, self->tx_buff_dma); if (self->rx_buff.head) dma_free_coherent(NULL, self->rx_buff.truesize, self->rx_buff.head, self->rx_buff_dma); free_netdev(self->netdev); return 0; }
static int w83977af_close(struct w83977af_ir *self) { int iobase; IRDA_DEBUG(0, "%s()\n", __func__ ); iobase = self->io.fir_base; #ifdef CONFIG_USE_W977_PNP w977_efm_enter(efio); w977_select_device(W977_DEVICE_IR, efio); w977_write_reg(0x30, 0x00, efio); w977_efm_exit(efio); #endif unregister_netdev(self->netdev); IRDA_DEBUG(0 , "%s(), Releasing Region %03x\n", __func__ , self->io.fir_base); release_region(self->io.fir_base, self->io.fir_ext); if (self->tx_buff.head) dma_free_coherent(NULL, self->tx_buff.truesize, self->tx_buff.head, self->tx_buff_dma); if (self->rx_buff.head) dma_free_coherent(NULL, self->rx_buff.truesize, self->rx_buff.head, self->rx_buff_dma); free_netdev(self->netdev); return 0; }
static int w83977af_probe(int iobase, int irq, int dma) { int version; int i; for (i=0; i < 2; i++) { IRDA_DEBUG( 0, "%s()\n", __func__ ); #ifdef CONFIG_USE_W977_PNP /* Enter PnP configuration mode */ w977_efm_enter(efbase[i]); w977_select_device(W977_DEVICE_IR, efbase[i]); /* Configure PnP port, IRQ, and DMA channel */ w977_write_reg(0x60, (iobase >> 8) & 0xff, efbase[i]); w977_write_reg(0x61, (iobase) & 0xff, efbase[i]); w977_write_reg(0x70, irq, efbase[i]); #ifdef CONFIG_ARCH_NETWINDER /* Netwinder uses 1 higher than Linux */ w977_write_reg(0x74, dma+1, efbase[i]); #else w977_write_reg(0x74, dma, efbase[i]); #endif /*CONFIG_ARCH_NETWINDER */ w977_write_reg(0x75, 0x04, efbase[i]); /* Disable Tx DMA */ /* Set append hardware CRC, enable IR bank selection */ w977_write_reg(0xf0, APEDCRC|ENBNKSEL, efbase[i]); /* Activate device */ w977_write_reg(0x30, 0x01, efbase[i]); w977_efm_exit(efbase[i]); #endif /* CONFIG_USE_W977_PNP */ /* Disable Advanced mode */ switch_bank(iobase, SET2); outb(iobase+2, 0x00); /* Turn on UART (global) interrupts */ switch_bank(iobase, SET0); outb(HCR_EN_IRQ, iobase+HCR); /* Switch to advanced mode */ switch_bank(iobase, SET2); outb(inb(iobase+ADCR1) | ADCR1_ADV_SL, iobase+ADCR1); /* Set default IR-mode */ switch_bank(iobase, SET0); outb(HCR_SIR, iobase+HCR); /* Read the Advanced IR ID */ switch_bank(iobase, SET3); version = inb(iobase+AUID); /* Should be 0x1? */ if (0x10 == (version & 0xf0)) { efio = efbase[i]; /* Set FIFO size to 32 */ switch_bank(iobase, SET2); outb(ADCR2_RXFS32|ADCR2_TXFS32, iobase+ADCR2); /* Set FIFO threshold to TX17, RX16 */ switch_bank(iobase, SET0); outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST| UFR_EN_FIFO,iobase+UFR); /* Receiver frame length */ switch_bank(iobase, SET4); outb(2048 & 0xff, iobase+6); outb((2048 >> 8) & 0x1f, iobase+7); /* * Init HP HSDL-1100 transceiver. * * Set IRX_MSL since we have 2 * receive paths IRRX, * and IRRXH. Clear IRSL0D since we want IRSL0 * to * be a input pin used for IRRXH * * IRRX pin 37 connected to receiver * IRTX pin 38 connected to transmitter * FIRRX pin 39 connected to receiver (IRSL0) * CIRRX pin 40 connected to pin 37 */ switch_bank(iobase, SET7); outb(0x40, iobase+7); IRDA_MESSAGE("W83977AF (IR) driver loaded. " "Version: 0x%02x\n", version); return 0; } else {
static int w83977af_probe(int iobase, int irq, int dma) { int version; int i; for (i=0; i < 2; i++) { IRDA_DEBUG( 0, "%s()\n", __func__ ); #ifdef CONFIG_USE_W977_PNP w977_efm_enter(efbase[i]); w977_select_device(W977_DEVICE_IR, efbase[i]); w977_write_reg(0x60, (iobase >> 8) & 0xff, efbase[i]); w977_write_reg(0x61, (iobase) & 0xff, efbase[i]); w977_write_reg(0x70, irq, efbase[i]); #ifdef CONFIG_ARCH_NETWINDER w977_write_reg(0x74, dma+1, efbase[i]); #else w977_write_reg(0x74, dma, efbase[i]); #endif w977_write_reg(0x75, 0x04, efbase[i]); w977_write_reg(0xf0, APEDCRC|ENBNKSEL, efbase[i]); w977_write_reg(0x30, 0x01, efbase[i]); w977_efm_exit(efbase[i]); #endif switch_bank(iobase, SET2); outb(iobase+2, 0x00); switch_bank(iobase, SET0); outb(HCR_EN_IRQ, iobase+HCR); switch_bank(iobase, SET2); outb(inb(iobase+ADCR1) | ADCR1_ADV_SL, iobase+ADCR1); switch_bank(iobase, SET0); outb(HCR_SIR, iobase+HCR); switch_bank(iobase, SET3); version = inb(iobase+AUID); if (0x10 == (version & 0xf0)) { efio = efbase[i]; switch_bank(iobase, SET2); outb(ADCR2_RXFS32|ADCR2_TXFS32, iobase+ADCR2); switch_bank(iobase, SET0); outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST| UFR_EN_FIFO,iobase+UFR); switch_bank(iobase, SET4); outb(2048 & 0xff, iobase+6); outb((2048 >> 8) & 0x1f, iobase+7); switch_bank(iobase, SET7); outb(0x40, iobase+7); IRDA_MESSAGE("W83977AF (IR) driver loaded. " "Version: 0x%02x\n", version); return 0; } else {