static void __exit serial_bast_exit(void) { if (port[0] != -1) unregister_serial(port[0]); if (port[1] != -1) unregister_serial(port[1]); }
/* * mwave_init is called on module load * * mwave_exit is called on module unload * mwave_exit is also used to clean up after an aborted mwave_init */ static void mwave_exit(void) { pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd; PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit entry\n"); if (pDrvData->bProcEntryCreated) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) remove_proc_entry("mwave", NULL); #else proc_unregister(&proc_root, mwave_proc.low_ino); #endif } if ( pDrvData->sLine >= 0 ) { unregister_serial(pDrvData->sLine); } if (pDrvData->bMwaveDevRegistered) { misc_deregister(&mwave_misc_dev); } if (pDrvData->bDSPEnabled) { tp3780I_DisableDSP(&pDrvData->rBDData); } if (pDrvData->bResourcesClaimed) { tp3780I_ReleaseResources(&pDrvData->rBDData); } if (pDrvData->bBDInitialized) { tp3780I_Cleanup(&pDrvData->rBDData); } PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit exit\n"); }
static void serial_remove(dev_link_t *link) { struct serial_info *info = link->priv; int i; link->state &= ~DEV_PRESENT; DEBUG(0, "serial_release(0x%p)\n", link); /* * Recheck to see if the device is still configured. */ if (info->link.state & DEV_CONFIG) { for (i = 0; i < info->ndev; i++) unregister_serial(info->line[i]); info->link.dev = NULL; if (!info->slave) { pcmcia_release_configuration(info->link.handle); pcmcia_release_io(info->link.handle, &info->link.io); pcmcia_release_irq(info->link.handle, &info->link.irq); } info->link.state &= ~DEV_CONFIG; } }
static void serial_detach(dev_node_t *node) { DEBUG(0, "serial_detach(ttyS%02d)\n", node->minor - 0x40); unregister_serial(node->minor - 0x40); kfree(node); MOD_DEC_USE_COUNT; }
/* * mwave_init is called on module load * * mwave_exit is called on module unload * mwave_exit is also used to clean up after an aborted mwave_init */ static void mwave_exit(void) { pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd; PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit entry\n"); #if 0 for (i = 0; i < pDrvData->nr_registered_attrs; i++) device_remove_file(&mwave_device, mwave_dev_attrs[i]); pDrvData->nr_registered_attrs = 0; if (pDrvData->device_registered) { device_unregister(&mwave_device); pDrvData->device_registered = FALSE; } #endif if ( pDrvData->sLine >= 0 ) { unregister_serial(pDrvData->sLine); } if (pDrvData->bMwaveDevRegistered) { misc_deregister(&mwave_misc_dev); } if (pDrvData->bDSPEnabled) { tp3780I_DisableDSP(&pDrvData->rBDData); } if (pDrvData->bResourcesClaimed) { tp3780I_ReleaseResources(&pDrvData->rBDData); } if (pDrvData->bBDInitialized) { tp3780I_Cleanup(&pDrvData->rBDData); } PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit exit\n"); }
static void __devexit navman_gps_cf_remove_sleeve(struct sleeve_dev *sleeve_dev) { if (1) printk(__FUNCTION__ ": %s\n", sleeve_dev->driver->name); if (serial_line > 0) unregister_serial(serial_line); if (serial_ioaddr) iounmap(serial_ioaddr); sa1100_h3600_pcmcia_remove_sleeve(); }
static __exit void s5pv210_serial_dev_exit(void) { u32_t i; for(i = 0; i < ARRAY_SIZE(s5pv210_uart_driver); i++) { if(!unregister_serial(&s5pv210_uart_driver[i])) LOG_E("failed to unregister serial driver '%s'", s5pv210_uart_driver[i].info->name); } }
void cleanup_module(void) { int i; for (i = 0; i < nr_asdg; i += 2) { struct SCC *scc = (struct SCC *)rs_table[lines[i]].board_base; write_zsreg(&scc->A, R9, FHWRES); udelay(10); /* Give card time to reset */ write_zsreg(&scc->B, R9, FHWRES); udelay(10); /* Give card time to reset */ unregister_serial(lines[i]); unregister_serial(lines[i+1]); zorro_unconfig_board(board_index[i/2], 1); } free_irq(IRQ_AMIGA_EXTER, asdg_interrupt); }
static dev_node_t *serial_attach(dev_locator_t *loc) { u_int io; u_char irq; int line; struct serial_struct serial; struct pci_dev *pdev; dev_node_t *node; MOD_INC_USE_COUNT; if (loc->bus != LOC_PCI) goto err_out; pdev = pci_find_slot (loc->b.pci.bus, loc->b.pci.devfn); if (!pdev) goto err_out; if (pci_enable_device(pdev)) goto err_out; printk(KERN_INFO "serial_attach(bus %d, fn %d)\n", pdev->bus->number, pdev->devfn); io = pci_resource_start (pdev, 0); irq = pdev->irq; if (!(pci_resource_flags(pdev, 0) & IORESOURCE_IO)) { printk(KERN_NOTICE "serial_cb: PCI base address 0 is not IO\n"); goto err_out; } device_setup(pdev, io); memset(&serial, 0, sizeof(serial)); serial.port = io; serial.irq = irq; serial.flags = ASYNC_SKIP_TEST | ASYNC_SHARE_IRQ; /* Some devices seem to need extra time */ __set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ/50); line = register_serial(&serial); if (line < 0) { printk(KERN_NOTICE "serial_cb: register_serial() at 0x%04x, " "irq %d failed\n", serial.port, serial.irq); goto err_out; } node = kmalloc(sizeof(dev_node_t), GFP_KERNEL); if (!node) goto err_out_unregister; sprintf(node->dev_name, "ttyS%d", line); node->major = TTY_MAJOR; node->minor = 0x40 + line; node->next = NULL; return node; err_out_unregister: unregister_serial(line); err_out: MOD_DEC_USE_COUNT; return NULL; }
static void pnp_remove_one(struct pci_dev *dev) { int line = (int)pci_get_drvdata(dev); if (line) { pci_set_drvdata(dev, NULL); unregister_serial(line - 1); dev->deactivate(dev); } }
static void __exit serial_card_exit(void) { int i; for (i = 0; i < serial_pcount; i++) { unregister_serial(serial_ports[i]); release_region(serial_addr[i], 8); } for (i = 0; i < MAX_ECARDS; i++) if (expcard[i]) ecard_release (expcard[i]); }
static void __devexit serial_card_remove(struct expansion_card *ec) { struct serial_card_info *info = ecard_get_drvdata(ec); int i; ecard_set_drvdata(ec, NULL); for (i = 0; i < info->num_ports; i++) if (info->ports[i] > 0) unregister_serial(info->ports[i]); kfree(info); }
static int acpi_serial_remove(struct acpi_device *device, int type) { struct serial_private *priv; if (!device || !acpi_driver_data(device)) return -EINVAL; priv = acpi_driver_data(device); unregister_serial(priv->line); if (priv->iomem_base) iounmap(priv->iomem_base); kfree(priv); return 0; }
static void __exit EXIT (void) { #ifdef MODULE int i; for (i = 0; i < __serial_pcount; i++) { unregister_serial(__serial_ports[i]); release_region(__serial_addr[i], 8); } for (i = 0; i < MAX_ECARDS; i++) if (expcard[i]) ecard_release (expcard[i]); #endif }
int asdg_setup(void) { int i, line1, line2; struct SCC *scc=NULL; int dummy; struct ConfigDev *cd=NULL; struct serial_struct req; struct async_struct *info=NULL; int CardFound=0; if (!MACH_IS_AMIGA) return -ENODEV; #ifdef DEBUG printk("We are a miggy\n"); #endif nr_asdg = 0; while((i=zorro_find(MANUF_ASDG, PROD_TWIN_X,1, 0))) { CardFound=1; board_index[nr_asdg/2] = i; cd = zorro_get_board(i); scc = (struct SCC *)ZTWO_VADDR((((volatile u_char *)cd->cd_BoardAddr))); #ifdef DEBUG printk("Found ASDG DSB at %p\n", scc); #endif req.line = -1; /* first free ttyS? device */ req.type = SER_ASDG; req.port = (int) &(scc->B); if ((line1 = register_serial( &req )) < 0) { printk( "Cannot register ASDG serial port: no free device\n" ); return -EBUSY; } lines[nr_asdg++] = line1; info = &rs_table[line1]; info->sw = &asdg_ser_switch; info->nr_uarts = nr_asdg; info->board_base = scc; req.line = -1; /* first free ttyS? device */ req.type = SER_ASDG; req.port = (int) &(scc->A); if ((line2 = register_serial( &req )) < 0) { printk( "Cannot register ASDG serial port: no free device\n" ); unregister_serial( line1 ); return -EBUSY; } lines[nr_asdg++] = line2; info = &rs_table[line2]; info->sw = &asdg_ser_switch; info->nr_uarts = nr_asdg--; info->board_base = scc; nr_asdg++; zorro_config_board(i,1); /* Clear pointers */ dummy = scc->A.control; dummy = scc->B.control; #ifdef DEBUG printk("Pointers cleared \n"); #endif /* Reset card */ write_zsreg(&scc->A, R9, FHWRES | MIE); udelay(10); /* Give card time to reset */ write_zsreg(&scc->B, R9, FHWRES | MIE); udelay(10); /* Give card time to reset */ #ifdef DEBUG printk("Card reset - MIE on \n"); #endif /* Reset all potential interupt sources */ write_zsreg(&scc->A, R0, RES_EXT_INT); /* Ext ints (disabled anyways) */ write_zsreg(&scc->B, R0, RES_EXT_INT); #ifdef DEBUG printk("Ext ints cleared\n"); #endif write_zsreg(&scc->A, R0, RES_Tx_P); /* TBE int */ write_zsreg(&scc->B, R0, RES_Tx_P); #ifdef DEBUG printk("TBE Cleared\n"); #endif /* Clear Rx FIFO */ while( (read_zsreg(&scc->A, R0) & Rx_CH_AV) != 0) dummy=read_zsdata(&scc->A); while( (read_zsreg(&scc->B, R0) & Rx_CH_AV) != 0) dummy=read_zsdata(&scc->B); #ifdef DEBUG printk("Rx buffer empty\n"); #endif /* TBE and RX int off - we will turn them on in _init()*/ write_zsreg(&scc->A, R1, 0); write_zsreg(&scc->B, R1, 0); #ifdef DEBUG printk("Tx and Rx ints off \n"); #endif /* Interrupt vector */ write_zsreg(&scc->A, R2, 0); write_zsreg(&scc->B, R2, 0); #ifdef DEBUG printk("Int vector set (unused) \n"); #endif write_zsreg(&scc->A, R3, Rx8); write_zsreg(&scc->B, R3, Rx8); #ifdef DEBUG printk("Rx enabled\n"); #endif write_zsreg(&scc->A, R4, SB1 | X16CLK); write_zsreg(&scc->B, R4, SB1 | X16CLK); #ifdef DEBUG printk("1 stop bit, x16 clock\n"); #endif write_zsreg(&scc->A, R5, Tx8); write_zsreg(&scc->B, R5, Tx8); #ifdef DEBUG printk("Tx enabled \n"); #endif write_zsreg(&scc->A, R10, NRZ); write_zsreg(&scc->B, R10, NRZ); #ifdef DEBUG printk("NRZ mode\n"); #endif write_zsreg(&scc->A, R11, TCBR | RCBR | TRxCBR); write_zsreg(&scc->B, R11, TCBR | RCBR | TRxCBR); #ifdef DEBUG printk("Clock source setup\n"); #endif /*300 bps */ write_zsreg(&scc->A, R12, 0xfe); write_zsreg(&scc->A, R13, 2); write_zsreg(&scc->B, R12, 0xfe); write_zsreg(&scc->B, R13, 2); #ifdef DEBUG printk("Baud rate set - 300\n"); #endif write_zsreg(&scc->A, R14, BRENABL | BRSRC); write_zsreg(&scc->B, R14, BRENABL | BRSRC); #ifdef DEBUG printk("BRG enabled \n"); #endif write_zsreg(&scc->A, R15, 0); write_zsreg(&scc->A, R15, 0); #ifdef DEBUG printk("Ext INT IE bits cleared \n"); #endif } if(CardFound) { request_irq(IRQ_AMIGA_EXTER, asdg_interrupt, 0, "ASDG serial", asdg_interrupt); return 0; } else { printk("No ASDG Cards found\n"); return -ENODEV; } }