Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757390Ab0F3WUq (ORCPT ); Wed, 30 Jun 2010 18:20:46 -0400 Received: from 69-100-st.zelcom.ru ([80.92.100.69]:58691 "HELO feelingofgreen.ru" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with SMTP id S1752754Ab0F3WUo (ORCPT ); Wed, 30 Jun 2010 18:20:44 -0400 From: Samium Gromoff <_deepfire@feelingofgreen.ru> To: Andrew Morton Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH] serial: MMIO32 support for 8250_early.c In-Reply-To: <20100630131321.07d0f921.akpm@linux-foundation.org> References: <87r5jxva3n.fsf@auriga.deep> <20100628134426.0558ac67.akpm@linux-foundation.org> <87mxucuyfo.fsf@auriga.deep> <20100630131321.07d0f921.akpm@linux-foundation.org> Date: Thu, 01 Jul 2010 01:26:13 +0400 Message-ID: <87lj9wus96.fsf@auriga.deep> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5248 Lines: 160 On Wed, 30 Jun 2010 13:13:21 -0700, Andrew Morton wrote: > On Wed, 30 Jun 2010 23:12:43 +0400 > Samium Gromoff <_deepfire@feelingofgreen.ru> wrote: > > > So, the branch is again updated, and the delta is: > > This gives checkpatch a complete heart attack. Please, use it? Done. There's a warning, but it belongs to the original code, so not touching it.. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = commit ae1a741d1aab1a67dfe1c0ef2b874fcf838b858e Author: Samium Gromoff <_deepfire@feelingofgreen.ru> Date: Thu Jul 1 01:23:45 2010 +0400 Provide MMIO32 support in 8250_early (aka earlycon) Signed-off-by: Samium Gromoff <_deepfire@feelingofgreen.ru> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 1808f11..0bb9939 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -686,8 +686,11 @@ and is between 256 and 4096 characters. It is defined in the file earlycon= [KNL] Output early console device and options. uart[8250],io,[,options] uart[8250],mmio,[,options] + uart[8250],mmio32,[,options] Start an early, polled-mode console on the 8250/16550 UART at the specified I/O port or MMIO address. + MMIO inter-register address stride is either 8bit (mmio) + or 32bit (mmio32). The options are the same as for ttyS, above. earlyprintk= [X86,SH,BLACKFIN] diff --git a/drivers/serial/8250_early.c b/drivers/serial/8250_early.c index f279745..0724c6f 100644 --- a/drivers/serial/8250_early.c +++ b/drivers/serial/8250_early.c @@ -19,9 +19,11 @@ * The user can specify the device directly, e.g., * earlycon=uart8250,io,0x3f8,9600n8 * earlycon=uart8250,mmio,0xff5e0000,115200n8 + * earlycon=uart8250,mmio32,0xff5e0000,115200n8 * or * console=uart8250,io,0x3f8,9600n8 * console=uart8250,mmio,0xff5e0000,115200n8 + * console=uart8250,mmio32,0xff5e0000,115200n8 */ #include @@ -48,18 +50,31 @@ static struct early_serial8250_device early_device; static unsigned int __init serial_in(struct uart_port *port, int offset) { - if (port->iotype == UPIO_MEM) + switch (port->iotype) { + case UPIO_MEM: return readb(port->membase + offset); - else + case UPIO_MEM32: + return readl(port->membase + (offset << 2)); + case UPIO_PORT: return inb(port->iobase + offset); + default: + return 0; + } } static void __init serial_out(struct uart_port *port, int offset, int value) { - if (port->iotype == UPIO_MEM) + switch (port->iotype) { + case UPIO_MEM: writeb(value, port->membase + offset); - else + break; + case UPIO_MEM32: + writel(value, port->membase + (offset << 2)); + break; + case UPIO_PORT: outb(value, port->iobase + offset); + break; + } } #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) @@ -137,15 +152,21 @@ static int __init parse_options(struct early_serial8250_device *device, char *options) { struct uart_port *port = &device->port; - int mmio, length; + int mmio, mmio32, length; if (!options) return -ENODEV; port->uartclk = BASE_BAUD * 16; - if (!strncmp(options, "mmio,", 5)) { - port->iotype = UPIO_MEM; - port->mapbase = simple_strtoul(options + 5, &options, 0); + + mmio = !strncmp(options, "mmio,", 5); + mmio32 = !strncmp(options, "mmio32,", 7); + if (mmio || mmio32) { + port->iotype = (mmio ? UPIO_MEM : UPIO_MEM32); + port->mapbase = simple_strtoul(options + (mmio ? 5 : 7), + &options, 0); + if (mmio32) + port->regshift = 2; #ifdef CONFIG_FIX_EARLYCON_MEM set_fixmap_nocache(FIX_EARLYCON_MEM_BASE, port->mapbase & PAGE_MASK); @@ -157,11 +178,10 @@ static int __init parse_options(struct early_serial8250_device *device, if (!port->membase) { printk(KERN_ERR "%s: Couldn't ioremap 0x%llx\n", __func__, - (unsigned long long)port->mapbase); + (unsigned long long) port->mapbase); return -ENOMEM; } #endif - mmio = 1; } else if (!strncmp(options, "io,", 3)) { port->iotype = UPIO_PORT; port->iobase = simple_strtoul(options + 3, &options, 0); @@ -181,11 +201,14 @@ static int __init parse_options(struct early_serial8250_device *device, device->baud); } - printk(KERN_INFO "Early serial console at %s 0x%llx (options '%s')\n", - mmio ? "MMIO" : "I/O port", - mmio ? (unsigned long long) port->mapbase - : (unsigned long long) port->iobase, - device->options); + if (mmio || mmio32) + printk(KERN_INFO "Early serial console at MMIO%s 0x%p (options '%s')\n", + mmio32 ? "32" : "", (unsigned long long) port->mapbase, + device->options); + else + printk(KERN_INFO "Early serial console at I/O port 0x%pr (options '%s')\n", + (unsigned long long) port->iobase, device->options); + return 0; } -- regards, Samium Gromoff -- "Actually I made up the term 'object-oriented', and I can tell you I did not have C++ in mind." - Alan Kay (OOPSLA 1997 Keynote) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/