]> err.no Git - linux-2.6/blobdiff - drivers/char/cyclades.c
Char: cyclades, remove useless fileds from cyclades_card
[linux-2.6] / drivers / char / cyclades.c
index 1fe0bb6c7ad726d48d1f6ce90daa296bfbf0cff9..a79a4b213bba722ba009aee3a9f63ec5dbde9088 100644 (file)
@@ -1444,6 +1444,10 @@ static irqreturn_t cyy_interrupt(int irq, void *dev_id)
        card_base_addr = cinfo->base_addr;
        index = cinfo->bus_index;
 
+       /* card was not initialized yet (e.g. DEBUG_SHIRQ) */
+       if (unlikely(card_base_addr == NULL))
+               return IRQ_HANDLED;
+
        /* This loop checks all chips in the card.  Make a note whenever
           _any_ chip had some work to do, as this is considered an
           indication that there will be more to do.  Only when no chip
@@ -3612,11 +3616,6 @@ static int cy_tiocmget(struct tty_struct *tty, struct file *file)
                        ((status & CyCTS) ? TIOCM_CTS : 0);
        } else {
                base_addr = cy_card[card].base_addr;
-
-               if (cy_card[card].num_chips != -1) {
-                       return -EINVAL;
-               }
-
                firm_id = cy_card[card].base_addr + ID_ADDRESS;
                if (ISZLOADED(cy_card[card])) {
                        zfw_ctrl = cy_card[card].base_addr +
@@ -4050,14 +4049,6 @@ cy_ioctl(struct tty_struct *tty, struct file *file,
        case CYGETRTSDTR_INV:
                ret_val = info->rtsdtr_inv;
                break;
-       case CYGETCARDINFO:
-               if (copy_to_user(argp, &cy_card[info->card],
-                                sizeof(struct cyclades_card))) {
-                       ret_val = -EFAULT;
-                       break;
-               }
-               ret_val = 0;
-               break;
        case CYGETCD1400VER:
                ret_val = info->chip_rev;
                break;
@@ -4509,7 +4500,7 @@ static void __devinit cy_init_card(struct cyclades_card *cinfo,
        unsigned short chip_number;
        int index, port;
 
-       if (cinfo->num_chips == -1) {   /* Cyclades-Z */
+       if (IS_CYC_Z(*cinfo)) { /* Cyclades-Z */
                mailbox = readl(&((struct RUNTIME_9060 __iomem *)
                                     cinfo->ctl_addr)->mail_box_0);
                nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8;
@@ -4841,6 +4832,9 @@ static int __init cy_detect_isa(void)
                        cy_isa_irq);
                printk("%d channels starting from port %d.\n",
                        cy_isa_nchan, cy_next_channel);
+               for (j = cy_next_channel;
+                               j < cy_next_channel + cy_isa_nchan; j++)
+                       tty_register_device(cy_serial_driver, j, NULL);
                cy_next_channel += cy_isa_nchan;
        }
        return nboard;
@@ -4920,15 +4914,12 @@ static int __devinit cy_init_Ze(unsigned long cy_pci_phys0,
 #endif                         /* CONFIG_CYZ_INTR */
 
        /* set cy_card */
-       cy_card[j].base_phys = cy_pci_phys2;
-       cy_card[j].ctl_phys = cy_pci_phys0;
        cy_card[j].base_addr = cy_pci_addr2;
        cy_card[j].ctl_addr = cy_pci_addr0;
        cy_card[j].irq = (int)cy_pci_irq;
        cy_card[j].bus_index = 1;
        cy_card[j].first_line = cy_next_channel;
        cy_card[j].num_chips = -1;
-       cy_card[j].pdev = pdev;
        cy_init_card(&cy_card[j], j);
        pci_set_drvdata(pdev, &cy_card[j]);
 
@@ -4948,6 +4939,8 @@ static int __devinit cy_init_Ze(unsigned long cy_pci_phys0,
 
        printk("%d channels starting from port %d.\n",
                cy_pci_nchan, cy_next_channel);
+       for (j = cy_next_channel; j < cy_next_channel + cy_pci_nchan; j++)
+               tty_register_device(cy_serial_driver, j, &pdev->dev);
        cy_next_channel += cy_pci_nchan;
 
        return 0;
@@ -5070,15 +5063,12 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
                }
 
                /* set cy_card */
-               cy_card[j].base_phys = (ulong) cy_pci_phys2;
-               cy_card[j].ctl_phys = (ulong) cy_pci_phys0;
                cy_card[j].base_addr = cy_pci_addr2;
                cy_card[j].ctl_addr = cy_pci_addr0;
                cy_card[j].irq = (int)cy_pci_irq;
                cy_card[j].bus_index = 1;
                cy_card[j].first_line = cy_next_channel;
                cy_card[j].num_chips = cy_pci_nchan / 4;
-               cy_card[j].pdev = pdev;
                cy_init_card(&cy_card[j], j);
                pci_set_drvdata(pdev, &cy_card[j]);
 
@@ -5115,6 +5105,9 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
                        (int)cy_pci_irq);
                printk("%d channels starting from port %d.\n",
                        cy_pci_nchan, cy_next_channel);
