Char: cyclades, move card entries init into function
authorJiri Slaby <jirislaby@gmail.com>
Tue, 8 May 2007 07:36:14 +0000 (00:36 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 8 May 2007 18:15:23 +0000 (11:15 -0700)
Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/cyclades.c

index e5de0409b37c2fd9de278ca506828681056993a1..85c734b7f548e06bdc478eab42199f63f0d801b3 100644 (file)
@@ -4503,6 +4503,159 @@ static void cy_hangup(struct tty_struct *tty)
  * ---------------------------------------------------------------------
  */
 
+static void __devinit cy_init_card(struct cyclades_card *cinfo,
+               const unsigned int board)
+{
+       struct cyclades_port *info;
+       u32 mailbox;
+       unsigned int nports;
+       unsigned short chip_number;
+       int index, port;
+
+       if (cinfo->num_chips == -1) {   /* Cyclades-Z */
+               mailbox = readl(&((struct RUNTIME_9060 __iomem *)
+                                    cinfo->ctl_addr)->mail_box_0);
+               nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8;
+               cinfo->intr_enabled = 0;
+               cinfo->nports = 0;      /* Will be correctly set later, after
+                                          Z FW is loaded */
+               spin_lock_init(&cinfo->card_lock);
+               for (port = cinfo->first_line;
+                    port < cinfo->first_line + nports; port++) {
+                       info = &cy_port[port];
+                       info->magic = CYCLADES_MAGIC;
+                       info->type = PORT_STARTECH;
+                       info->card = board;
+                       info->line = port;
+                       info->chip_rev = 0;
+                       info->flags = STD_COM_FLAGS;
+                       info->tty = NULL;
+                       if (mailbox == ZO_V1)
+                               info->xmit_fifo_size = CYZ_FIFO_SIZE;
+                       else
+                               info->xmit_fifo_size =
+                                   4 * CYZ_FIFO_SIZE;
+                       info->cor1 = 0;
+                       info->cor2 = 0;
+                       info->cor3 = 0;
+                       info->cor4 = 0;
+                       info->cor5 = 0;
+                       info->tbpr = 0;
+                       info->tco = 0;
+                       info->rbpr = 0;
+                       info->rco = 0;
+                       info->custom_divisor = 0;
+                       info->close_delay = 5 * HZ / 10;
+                       info->closing_wait = CLOSING_WAIT_DELAY;
+                       info->icount.cts = info->icount.dsr =
+                           info->icount.rng = info->icount.dcd = 0;
+                       info->icount.rx = info->icount.tx = 0;
+                       info->icount.frame = info->icount.parity = 0;
+                       info->icount.overrun = info->icount.brk = 0;
+                       info->x_char = 0;
+                       info->event = 0;
+                       info->count = 0;
+                       info->blocked_open = 0;
+                       info->default_threshold = 0;
+                       info->default_timeout = 0;
+                       INIT_WORK(&info->tqueue, do_softint);
+                       init_waitqueue_head(&info->open_wait);
+                       init_waitqueue_head(&info->close_wait);
+                       init_waitqueue_head(&info->shutdown_wait);
+                       init_waitqueue_head(&info->delta_msr_wait);
+                       /* info->session */
+                       /* info->pgrp */
+                       info->read_status_mask = 0;
+                       /* info->timeout */
+                       /* Bentson's vars */
+                       info->jiffies[0] = 0;
+                       info->jiffies[1] = 0;
+                       info->jiffies[2] = 0;
+                       info->rflush_count = 0;
+#ifdef CONFIG_CYZ_INTR
+                       init_timer(&cyz_rx_full_timer[port]);
+                       cyz_rx_full_timer[port].function = NULL;
+#endif
+               }
+#ifndef CONFIG_CYZ_INTR
+               if (!timer_pending(&cyz_timerlist)) {
+                       mod_timer(&cyz_timerlist, jiffies + 1);
+#ifdef CY_PCI_DEBUG
+                       printk("Cyclades-Z polling initialized\n");
+#endif
+               }
+#endif                         /* CONFIG_CYZ_INTR */
+
+       } else {        /* Cyclom-Y of some kind */
+               index = cinfo->bus_index;
+               spin_lock_init(&cinfo->card_lock);
+               cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips;
+               for (port = cinfo->first_line;
+                    port < cinfo->first_line + cinfo->nports; port++) {
+                       info = &cy_port[port];
+                       info->magic = CYCLADES_MAGIC;
+                       info->type = PORT_CIRRUS;
+                       info->card = board;
+                       info->line = port;
+                       info->flags = STD_COM_FLAGS;
+                       info->tty = NULL;
+                       info->xmit_fifo_size = CyMAX_CHAR_FIFO;
+                       info->cor1 =
+                           CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS;
+                       info->cor2 = CyETC;
+                       info->cor3 = 0x08;      /* _very_ small rcv threshold */
+                       info->cor4 = 0;
+                       info->cor5 = 0;
+                       info->custom_divisor = 0;
+                       info->close_delay = 5 * HZ / 10;
+                       info->closing_wait = CLOSING_WAIT_DELAY;
+                       info->icount.cts = info->icount.dsr =
+                           info->icount.rng = info->icount.dcd = 0;
+                       info->icount.rx = info->icount.tx = 0;
+                       info->icount.frame = info->icount.parity = 0;
+                       info->icount.overrun = info->icount.brk = 0;
+                       chip_number = (port - cinfo->first_line) / 4;
+                       if ((info->chip_rev =
+                            readb(cinfo->base_addr +
+                                     (cy_chip_offset[chip_number] <<
+                                      index) + (CyGFRCR << index))) >=
+                           CD1400_REV_J) {
+                               /* It is a CD1400 rev. J or later */
+                               info->tbpr = baud_bpr_60[13];   /* Tx BPR */
+                               info->tco = baud_co_60[13];     /* Tx CO */
+                               info->rbpr = baud_bpr_60[13];   /* Rx BPR */
+                               info->rco = baud_co_60[13];     /* Rx CO */
+                               info->rflow = 0;
+                               info->rtsdtr_inv = 1;
+                       } else {
+                               info->tbpr = baud_bpr_25[13];   /* Tx BPR */
+                               info->tco = baud_co_25[13];     /* Tx CO */
+                               info->rbpr = baud_bpr_25[13];   /* Rx BPR */
+                               info->rco = baud_co_25[13];     /* Rx CO */
+                               info->rflow = 0;
+                               info->rtsdtr_inv = 0;
+                       }
+                       info->x_char = 0;
+                       info->event = 0;
+                       info->count = 0;
+                       info->blocked_open = 0;
+                       info->default_threshold = 0;
+                       info->default_timeout = 0;
+                       INIT_WORK(&info->tqueue, do_softint);
+                       init_waitqueue_head(&info->open_wait);
+                       init_waitqueue_head(&info->close_wait);
+                       init_waitqueue_head(&info->shutdown_wait);
+                       init_waitqueue_head(&info->delta_msr_wait);
+                       /* info->session */
+                       /* info->pgrp */
+                       info->read_status_mask =
+                           CyTIMEOUT | CySPECHAR | CyBREAK
+                           | CyPARITY | CyFRAME | CyOVERRUN;
+                       /* info->timeout */
+               }
+       }
+}
+
 /* initialize chips on Cyclom-Y card -- return number of valid
    chips (which is number of ports/4) */
 static unsigned short __init
@@ -5300,13 +5453,7 @@ static const struct tty_operations cy_ops = {
 
 static int __init cy_init(void)
 {
-       struct cyclades_port *info;
-       struct cyclades_card *cinfo;
-       int number_z_boards = 0;
-       int board, port, i, index;
-       unsigned long mailbox;
-       unsigned short chip_number;
-       int nports;
+       unsigned int i;
 
        cy_serial_driver = alloc_tty_driver(NR_PORTS);
        if (!cy_serial_driver)
@@ -5369,154 +5516,8 @@ static int __init cy_init(void)
        }
 
        /* initialize per-port data structures for each valid board found */
-       for (board = 0; board < cy_nboard; board++) {
-               cinfo = &cy_card[board];
-               if (cinfo->num_chips == -1) {   /* Cyclades-Z */
-                       number_z_boards++;
-                       mailbox = readl(&((struct RUNTIME_9060 __iomem *)
-                                            cy_card[board].ctl_addr)->
-                                          mail_box_0);
-                       nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8;
-                       cinfo->intr_enabled = 0;
-                       cinfo->nports = 0;      /* Will be correctly set later, after 
-                                                  Z FW is loaded */
-                       spin_lock_init(&cinfo->card_lock);
-                       for (port = cinfo->first_line;
-                            port < cinfo->first_line + nports; port++) {
-                               info = &cy_port[port];
-                               info->magic = CYCLADES_MAGIC;
-                               info->type = PORT_STARTECH;
-                               info->card = board;
-                               info->line = port;
-                               info->chip_rev = 0;
-                               info->flags = STD_COM_FLAGS;
-                               info->tty = NULL;
-                               if (mailbox == ZO_V1)
-                                       info->xmit_fifo_size = CYZ_FIFO_SIZE;
-                               else
-                                       info->xmit_fifo_size =
-                                           4 * CYZ_FIFO_SIZE;
-                               info->cor1 = 0;
-                               info->cor2 = 0;
-                               info->cor3 = 0;
-                               info->cor4 = 0;
-                               info->cor5 = 0;
-                               info->tbpr = 0;
-                               info->tco = 0;
-                               info->rbpr = 0;
-                               info->rco = 0;
-                               info->custom_divisor = 0;
-                               info->close_delay = 5 * HZ / 10;
-                               info->closing_wait = CLOSING_WAIT_DELAY;
-                               info->icount.cts = info->icount.dsr =
-                                   info->icount.rng = info->icount.dcd = 0;
-                               info->icount.rx = info->icount.tx = 0;
-                               info->icount.frame = info->icount.parity = 0;
-                               info->icount.overrun = info->icount.brk = 0;
-                               info->x_char = 0;
-                               info->event = 0;
-                               info->count = 0;
-                               info->blocked_open = 0;
-                               info->default_threshold = 0;
-                               info->default_timeout = 0;
-                               INIT_WORK(&info->tqueue, do_softint);
-                               init_waitqueue_head(&info->open_wait);
-                               init_waitqueue_head(&info->close_wait);
-                               init_waitqueue_head(&info->shutdown_wait);
-                               init_waitqueue_head(&info->delta_msr_wait);
-                               /* info->session */
-                               /* info->pgrp */
-                               info->read_status_mask = 0;
-                               /* info->timeout */
-                               /* Bentson's vars */
-                               info->jiffies[0] = 0;
-                               info->jiffies[1] = 0;
-                               info->jiffies[2] = 0;
-                               info->rflush_count = 0;
-#ifdef CONFIG_CYZ_INTR
-                               init_timer(&cyz_rx_full_timer[port]);
-                               cyz_rx_full_timer[port].function = NULL;
-#endif
-                       }
-                       continue;
-               } else {        /* Cyclom-Y of some kind */
-                       index = cinfo->bus_index;
-                       spin_lock_init(&cinfo->card_lock);
-                       cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips;
-                       for (port = cinfo->first_line;
-                            port < cinfo->first_line + cinfo->nports; port++) {
-                               info = &cy_port[port];
-                               info->magic = CYCLADES_MAGIC;
-                               info->type = PORT_CIRRUS;
-                               info->card = board;
-                               info->line = port;
-                               info->flags = STD_COM_FLAGS;
-                               info->tty = NULL;
-                               info->xmit_fifo_size = CyMAX_CHAR_FIFO;
-                               info->cor1 =
-                                   CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS;
-                               info->cor2 = CyETC;
-                               info->cor3 = 0x08;      /* _very_ small rcv threshold */
-                               info->cor4 = 0;
-                               info->cor5 = 0;
-                               info->custom_divisor = 0;
-                               info->close_delay = 5 * HZ / 10;
-                               info->closing_wait = CLOSING_WAIT_DELAY;
-                               info->icount.cts = info->icount.dsr =
-                                   info->icount.rng = info->icount.dcd = 0;
-                               info->icount.rx = info->icount.tx = 0;
-                               info->icount.frame = info->icount.parity = 0;
-                               info->icount.overrun = info->icount.brk = 0;
-                               chip_number = (port - cinfo->first_line) / 4;
-                               if ((info->chip_rev =
-                                    readb(cinfo->base_addr +
-                                             (cy_chip_offset[chip_number] <<
-                                              index) + (CyGFRCR << index))) >=
-                                   CD1400_REV_J) {
-                                       /* It is a CD1400 rev. J or later */
-                                       info->tbpr = baud_bpr_60[13];   /* Tx BPR */
-                                       info->tco = baud_co_60[13];     /* Tx CO */
-                                       info->rbpr = baud_bpr_60[13];   /* Rx BPR */
-                                       info->rco = baud_co_60[13];     /* Rx CO */
-                                       info->rflow = 0;
-                                       info->rtsdtr_inv = 1;
-                               } else {
-                                       info->tbpr = baud_bpr_25[13];   /* Tx BPR */
-                                       info->tco = baud_co_25[13];     /* Tx CO */
-                                       info->rbpr = baud_bpr_25[13];   /* Rx BPR */
-                                       info->rco = baud_co_25[13];     /* Rx CO */
-                                       info->rflow = 0;
-                                       info->rtsdtr_inv = 0;
-                               }
-                               info->x_char = 0;
-                               info->event = 0;
-                               info->count = 0;
-                               info->blocked_open = 0;
-                               info->default_threshold = 0;
-                               info->default_timeout = 0;
-                               INIT_WORK(&info->tqueue, do_softint);
-                               init_waitqueue_head(&info->open_wait);
-                               init_waitqueue_head(&info->close_wait);
-                               init_waitqueue_head(&info->shutdown_wait);
-                               init_waitqueue_head(&info->delta_msr_wait);
-                               /* info->session */
-                               /* info->pgrp */
-                               info->read_status_mask =
-                                   CyTIMEOUT | CySPECHAR | CyBREAK
-                                   | CyPARITY | CyFRAME | CyOVERRUN;
-                               /* info->timeout */
-                       }
-               }
-       }
-
-#ifndef CONFIG_CYZ_INTR
-       if (number_z_boards) {
-               mod_timer(&cyz_timerlist, jiffies + 1);
-#ifdef CY_PCI_DEBUG
-               printk("Cyclades-Z polling initialized\n");
-#endif
-       }
-#endif                         /* CONFIG_CYZ_INTR */
+       for (i = 0; i < cy_nboard; i++)
+               cy_init_card(&cy_card[i], i);
 
        return 0;