예제 #1
0
static void __exit serial_bast_exit(void)
{
	if (port[0] != -1)
		unregister_serial(port[0]);
	if (port[1] != -1)
		unregister_serial(port[1]);
}
예제 #2
0
/*
* 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");
}
예제 #3
0
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;
	}
}
예제 #4
0
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;
}
예제 #5
0
파일: mwavedd.c 프로젝트: kzlin129/tt-gpl
/*
* 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");
}
예제 #6
0
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();
}
예제 #7
0
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);
	}
}
예제 #8
0
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);
}
예제 #9
0
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;
}
예제 #10
0
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);
	}
}
예제 #11
0
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]);
}
예제 #12
0
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);
}
예제 #13
0
파일: 8250_acpi.c 프로젝트: wxlong/Test
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;
}
예제 #14
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
}
예제 #15
0
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;
  }
}