+               for (j = cy_next_channel;
+                               j < cy_next_channel + cy_pci_nchan; j++)
+                       tty_register_device(cy_serial_driver, j, &pdev->dev);
 
                cy_next_channel += cy_pci_nchan;
        } else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Lo) {
@@ -5254,15 +5247,12 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
 #endif                         /* CONFIG_CYZ_INTR */
 
                /* set cy_card */
-               cy_card[j].base_phys = cy_pci_phys2;
-               cy_card[j].ctl_phys = cy_pci_phys0;
                cy_card[j].base_addr = cy_pci_addr2;
                cy_card[j].ctl_addr = cy_pci_addr0;
                cy_card[j].irq = (int)cy_pci_irq;
                cy_card[j].bus_index = 1;
                cy_card[j].first_line = cy_next_channel;
                cy_card[j].num_chips = -1;
-               cy_card[j].pdev = pdev;
                cy_init_card(&cy_card[j], j);
                pci_set_drvdata(pdev, &cy_card[j]);
 
@@ -5282,60 +5272,37 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
 
                printk("%d channels starting from port %d.\n",
                                cy_pci_nchan, cy_next_channel);
+               for (j = cy_next_channel;
+                               j < cy_next_channel + cy_pci_nchan; j++)
+                       tty_register_device(cy_serial_driver, j, &pdev->dev);
                cy_next_channel += cy_pci_nchan;
        }
 
        return 0;
 }
-#endif
 
-/*
- * ---------------------------------------------------------------------
- * cy_detect_pci() - Test PCI bus presence and Cyclom-Ye/PCI.
- * sets global variables and return the number of PCI boards found.
- * ---------------------------------------------------------------------
- */
-static int __init cy_detect_pci(void)
+static void __devexit cy_pci_remove(struct pci_dev *pdev)
 {
-#ifdef CONFIG_PCI
-       struct pci_dev *pdev = NULL;
-       unsigned int i, device_id, dev_index = 0;
-
-       for (i = 0; i < NR_CARDS; i++) {
-               /* look for a Cyclades card by vendor and device id */
-               while ((device_id = cy_pci_dev_id[dev_index].device) != 0) {
-                       if ((pdev = pci_get_device(PCI_VENDOR_ID_CYCLADES,
-                                                  device_id, pdev)) == NULL) {
-                               dev_index++;    /* try next device id */
-                       } else {
-                               break;  /* found a board */
-                       }
-               }
-
-               if (device_id == 0)
-                       break;
-
-               i -= !!cy_pci_probe(pdev, &cy_pci_dev_id[dev_index]);
-       }
-
-       return i;
-#else
-       return 0;
-#endif                         /* ifdef CONFIG_PCI */
-}                              /* cy_detect_pci */
-
-static void __devexit cy_pci_release(struct pci_dev *pdev)
-{
-#ifdef CONFIG_PCI
        struct cyclades_card *cinfo = pci_get_drvdata(pdev);
        unsigned int i;
 
+       /* non-Z with old PLX */
+       if (!IS_CYC_Z(*cinfo) && (readb(cinfo->base_addr + CyPLX_VER) & 0x0f) ==
+                       PLX_9050)
+               cy_writeb(cinfo->ctl_addr + 0x4c, 0);
+       else
+#ifndef CONFIG_CYZ_INTR
+               if (!IS_CYC_Z(*cinfo))
+#endif
+               cy_writew(cinfo->ctl_addr + 0x68,
+                               readw(cinfo->ctl_addr + 0x68) & ~0x0900);
+
        pci_iounmap(pdev, cinfo->base_addr);
        if (cinfo->ctl_addr)
                pci_iounmap(pdev, cinfo->ctl_addr);
        if (cinfo->irq
 #ifndef CONFIG_CYZ_INTR
-               && cinfo->num_chips != -1 /* not a Z card */
+               && !IS_CYC_Z(*cinfo)
 #endif /* CONFIG_CYZ_INTR */
                )
                free_irq(cinfo->irq, cinfo);
@@ -5346,9 +5313,19 @@ static void __devexit cy_pci_release(struct pci_dev *pdev)
                cy_port[i].line = -1;
                cy_port[i].magic = -1;
        }
