Merge branch 'drm-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied...
[sfrench/cifs-2.6.git] / drivers / char / cyclades.c
index 31bc8e41587ebee601a8fb490aeac60d47f84e95..16dc5d1d3cb4f2715be9889d3e2a8bf822dfefec 100644 (file)
@@ -1,7 +1,6 @@
 #undef BLOCKMOVE
 #define        Z_WAKE
 #undef Z_EXT_CHARS_IN_BUFFER
-static char rcsid[] = "$Revision: 2.3.2.20 $$Date: 2004/02/25 18:14:16 $";
 
 /*
  *  linux/drivers/char/cyclades.c
@@ -592,6 +591,8 @@ static char rcsid[] = "$Revision: 2.3.2.20 $$Date: 2004/02/25 18:14:16 $";
  *
  */
 
+#define CY_VERSION     "2.4"
+
 /* If you need to install more boards than NR_CARDS, change the constant
    in the definition below. No other change is necessary to support up to
    eight boards. Beyond that you'll have to extend cy_isa_addresses. */
@@ -624,9 +625,9 @@ static char rcsid[] = "$Revision: 2.3.2.20 $$Date: 2004/02/25 18:14:16 $";
 #undef CY_PCI_DEBUG
 
 #if 0
-#define PAUSE __asm__("nop");
+#define PAUSE __asm__("nop")
 #else
-#define PAUSE ;
+#define PAUSE do {} while (0)
 #endif
 
 /*
@@ -697,8 +698,6 @@ static void cy_send_xchar(struct tty_struct *tty, char ch);
 
 #define STD_COM_FLAGS (0)
 
-#define        JIFFIES_DIFF(n, j)      ((j) - (n))
-
 static struct tty_driver *cy_serial_driver;
 
 #ifdef CONFIG_ISA
@@ -830,17 +829,18 @@ static unsigned short cy_pci_nboard;
 static unsigned short cy_isa_nboard;
 static unsigned short cy_nboard;
 #ifdef CONFIG_PCI
-static unsigned short cy_pci_dev_id[] = {
-       PCI_DEVICE_ID_CYCLOM_Y_Lo,      /* PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_Y_Hi,      /* PCI > 1Mb */
-       PCI_DEVICE_ID_CYCLOM_4Y_Lo,     /* 4Y PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_4Y_Hi,     /* 4Y PCI > 1Mb */
-       PCI_DEVICE_ID_CYCLOM_8Y_Lo,     /* 8Y PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_8Y_Hi,     /* 8Y PCI > 1Mb */
-       PCI_DEVICE_ID_CYCLOM_Z_Lo,      /* Z PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_Z_Hi,      /* Z PCI > 1Mb */
-       0                       /* end of table */
+static struct pci_device_id cy_pci_dev_id[] __devinitdata = {
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Lo) },      /* PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Hi) },      /* PCI > 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Lo) },     /* 4Y PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Hi) },     /* 4Y PCI > 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Lo) },     /* 8Y PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Hi) },     /* 8Y PCI > 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Lo) },      /* Z PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Hi) },      /* Z PCI > 1Mb */
+       { }                     /* end of table */
 };
+MODULE_DEVICE_TABLE(pci, cy_pci_dev_id);
 #endif
 
 static void cy_start(struct tty_struct *);
@@ -870,26 +870,22 @@ static inline int serial_paranoia_check(struct cyclades_port *info,
                char *name, const char *routine)
 {
 #ifdef SERIAL_PARANOIA_CHECK
-       static const char *badmagic =
-               "cyc Warning: bad magic number for serial struct (%s) in %s\n";
-       static const char *badinfo =
-               "cyc Warning: null cyclades_port for (%s) in %s\n";
-       static const char *badrange =
-               "cyc Warning: cyclades_port out of range for (%s) in %s\n";
-
        if (!info) {
-               printk(badinfo, name, routine);
+               printk("cyc Warning: null cyclades_port for (%s) in %s\n",
+                               name, routine);
                return 1;
        }
 
        if ((long)info < (long)(&cy_port[0]) ||
                        (long)(&cy_port[NR_PORTS]) < (long)info) {
-               printk(badrange, name, routine);
+               printk("cyc Warning: cyclades_port out of range for (%s) in "
+                               "%s\n", name, routine);
                return 1;
        }
 
        if (info->magic != CYCLADES_MAGIC) {
-               printk(badmagic, name, routine);
+               printk("cyc Warning: bad magic number for serial struct (%s) "
+                               "in %s\n", name, routine);
                return 1;
        }
 #endif
@@ -991,12 +987,12 @@ static int cyy_issue_cmd(void __iomem * base_addr, u_char cmd, int index)
        /* if the CCR never cleared, the previous command
           didn't finish within the "reasonable time" */
        if (i == 100)
-               return (-1);
+               return -1;
 
        /* Issue the new command */
        cy_writeb(base_addr + (CyCCR << index), cmd);
 
-       return (0);
+       return 0;
 }                              /* cyy_issue_cmd */
 
 #ifdef CONFIG_ISA
