linux-mips
[Top] [All Lists]

Re: [PATCH] AMD Au1xx0 serial: claim the memory resource

To: Sergei Shtylylov <sshtylyov@ru.mvista.com>
Subject: Re: [PATCH] AMD Au1xx0 serial: claim the memory resource
From: Pete Popov <ppopov@embeddedalley.com>
Date: Fri, 30 Dec 2005 12:36:36 -0800
Cc: rmk+serial@arm.linux.org.uk, Manish Lachwani <mlachwani@mvista.com>, Linux MIPS <linux-mips@linux-mips.org>, Jordan Crouse <jordan.crouse@amd.com>
In-reply-to: <43B58548.4050208@ru.mvista.com>
Organization: Embedded Alley Solutions, Inc
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <43B58548.4050208@ru.mvista.com>
Reply-to: ppopov@embeddedalley.com
Sender: linux-mips-bounce@linux-mips.org
I think the new 8250 based driver is already upstream so this one should
be nuked anyway at some point.

Pete

On Fri, 2005-12-30 at 22:06 +0300, Sergei Shtylylov wrote:
> Hello.
> 
>      We've noticed that Au1x00 UART driver (drivers/serial/au1x00_uart.c)
> wasn't claiming its memory resources (in fact, as the heading comment had it,
> it wasn't doing this almost intentionally :-), so decided to add that
> cabability, cleaning the driver from a lot of unneeded code brought in during
> presumably very quick cut-and-pasting the driver from 8250.c: like handling of
> I/O port, ioremap() and PCMCIA cases which don't at all apply to Au1xx0 UARTs
> -- the KSEG1-mapped UART addresses are always taken from <asm-mips/serial.h>,
> so it was easy to get physical addresses back from them.
> 
> WBR, Sergei
> 
> Sighed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
> 
> 
> plain text document attachment (au1x00_uart-claim-memory.patch)
> diff --git a/drivers/serial/au1x00_uart.c b/drivers/serial/au1x00_uart.c
> index 878e0f3..6f4acc9 100644
> --- a/drivers/serial/au1x00_uart.c
> +++ b/drivers/serial/au1x00_uart.c
> @@ -12,12 +12,8 @@
>   *
>   * A note about mapbase / membase
>   *
> - *  mapbase is the physical address of the IO port.  Currently, we don't
> - *  support this very well, and it may well be dropped from this driver
> - *  in future.  As such, mapbase should be NULL.
> - *
> - *  membase is an 'ioremapped' cookie.  This is compatible with the old
> - *  serial.c driver, and is currently the preferred form.
> + *  mapbase is the physical address of the IO port.
> + *  membase is an 'ioremapped' cookie.
>   */
>  #include <linux/config.h>
>  #include <linux/module.h>
> @@ -157,9 +153,6 @@ static void autoconfig(struct uart_8250_
>  
>       up->port.fifosize = uart_config[up->port.type].dfl_xmit_fifo_size;
>  
> -     if (up->port.type == PORT_UNKNOWN)
> -             goto out;
> -
>       /*
>        * Reset the UART.
>        */
> @@ -171,7 +164,6 @@ static void autoconfig(struct uart_8250_
>       (void)serial_in(up, UART_RX);
>       serial_outp(up, UART_IER, 0);
>  
> - out:
>       spin_unlock_irqrestore(&up->port.lock, flags);
>  //   restore_flags(flags);
>       DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
> @@ -870,122 +862,35 @@ serial8250_pm(struct uart_port *port, un
>       }
>  }
>  
> -/*
> - * Resource handling.  This is complicated by the fact that resources
> - * depend on the port type.  Maybe we should be claiming the standard
> - * 8250 ports, and then trying to get other resources as necessary?
> - */
> -static int
> -serial8250_request_std_resource(struct uart_8250_port *up, struct resource 
> **res)
> -{
> -     unsigned int size = 8 << up->port.regshift;
> -     int ret = 0;
> -
> -     switch (up->port.iotype) {
> -     case SERIAL_IO_MEM:
> -             if (up->port.mapbase) {
> -                     *res = request_mem_region(up->port.mapbase, size, 
> "serial");
> -                     if (!*res)
> -                             ret = -EBUSY;
> -             }
> -             break;
> -
> -     case SERIAL_IO_HUB6:
> -     case SERIAL_IO_PORT:
> -             *res = request_region(up->port.iobase, size, "serial");
> -             if (!*res)
> -                     ret = -EBUSY;
> -             break;
> -     }
> -     return ret;
> -}
> -
> -
>  static void serial8250_release_port(struct uart_port *port)
>  {
>       struct uart_8250_port *up = (struct uart_8250_port *)port;
> -     unsigned long start, offset = 0, size = 0;
> -
> -     size <<= up->port.regshift;
> -
> -     switch (up->port.iotype) {
> -     case SERIAL_IO_MEM:
> -             if (up->port.mapbase) {
> -                     /*
> -                      * Unmap the area.
> -                      */
> -                     iounmap(up->port.membase);
> -                     up->port.membase = NULL;
> -
> -                     start = up->port.mapbase;
>  
> -                     if (size)
> -                             release_mem_region(start + offset, size);
> -                     release_mem_region(start, 8 << up->port.regshift);
> -             }
> -             break;
> -
> -     case SERIAL_IO_HUB6:
> -     case SERIAL_IO_PORT:
> -             start = up->port.iobase;
> -
> -             if (size)
> -                     release_region(start + offset, size);
> -             release_region(start + offset, 8 << up->port.regshift);
> -             break;
> -
> -     default:
> -             break;
> -     }
> +     if (up->port.mapbase)
> +             release_mem_region(up->port.mapbase, 0x100000);
>  }
>  
>  static int serial8250_request_port(struct uart_port *port)
>  {
>       struct uart_8250_port *up = (struct uart_8250_port *)port;
> -     struct resource *res = NULL, *res_rsa = NULL;
> -     int ret = 0;
>  
> -     ret = serial8250_request_std_resource(up, &res);
> -
> -     /*
> -      * If we have a mapbase, then request that as well.
> -      */
> -     if (ret == 0 && up->port.flags & UPF_IOREMAP) {
> -             int size = res->end - res->start + 1;
> -
> -             up->port.membase = ioremap(up->port.mapbase, size);
> -             if (!up->port.membase)
> -                     ret = -ENOMEM;
> -     }
> +     if (up->port.mapbase &&
> +         request_mem_region(up->port.mapbase, 0x100000, "Au1x00 UART") == 
> NULL)
> +             return -EBUSY;
>  
> -     if (ret < 0) {
> -             if (res_rsa)
> -                     release_resource(res_rsa);
> -             if (res)
> -                     release_resource(res);
> -     }
> -     return ret;
> +     return 0;
>  }
>  
>  static void serial8250_config_port(struct uart_port *port, int flags)
>  {
>       struct uart_8250_port *up = (struct uart_8250_port *)port;
> -     struct resource *res_std = NULL, *res_rsa = NULL;
> -     int probeflags = PROBE_ANY;
>  
> -     probeflags &= ~PROBE_RSA;
> +     if (up->port.mapbase &&
> +         request_mem_region(up->port.mapbase, 0x100000, "Au1x00 UART") == 
> NULL)
> +             return;
>  
>       if (flags & UART_CONFIG_TYPE)
> -             autoconfig(up, probeflags);
> -
> -     /*
> -      * If the port wasn't an RSA port, release the resource.
> -      */
> -     if (up->port.type != PORT_RSA && res_rsa)
> -             release_resource(res_rsa);
> -
> -     if (up->port.type == PORT_UNKNOWN && res_std)
> -             release_resource(res_std);
> +             autoconfig(up, PROBE_ANY);
>  }
>  
>  static int
> @@ -1049,6 +954,7 @@ static void __init serial8250_isa_init_p
>               up->port.flags    = old_serial_port[i].flags;
>               up->port.hub6     = old_serial_port[i].hub6;
>               up->port.membase  = old_serial_port[i].iomem_base;
> +             up->port.mapbase  = CPHYSADDR(up->port.membase);
>               up->port.iotype   = old_serial_port[i].io_type;
>               up->port.regshift = old_serial_port[i].iomem_reg_shift;
>               up->port.ops      = &serial8250_pops;
> @@ -1226,30 +1132,6 @@ int __init early_serial_setup(struct uar
>       return 0;
>  }
>  
> -/**
> - *   serial8250_suspend_port - suspend one serial port
> - *   @line:  serial line number
> - *      @level: the level of port suspension, as per uart_suspend_port
> - *
> - *   Suspend one serial port.
> - */
> -void serial8250_suspend_port(int line)
> -{
> -     uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
> -}
> -
> -/**
> - *   serial8250_resume_port - resume one serial port
> - *   @line:  serial line number
> - *      @level: the level of port resumption, as per uart_resume_port
> - *
> - *   Resume one serial port.
> - */
> -void serial8250_resume_port(int line)
> -{
> -     uart_resume_port(&serial8250_reg, &serial8250_ports[line].port);
> -}
> -
>  static int __init serial8250_init(void)
>  {
>       int ret, i;
> @@ -1279,8 +1161,5 @@ static void __exit serial8250_exit(void)
>  module_init(serial8250_init);
>  module_exit(serial8250_exit);
>  
> -EXPORT_SYMBOL(serial8250_suspend_port);
> -EXPORT_SYMBOL(serial8250_resume_port);
> -
>  MODULE_LICENSE("GPL");
>  MODULE_DESCRIPTION("Au1x00 serial driver\n");
> 
> 
> 


<Prev in Thread] Current Thread [Next in Thread>