コード例 #1
0
static void rtcan_ems_pci_del_chan(struct rtcan_device *dev,
				   int init_step)
{
	struct rtcan_ems_pci *board;

	if (!dev)
		return;

	board = (struct rtcan_ems_pci *)dev->board_priv;

	switch (init_step) {
	case 0:			/* Full cleanup */
		RTCAN_DBG("Removing %s %s device %s\n",
			  ems_pci_board_name, dev->ctrl_name, dev->name);
		rtcan_sja1000_unregister(dev);
	case 5:
	case 4:
		iounmap((void *)board->base_addr);
	case 3:
		if (board->channel != EMS_PCI_SLAVE)
			iounmap((void *)board->conf_addr);
	case 2:
		rtcan_dev_free(dev);
	case 1:
		break;
	}
}
コード例 #2
0
ファイル: rtcan_ixxat_pci.c プロジェクト: ChunHungLiu/xenomai
static void rtcan_ixxat_pci_del_chan(struct rtcan_device *dev)
{
    struct rtcan_ixxat_pci *board;
    u8 intcsr;

    if (!dev)
	return;

    board = (struct rtcan_ixxat_pci *)dev->board_priv;

    printk("Removing %s %s device %s\n",
	   ixxat_pci_board_name, dev->ctrl_name, dev->name);

    rtcan_sja1000_unregister(dev);

    /* Disable PCI interrupts */
    intcsr = inb(board->conf_addr + IXXAT_INTCSR_OFFSET);
    if (board->slave_dev) {
	intcsr &= ~IXXAT_INTCSR_MASTER;
	outb(intcsr, board->conf_addr + IXXAT_INTCSR_OFFSET);
	writeb(0x1, board->base_addr + CHANNEL_MASTER_RESET);
	iounmap(board->base_addr);
    } else {
	intcsr &= ~IXXAT_INTCSR_SLAVE;
	outb(intcsr, board->conf_addr + IXXAT_INTCSR_OFFSET);
	writeb(0x1, board->base_addr + CHANNEL_SLAVE_RESET );
    }
    rtcan_dev_free(dev);
}
コード例 #3
0
void rtcan_peak_dng_exit_one(struct rtcan_device *dev)
{
    struct rtcan_peak_dng *dng = (struct rtcan_peak_dng *)dev->board_priv;

    rtcan_sja1000_unregister(dev);
    rtcan_peak_dng_disable(dev);
    if (dng->type == DONGLE_TYPE_EPP)
	release_region(dng->ecr, ECR_PORT_SIZE);
    release_region(dng->ioport, DNG_PORT_SIZE);
    rtcan_dev_free(dev);
}
コード例 #4
0
ファイル: rtcan_isa.c プロジェクト: Lmaths/xenomai-forge
/** Cleanup module */
static void rtcan_isa_exit(void)
{
	int i;
	struct rtcan_device *dev;

	for (i = 0; i < RTCAN_ISA_MAX_DEV; i++) {
		dev = rtcan_isa_devs[i];
		if (!dev)
			continue;
		rtcan_sja1000_unregister(dev);
		release_region(io[i], RTCAN_ISA_PORT_SIZE);
		rtcan_dev_free(dev);
	}
}
コード例 #5
0
static void rtcan_adv_pci_del_chan(struct pci_dev *pdev,
				   struct rtcan_device *dev)
{
	struct rtcan_adv_pci *board;

	if (!dev)
		return;

	board = (struct rtcan_adv_pci *)dev->board_priv;

	rtcan_sja1000_unregister(dev);

	pci_iounmap(pdev, board->base_addr);

	rtcan_dev_free(dev);
}
コード例 #6
0
static void rtcan_peak_pci_del_chan(struct rtcan_device *dev,
				    int init_step)
{
    struct rtcan_peak_pci *board;
    u16 pita_icr_high;

    if (!dev)
	return;

    board = (struct rtcan_peak_pci *)dev->board_priv;

    switch (init_step) {
    case 0:			/* Full cleanup */
	printk("Removing %s %s device %s\n",
	       peak_pci_board_name, dev->ctrl_name, dev->name);
	rtcan_sja1000_unregister(dev);
    case 5:
	pita_icr_high = readw(board->conf_addr + PITA_ICR + 2);
	if (board->channel == CHANNEL_SLAVE) {
	    pita_icr_high &= ~0x0001;
	} else {
	    pita_icr_high &= ~0x0002;
	}
	writew(pita_icr_high, board->conf_addr + PITA_ICR + 2);
    case 4:
	iounmap((void *)board->base_addr);
    case 3:
	if (board->channel != CHANNEL_SLAVE)
	    iounmap((void *)board->conf_addr);
    case 2:
	rtcan_dev_free(dev);
    case 1:
	break;
    }

}