Char: cyclades, move card entries init into function

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>
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c
index e5de040..85c734b 100644
--- a/drivers/char/cyclades.c
+++ b/drivers/char/cyclades.c
@@ -4503,6 +4503,159 @@
  * ---------------------------------------------------------------------
  */
 
+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 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 @@
 	}
 
 	/* 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;