@@ -1511,7 +1507,7 @@ cyz_fetch_msg(struct cyclades_card *cinfo,
 
        firm_id = cinfo->base_addr + ID_ADDRESS;
        if (!ISZLOADED(*cinfo)) {
-               return (-1);
+               return -1;
        }
        zfw_ctrl = cinfo->base_addr + (cy_readl(&firm_id->zfwctrl_addr) &
                        0xfffff);
@@ -1542,7 +1538,7 @@ cyz_issue_cmd(struct cyclades_card *cinfo,
 
        firm_id = cinfo->base_addr + ID_ADDRESS;
        if (!ISZLOADED(*cinfo)) {
-               return (-1);
+               return -1;
        }
        zfw_ctrl = cinfo->base_addr + (cy_readl(&firm_id->zfwctrl_addr) &
                        0xfffff);
@@ -1553,7 +1549,7 @@ cyz_issue_cmd(struct cyclades_card *cinfo,
            &((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->pci_doorbell;
        while ((cy_readl(pci_doorbell) & 0xff) != 0) {
                if (index++ == 1000) {
-                       return ((int)(cy_readl(pci_doorbell) & 0xff));
+                       return (int)(cy_readl(pci_doorbell) & 0xff);
                }
                udelay(50L);
        }
@@ -1561,7 +1557,7 @@ cyz_issue_cmd(struct cyclades_card *cinfo,
        cy_writel(&board_ctrl->hcmd_param, param);
        cy_writel(pci_doorbell, (long)cmd);
 
-       return (0);
+       return 0;
 }                              /* cyz_issue_cmd */
 
 static void
@@ -1649,7 +1645,8 @@ cyz_handle_rx(struct cyclades_port *info,
                                char_count = rx_put - rx_get;
                        else
                                char_count = rx_put - rx_get + rx_bufsize;
-                       if (char_count >= cy_readl(&buf_ctrl->rx_threshold)) {
+                       if (char_count >= (int)cy_readl(&buf_ctrl->
+                                       rx_threshold)) {
                                cy_sched_event(info, Cy_EVENT_Z_RX_FULL);
                        }
 #endif
@@ -1959,8 +1956,6 @@ static void cyz_poll(unsigned long arg)
                cyz_timerlist.expires = jiffies + cyz_polling_cycle;
        }
        add_timer(&cyz_timerlist);
-
-       return;
 }                              /* cyz_poll */
 
 #endif                         /* CONFIG_CYZ_INTR */
@@ -2318,7 +2313,6 @@ static void shutdown(struct cyclades_port *info)
 #ifdef CY_DEBUG_OPEN
        printk(" cyc shutdown done\n");
 #endif
-       return;
 }                              /* shutdown */
 
 /*
@@ -2349,8 +2343,7 @@ block_til_ready(struct tty_struct *tty, struct file *filp,
                if (info->flags & ASYNC_CLOSING) {
                        interruptible_sleep_on(&info->close_wait);
                }
-               return ((info->
-                        flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS);
+               return (info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
        }
 
        /*
@@ -2629,8 +2622,7 @@ static int cy_open(struct tty_struct *tty, struct file *filp)
        if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) {
                if (info->flags & ASYNC_CLOSING)
                        interruptible_sleep_on(&info->close_wait);
-               return ((info->
-                        flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS);
+               return (info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
        }
 
        /*
@@ -2727,7 +2719,7 @@ static void cy_wait_until_sent(struct tty_struct *tty, int timeout)
                                break;
                }
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
        }
        /* Run one more char cycle */
        msleep_interruptible(jiffies_to_msecs(char_time * 5));
@@ -2869,7 +2861,6 @@ static void cy_close(struct tty_struct *tty, struct file *filp)
 #endif
 
        CY_UNLOCK(info, flags);
-       return;
 }                              /* cy_close */
 
 /* This routine gets called when tty_write has put something into
@@ -2952,7 +2943,7 @@ static void cy_put_char(struct tty_struct *tty, unsigned char ch)
                return;
 
        CY_LOCK(info, flags);
-       if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
+       if (info->xmit_cnt >= (int)(SERIAL_XMIT_SIZE - 1)) {
                CY_UNLOCK(info, flags);
                return;
        }
@@ -3053,7 +3044,7 @@ static int cy_chars_in_buffer(struct tty_struct *tty)
 #ifdef CY_DEBUG_IO
                printk("cyc:cy_chars_in_buffer ttyC%d %d\n", info->line, info->xmit_cnt + char_count);  /* */
 #endif
-               return (info->xmit_cnt + char_count);
+               return info->xmit_cnt + char_count;
        }
 #endif                         /* Z_EXT_CHARS_IN_BUFFER */
 }                              /* cy_chars_in_buffer */
@@ -3510,6 +3501,7 @@ get_serial_info(struct cyclades_port *info,
        tmp.irq = cinfo->irq;
        tmp.flags = info->flags;
        tmp.close_delay = info->close_delay;
+       tmp.closing_wait = info->closing_wait;
        tmp.baud_base = info->baud;
        tmp.custom_divisor = info->custom_divisor;
        tmp.hub6 = 0;           /*!!! */
@@ -3918,7 +3910,7 @@ static int set_threshold(struct cyclades_port *info, unsigned long value)
                cyy_issue_cmd(base_addr, CyCOR_CHANGE | CyCOR3ch, index);
                CY_UNLOCK(info, flags);
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
        }
        return 0;
 }                              /* set_threshold */
