Merge branch 'hwmon-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
[pandora-kernel.git] / drivers / serial / ip22zilog.c
index 3420428..c3abfb3 100644 (file)
@@ -14,7 +14,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/tty.h>
@@ -252,8 +251,7 @@ static void ip22zilog_maybe_update_regs(struct uart_ip22zilog_port *up,
 }
 
 static void ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
-                                  struct zilog_channel *channel,
-                                  struct pt_regs *regs)
+                                  struct zilog_channel *channel)
 {
        struct tty_struct *tty = up->port.info->tty;    /* XXX info==NULL? */
 
@@ -319,7 +317,7 @@ static void ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
                        else if (r1 & CRC_ERR)
                                flag = TTY_FRAME;
                }
-               if (uart_handle_sysrq_char(&up->port, ch, regs))
+               if (uart_handle_sysrq_char(&up->port, ch))
                        goto next_char;
 
                if (up->port.ignore_status_mask == 0xff ||
@@ -339,8 +337,7 @@ static void ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
 }
 
 static void ip22zilog_status_handle(struct uart_ip22zilog_port *up,
-                                  struct zilog_channel *channel,
-                                  struct pt_regs *regs)
+                                  struct zilog_channel *channel)
 {
        unsigned char status;
 
@@ -443,7 +440,7 @@ ack_tx_int:
        ZS_WSYNC(channel);
 }
 
-static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
 {
        struct uart_ip22zilog_port *up = dev_id;
 
@@ -462,9 +459,9 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id, struct pt_regs *re
                        ZS_WSYNC(channel);
 
                        if (r3 & CHARxIP)
-                               ip22zilog_receive_chars(up, channel, regs);
+                               ip22zilog_receive_chars(up, channel);
                        if (r3 & CHAEXT)
-                               ip22zilog_status_handle(up, channel, regs);
+                               ip22zilog_status_handle(up, channel);
                        if (r3 & CHATxIP)
                                ip22zilog_transmit_chars(up, channel);
                }
@@ -481,9 +478,9 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id, struct pt_regs *re
                        ZS_WSYNC(channel);
 
                        if (r3 & CHBRxIP)
-                               ip22zilog_receive_chars(up, channel, regs);
+                               ip22zilog_receive_chars(up, channel);
                        if (r3 & CHBEXT)
-                               ip22zilog_status_handle(up, channel, regs);
+                               ip22zilog_status_handle(up, channel);
                        if (r3 & CHBTxIP)
                                ip22zilog_transmit_chars(up, channel);
                }
@@ -842,8 +839,8 @@ ip22zilog_convert_to_zs(struct uart_ip22zilog_port *up, unsigned int cflag,
 
 /* The port lock is not held.  */
 static void
-ip22zilog_set_termios(struct uart_port *port, struct termios *termios,
-                     struct termios *old)
+ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
+                     struct ktermios *old)
 {
        struct uart_ip22zilog_port *up = (struct uart_ip22zilog_port *) port;
        unsigned long flags;
@@ -924,13 +921,7 @@ static int zilog_irq = -1;
 
 static void * __init alloc_one_table(unsigned long size)
 {
-       void *ret;
-
-       ret = kmalloc(size, GFP_KERNEL);
-       if (ret != NULL)
-               memset(ret, 0, size);
-
-       return ret;
+       return kzalloc(size, GFP_KERNEL);
 }
 
 static void __init ip22zilog_alloc_tables(void)
@@ -1143,9 +1134,8 @@ static void __init ip22zilog_prepare(void)
                up[(chip * 2) + 1].port.fifosize = 1;
                up[(chip * 2) + 1].port.ops = &ip22zilog_pops;
                up[(chip * 2) + 1].port.type = PORT_IP22ZILOG;
-               up[(chip * 2) + 1].port.flags |= IP22ZILOG_FLAG_IS_CHANNEL_A;
                up[(chip * 2) + 1].port.line = (chip * 2) + 1;
-               up[(chip * 2) + 1].flags = 0;
+               up[(chip * 2) + 1].flags |= IP22ZILOG_FLAG_IS_CHANNEL_A;
        }
 }
 
@@ -1230,13 +1220,27 @@ static int __init ip22zilog_init(void)
 static void __exit ip22zilog_exit(void)
 {
        int i;
+       struct uart_ip22zilog_port *up;
 
        for (i = 0; i < NUM_CHANNELS; i++) {
-               struct uart_ip22zilog_port *up = &ip22zilog_port_table[i];
+               up = &ip22zilog_port_table[i];
 
                uart_remove_one_port(&ip22zilog_reg, &up->port);
        }
 
+       /* Free IO mem */
+       up = &ip22zilog_port_table[0];
+       for (i = 0; i < NUM_IP22ZILOG; i++) {
+               if (up[(i * 2) + 0].port.mapbase) {
+                  iounmap((void*)up[(i * 2) + 0].port.mapbase);
+                  up[(i * 2) + 0].port.mapbase = 0;
+               }
+               if (up[(i * 2) + 1].port.mapbase) {
+                       iounmap((void*)up[(i * 2) + 1].port.mapbase);
+                       up[(i * 2) + 1].port.mapbase = 0;
+               }
+       }
+
        uart_unregister_driver(&ip22zilog_reg);
 }