-#endif
+       for (i = cinfo->first_line; i < cinfo->first_line +
+                       cinfo->nports; i++)
+               tty_unregister_device(cy_serial_driver, i);
 }
 
+static struct pci_driver cy_pci_driver = {
+       .name = "cyclades",
+       .id_table = cy_pci_dev_id,
+       .probe = cy_pci_probe,
+       .remove = __devexit_p(cy_pci_remove)
+};
+#endif
+
 /*
  * This routine prints out the appropriate serial driver version number
  * and identifies which options were configured into this driver.
@@ -5460,10 +5437,11 @@ static const struct tty_operations cy_ops = {
 static int __init cy_init(void)
 {
        unsigned int i, nboards;
+       int retval = -ENOMEM;
 
        cy_serial_driver = alloc_tty_driver(NR_PORTS);
        if (!cy_serial_driver)
-               return -ENOMEM;
+               goto err;
        show_version();
 
        /* Initialize the tty_driver structure */
@@ -5478,11 +5456,14 @@ static int __init cy_init(void)
        cy_serial_driver->init_termios = tty_std_termios;
        cy_serial_driver->init_termios.c_cflag =
            B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-       cy_serial_driver->flags = TTY_DRIVER_REAL_RAW;
+       cy_serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
        tty_set_operations(cy_serial_driver, &cy_ops);
 
-       if (tty_register_driver(cy_serial_driver))
-               panic("Couldn't register Cyclades serial driver\n");
+       retval = tty_register_driver(cy_serial_driver);
+       if (retval) {
+               printk(KERN_ERR "Couldn't register Cyclades serial driver\n");
+               goto err_frtty;
+       }
 
        for (i = 0; i < NR_CARDS; i++) {
                /* base_addr=0 indicates board not found */
@@ -5505,10 +5486,20 @@ static int __init cy_init(void)
        /* look for isa boards */
        nboards = cy_detect_isa();
 
+#ifdef CONFIG_PCI
        /* look for pci boards */
-       nboards += cy_detect_pci();
+       retval = pci_register_driver(&cy_pci_driver);
+       if (retval && !nboards)
+               goto err_unr;
+#endif
 
-       return nboards ? 0 : -ENODEV;
+       return 0;
+err_unr:
+       tty_unregister_driver(cy_serial_driver);
+err_frtty:
+       put_tty_driver(cy_serial_driver);
+err:
+       return retval;
 }                              /* cy_init */
 
 static void __exit cy_cleanup_module(void)
@@ -5525,21 +5516,27 @@ static void __exit cy_cleanup_module(void)
 
        put_tty_driver(cy_serial_driver);
 
+#ifdef CONFIG_PCI
+       pci_unregister_driver(&cy_pci_driver);
+#endif
+
        for (i = 0; i < NR_CARDS; i++) {
                if (cy_card[i].base_addr) {
-                       if (cy_card[i].pdev) {
-                               cy_pci_release(cy_card[i].pdev);
-                               continue;
-                       }
+                       /* clear interrupt */
+                       cy_writeb(cy_card[i].base_addr + Cy_ClrIntr, 0);
                        iounmap(cy_card[i].base_addr);
                        if (cy_card[i].ctl_addr)
                                iounmap(cy_card[i].ctl_addr);
                        if (cy_card[i].irq
 #ifndef CONFIG_CYZ_INTR
-                               && cy_card[i].num_chips != -1 /* not a Z card */
+                               && !IS_CYC_Z(cy_card[i])
 #endif /* CONFIG_CYZ_INTR */
                                )
                                free_irq(cy_card[i].irq, &cy_card[i]);
+                       for (e1 = cy_card[i].first_line;
+                                       e1 < cy_card[i].first_line +
+                                       cy_card[i].nports; e1++)
+                               tty_unregister_device(cy_serial_driver, e1);
                }
        }
 } /* cy_cleanup_module */