@@ -3942,7 +3934,7 @@ get_threshold(struct cyclades_port *info, unsigned long __user * value)
                tmp = cy_readb(base_addr + (CyCOR3 << index)) & CyREC_FIFO;
                return put_user(tmp, value);
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
                return 0;
        }
 }                              /* get_threshold */
@@ -3979,7 +3971,7 @@ static int set_timeout(struct cyclades_port *info, unsigned long value)
                cy_writeb(base_addr + (CyRTPR << index), value & 0xff);
                CY_UNLOCK(info, flags);
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
        }
        return 0;
 }                              /* set_timeout */
@@ -4002,7 +3994,7 @@ static int get_timeout(struct cyclades_port *info, unsigned long __user * value)
                tmp = cy_readb(base_addr + (CyRTPR << index));
                return put_user(tmp, value);
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
                return 0;
        }
 }                              /* get_timeout */
@@ -4249,8 +4241,6 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
            (tty->termios->c_cflag & CLOCAL))
                wake_up_interruptible(&info->open_wait);
 #endif
-
-       return;
 }                              /* cy_set_termios */
 
 /* This function is used to send a high-priority XON/XOFF character to
@@ -4337,8 +4327,6 @@ static void cy_throttle(struct tty_struct *tty)
                        info->throttle = 1;
                }
        }
-
-       return;
 }                              /* cy_throttle */
 
 /*
@@ -4396,8 +4384,6 @@ static void cy_unthrottle(struct tty_struct *tty)
                        info->throttle = 0;
                }
        }
-
-       return;
 }                              /* cy_unthrottle */
 
 /* cy_start and cy_stop provide software output flow control as a
@@ -4434,10 +4420,8 @@ static void cy_stop(struct tty_struct *tty)
                          cy_readb(base_addr + (CySRER << index)) & ~CyTxRdy);
                CY_UNLOCK(info, flags);
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
        }
-
-       return;
 }                              /* cy_stop */
 
 static void cy_start(struct tty_struct *tty)
@@ -4470,10 +4454,8 @@ static void cy_start(struct tty_struct *tty)
                          cy_readb(base_addr + (CySRER << index)) | CyTxRdy);
                CY_UNLOCK(info, flags);
        } else {
-               // Nothing to do!
+               /* Nothing to do! */
        }
-
-       return;
 }                              /* cy_start */
 
 static void cy_flush_buffer(struct tty_struct *tty)
@@ -4508,7 +4490,6 @@ static void cy_flush_buffer(struct tty_struct *tty)
                CY_UNLOCK(info, flags);
        }
        tty_wakeup(tty);
-       wake_up_interruptible(&tty->write_wait);
 }                              /* cy_flush_buffer */
 
 /*
@@ -4661,7 +4642,7 @@ static int __init cy_detect_isa(void)
        for (i = 0; i < NR_ISA_ADDRS; i++) {
                unsigned int isa_address = cy_isa_addresses[i];
                if (isa_address == 0x0000) {
-                       return (nboard);
+                       return nboard;
                }
 
                /* probe for CD1400... */
@@ -4691,7 +4672,7 @@ static int __init cy_detect_isa(void)
                        printk("but no more channels are available.\n");
                        printk("Change NR_PORTS in cyclades.c and recompile "
                                        "kernel.\n");
-                       return (nboard);
+                       return nboard;
                }
                /* fill the next cy_card structure available */
                for (j = 0; j < NR_CARDS; j++) {
@@ -4704,7 +4685,7 @@ static int __init cy_detect_isa(void)
                        printk("but no more cards can be used .\n");
                        printk("Change NR_CARDS in cyclades.c and recompile "
                                        "kernel.\n");
-                       return (nboard);
+                       return nboard;
                }
 
                /* allocate IRQ */
@@ -4713,7 +4694,7 @@ static int __init cy_detect_isa(void)
                        printk("Cyclom-Y/ISA found at 0x%lx ",
                                (unsigned long)cy_isa_address);
                        printk("but could not allocate IRQ#%d.\n", cy_isa_irq);
-                       return (nboard);
+                       return nboard;
                }
 
                /* set cy_card */
@@ -4734,9 +4715,9 @@ static int __init cy_detect_isa(void)
                        cy_isa_nchan, cy_next_channel);
                cy_next_channel += cy_isa_nchan;
        }
-       return (nboard);
+       return nboard;
 #else
-       return (0);
+       return 0;
 #endif                         /* CONFIG_ISA */
 }                              /* cy_detect_isa */
 
@@ -4779,7 +4760,7 @@ static int __init cy_detect_pci(void)
 
        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]) != 0) {
+               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 */
@@ -4867,7 +4848,7 @@ static int __init cy_detect_pci(void)
                                printk("but no channels are available.\n");
                                printk("Change NR_PORTS in cyclades.c and "
                                                "recompile kernel.\n");
-                               return (i);
+                               return i;
                        }
                        /* fill the next cy_card structure available */
                        for (j = 0; j < NR_CARDS; j++) {
@@ -4880,7 +4861,7 @@ static int __init cy_detect_pci(void)
                                printk("but no more cards can be used.\n");
                                printk("Change NR_CARDS in cyclades.c and "
                                                "recompile kernel.\n");
-                               return (i);
+                               return i;
                        }
 
                        /* allocate IRQ */
@@ -4890,7 +4871,7 @@ static int __init cy_detect_pci(void)
                                        (ulong) cy_pci_phys2);
                                printk("but could not allocate IRQ%d.\n",
                                        cy_pci_irq);
-                               return (i);
+                               return i;
                        }
 
                        /* set cy_card */
@@ -5029,7 +5010,7 @@ static int __init cy_detect_pci(void)
                                cy_writel(&((struct RUNTIME_9060 *)
                                        (cy_pci_addr0))->loc_addr_base,
                                        WIN_CREG);
-                               PAUSE
+                               PAUSE;
                                printk("Cyclades-8Zo/PCI: FPGA id %lx, ver "
                                        "%lx\n", (ulong) (0xff &
                                        cy_readl(&((struct CUSTOM_REG *)
@@ -5050,7 +5031,7 @@ static int __init cy_detect_pci(void)
                           ensures that the driver will not attempt to talk to
                           the board until it has been properly initialized.
                         */
-                       PAUSE
+                       PAUSE;
                        if ((mailbox == ZO_V1) || (mailbox == ZO_V2))
                                cy_writel(cy_pci_addr2 + ID_ADDRESS, 0L);
 
@@ -5064,7 +5045,7 @@ static int __init cy_detect_pci(void)
                                        "no channels are available.\nChange "
                                        "NR_PORTS in cyclades.c and recompile "
                                        "kernel.\n", (ulong)cy_pci_phys2);
-                               return (i);
+                               return i;
                        }
 
                        /* fill the next cy_card structure available */
@@ -5077,7 +5058,7 @@ static int __init cy_detect_pci(void)
                                        "no more cards can be used.\nChange "
                                        "NR_CARDS in cyclades.c and recompile "
                                        "kernel.\n", (ulong)cy_pci_phys2);
-                               return (i);
+                               return i;
                        }
 #ifdef CONFIG_CYZ_INTR
                        /* allocate IRQ only if board has an IRQ */
@@ -5089,7 +5070,7 @@ static int __init cy_detect_pci(void)
                                                "but could not allocate "
                                                "IRQ%d.\n", (ulong)cy_pci_phys2,
                                                cy_pci_irq);
-                                       return (i);
+                                       return i;
                                }
                        }
 #endif                         /* CONFIG_CYZ_INTR */
@@ -5149,7 +5130,7 @@ static int __init cy_detect_pci(void)
                printk("Cyclades-Z/PCI: New Cyclades-Z board.  FPGA not "
                                "loaded\n");
 #endif
-               PAUSE
+               PAUSE;
                /* This must be the new Cyclades-Ze/PCI. */
                cy_pci_nchan = ZE_V1_NPORTS;
 
@@ -5158,7 +5139,7 @@ static int __init cy_detect_pci(void)
                                "are available.\nChange NR_PORTS in cyclades.c "
                                "and recompile kernel.\n",
                                (ulong) cy_pci_phys2);
-                       return (i);
+                       return i;
                }
 
                /* fill the next cy_card structure available */
@@ -5171,7 +5152,7 @@ static int __init cy_detect_pci(void)
                                "cards can be used.\nChange NR_CARDS in "
                                "cyclades.c and recompile kernel.\n",
                                (ulong) cy_pci_phys2);
-                       return (i);
+                       return i;
                }
 #ifdef CONFIG_CYZ_INTR
                /* allocate IRQ only if board has an IRQ */
@@ -5183,7 +5164,7 @@ static int __init cy_detect_pci(void)
                                        (ulong) cy_pci_phys2);
                                printk("but could not allocate IRQ%d.\n",
                                        cy_pci_irq);
-                               return (i);
+                               return i;
                        }
                }
 #endif                         /* CONFIG_CYZ_INTR */
@@ -5222,9 +5203,9 @@ static int __init cy_detect_pci(void)
                        "used.\nChange NR_CARDS in cyclades.c and recompile "
                        "kernel.\n", (unsigned int)Ze_phys2[0]);
        }
-       return (i);
+       return i;
 #else
-       return (0);
+       return 0;
 #endif                         /* ifdef CONFIG_PCI */
 }                              /* cy_detect_pci */
 
@@ -5234,16 +5215,7 @@ static int __init cy_detect_pci(void)
  */
 static inline void show_version(void)
 {
-       char *rcsvers, *rcsdate, *tmp;
-       rcsvers = strchr(rcsid, ' ');
-       rcsvers++;
-       tmp = strchr(rcsvers, ' ');
-       *tmp++ = '\0';
-       rcsdate = strchr(tmp, ' ');
-       rcsdate++;
-       tmp = strrchr(rcsdate, ' ');
-       *tmp = '\0';
-       printk("Cyclades driver %s %s\n", rcsvers, rcsdate);
+       printk("Cyclades driver " CY_VERSION "\n");
        printk("        built %s %s\n", __DATE__, __TIME__);
 }                              /* show_version */
 
@@ -5272,14 +5244,11 @@ cyclades_get_proc_info(char *buf, char **start, off_t offset, int length,
                if (info->count)
                        size = sprintf(buf + len, "%3d %8lu %10lu %8lu %10lu "
                                "%8lu %9lu %6ld\n", info->line,
-                               JIFFIES_DIFF(info->idle_stats.in_use,
-                                       cur_jifs) / HZ,
+                               (cur_jifs - info->idle_stats.in_use) / HZ,
                                info->idle_stats.xmit_bytes,
-                               JIFFIES_DIFF(info->idle_stats.xmit_idle,
-                                       cur_jifs) / HZ,
+                               (cur_jifs - info->idle_stats.xmit_idle) / HZ,
                                info->idle_stats.recv_bytes,
-                               JIFFIES_DIFF(info->idle_stats.recv_idle,
-                                       cur_jifs) / HZ,
+                               (cur_jifs - info->idle_stats.recv_idle) / HZ,
                                info->idle_stats.overruns,
                                (long)info->tty->ldisc.num);
                else