2004-10-31 17:51:53

by Russell King

[permalink] [raw]
Subject: [PATCH] Serial updates

Ok, here's a major serial update. Items covered in this update:

- unuse register_serial/unregister_serial.
Instead, please use serial8250_register_port() and
serial8250_unregister_port() to talk to the 8250 driver.

The old interfaces have several restrictions:
1. do not allow the struct device associated with a port to be known
to the tty layer.
2. have various restrictions on the size of IO addresses (see the
HIGH_BITS_OFFSET stuff - which incidentally 8250_pnp got wrong.)

- provide a mechanism for 8250 platform ports to be dynamically
registered. We do this via platform devices - either one or
multiple platform devices. You can have none, one, or as many
as you desire. 8250.c couldn't care.

- any ports listed in include/asm-*/serial.h will still be
intialised in preference to platform device based ports for the
time being. It is intended that everyone will move to using
the platform device method.

- this means that CONFIG_SERIAL_8250_NR_UARTS slightly changes
definition. It is the number of _extra_ ports above those in
include/asm-*/serial.h that 8250.h will support. If you have
removed all ports from include/asm-*/serial.h, then it is
obviously the total number of ports that 8250.c will support,
and you need to make sure that it's large enough for your
platform.

- ppc64 broke in this merge. That's expected because I backed out
benh's changes to the serial drivers. A "get you working again"
patch is with benh as of last night pending his attention.

The patch is about 50K, so won't fit through lkml, and is available
here instead:

http://www.arm.linux.org.uk/~rmk/misc/linus-serial.diff

People who should test this patch as a minimum:

- ia64 people (ACPI port discovery)
- parisc people (GSC port discovery)
- pnp using people

Once this lot is in, I'll be following up with a set of patches which
removes the serial device tables in include/asm-arm/arch-*/serial.h.

Diffstat and changeset log follow:

drivers/serial/8250.c | 371 +++++++++++++++++++++++--------------------
drivers/serial/8250.h | 74 ++++++++
drivers/serial/8250_acorn.c | 60 +++---
drivers/serial/8250_acpi.c | 74 +++-----
drivers/serial/8250_pci.c | 6
drivers/serial/8250_pnp.c | 34 +--
drivers/serial/au1x00_uart.c | 17 -
drivers/serial/serial_core.c | 83 +--------
drivers/serial/serial_cs.c | 28 +--
include/linux/8250.h | 75 --------
include/linux/serial_8250.h | 28 +++
include/linux/serial_core.h | 10 -
12 files changed, 420 insertions(+), 440 deletions(-)

through these ChangeSets:

<[email protected]> (04/10/31 1.2354)
[SERIAL] Fix deadlock on removal of 8250 module.

We must unregister all serial ports before driver_unregister()
can complete. This means that we must unregister all ports in
serial8250_remove, including our legacy ISA ports. We flag this
special cleanup operation by setting serial8250_isa_devs to NULL
and not handling our own platform device any differently from
any others.

<[email protected]> (04/10/31 1.2353)
[SERIAL] Don't detect console availability using port->ops.

Use !iobase && !membase rather than !ops for console port
availability.

<[email protected]> (04/10/31 1.2352)
[SERIAL] 8250_acpi: Convert to use serial8250_{un,}register_port.

<[email protected]> (04/10/31 1.2351)
[SERIAL] Don't use UPF_AUTOPROBE, fix two build problems.

The curse of the missing __devexit_p() returns, and asm-*/ obviously
marks the end of the comment.

<[email protected]> (04/10/31 1.2350)
[SERIAL] 8250_pnp: Convert to use serial8250_{un,}register_port.

<[email protected]> (04/10/31 1.2349)
[SERIAL] serial_cs: Convert to use serial8250_{un,}register_port.

<[email protected]> (04/10/31 1.2348)
[SERIAL] 8250: Warn when ports with zero base_baud are registered.

<[email protected]> (04/10/31 1.2347)
[SERIAL] 8250_acorn: Convert to use serial8250_{un,}register_port.

<[email protected]> (04/10/30 1.2345)
[SERIAL] Undo "get_legacy_serial_ports" patch for PPC.

This patch conflicts with work to properly integrate the device model
into the serial layer, and provide architectures with a *clean* way
to tell 8250.c about their serial ports at run time.

<[email protected]> (04/10/30 1.2026.4.8)
[SERIAL] 8250: prevent ports with zero clocks being registered.

<[email protected]> (04/10/30 1.2026.4.7)
[SERIAL] 8250: add probe and remove device driver methods.

This change allows platform devices named "serial8250" to provide
lists of serial ports to the 8250 driver at runtime, in addition to
the hard coded table in include/asm-*/serial.h.

The next step is to deprecate the tables in serial.h.

<[email protected]> (04/10/30 1.2026.4.6)
[SERIAL] 8250: Add platform device for ISA 8250-compatible devices.

Add a platform device for ISA 8250-compatible serial devices listed
in the table in include/asm-*/serial.h. Arrange for unregistered
serial devices to be owned by this device.

This enables power management for ISA 8250 devices, and starts to
opens the way for architectures to dynamically provide their own
lists of 8250 devices via platform device(s).

<[email protected]> (04/10/30 1.2026.4.5)
[SERIAL] Re-order 8250 serial driver initialisation/finalisation.

Only register the 8250 serial driver with the device model after
registering and setting up our internal uart ports. Do the reverse
on module finalisation.

<[email protected]> (04/10/30 1.2026.4.4)
[SERIAL] 8250: move basic initialisation of 8250 ports.

This moves the basic initialisation of 8250 ports from
serial8250_register_ports() into serial8250_isa_init_ports()

<[email protected]> (04/10/30 1.2026.4.3)
[SERIAL] 8250: Fix resource handling.

serial8250_request_std_resource() is now responsible for claiming
the standard resources, _and_ calling ioremap if necessary.
serial8250_release_std_resource() performs the complementary function
in its entirety.
serial8250_*_rsa_resource() perform the similar operations for RSA
ports, with the exception that RSA ports can only be mapped into IO
space.

<[email protected]> (04/10/30 1.2026.4.2)
[SERIAL] Clean up serial_core.c write functions.

Since the tty layer now takes care of user space writes,
__uart_user_write() and associated temporary buffer and temporary
buffer semaphore have all become unnecessary. There's also little
point in having __uart_kern_write() separate from uart_write(), so
combine the two together.

Adrian Bunk kindly provided the patch to remove __uart_user_write().
The rest of the work is rmk's.

Signed-off-by: Adrian Bunk
Signed-off-by: Russell King <[email protected]>

<[email protected].(none)> (04/10/24 1.2026.4.1)
[SERIAL] Remove dead code.

serial8250_get_irq_map is no longer used anywhere in the kernel (it
used to be used by the isapnp code but isn't anymore) so it's dead
code, below is a patch to remove this.



--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core


2004-10-31 22:17:49

by Andreas Jellinghaus

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

I have trouble with smart card readers and smart cards,
and somehow I think it might be kernel 2.6.*,
as people with the same hw and sw report no problems
with kernel 2.4.

Should I try this patch? anything in it that could help
me? or are there known problems?

In an strace I saw a poll/read loop read data and
got 8 bytes at a time. once it 16 bytes were lost.
I can't reproduce the errors, but they happen very
often (in every run of the regression test suite
I have).

I have no idea if my kernel config could have
anything to do with it, if it helps I will
post/link it.

Andreas

2004-11-02 04:30:18

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

And here's another one that also fixes a little bug in the
default console selection code ...

--- linux-work.orig/arch/ppc64/kernel/setup.c 2004-10-27 13:05:41.000000000 +1000
+++ linux-work/arch/ppc64/kernel/setup.c 2004-11-02 15:18:26.707500208 +1100
@@ -31,7 +31,7 @@
#include <linux/cpu.h>
#include <linux/unistd.h>
#include <linux/serial.h>
-#include <linux/8250.h>
+#include <linux/serial_8250.h>
#include <asm/io.h>
#include <asm/prom.h>
#include <asm/processor.h>
@@ -901,7 +901,7 @@
DBG("Found serial console at ttyS%d\n", offset);

if (spd) {
- char opt[16];
+ static char __initdata opt[16];
sprintf(opt, "%d", *spd);
return add_preferred_console("ttyS", offset, opt);
} else
@@ -1123,8 +1123,8 @@
*/

#define MAX_LEGACY_SERIAL_PORTS 8
-static struct old_serial_port old_serial_ports[MAX_LEGACY_SERIAL_PORTS];
-static unsigned int old_serial_count;
+static struct plat_serial8250_port serial_ports[MAX_LEGACY_SERIAL_PORTS+1];
+static unsigned int old_serial_count;

void __init generic_find_legacy_serial_ports(unsigned int *default_speed)
{
@@ -1202,13 +1202,13 @@
if (index >= old_serial_count)
old_serial_count = index + 1;
/* Check if there is a port who already claimed our slot */
- if (old_serial_ports[index].port != 0) {
+ if (serial_ports[index].iobase != 0) {
/* if we still have some room, move it, else override */
if (old_serial_count < MAX_LEGACY_SERIAL_PORTS) {
DBG("Moved legacy port %d -> %d\n", index,
old_serial_count);
- old_serial_ports[old_serial_count++] =
- old_serial_ports[index];
+ serial_ports[old_serial_count++] =
+ serial_ports[index];
} else {
DBG("Replacing legacy port %d\n", index);
}
@@ -1220,18 +1220,17 @@
old_serial_count = index + 1;

/* Now fill the entry */
- memset(&old_serial_ports[index], 0, sizeof(struct old_serial_port));
- old_serial_ports[index].uart = 0;
- old_serial_ports[index].baud_base = clk ? (*clk / 16) : BASE_BAUD;
- old_serial_ports[index].port = reg->address;
- old_serial_ports[index].irq = interrupts ? interrupts[0] : 0;
- old_serial_ports[index].flags = ASYNC_BOOT_AUTOCONF;
+ memset(&serial_ports[index], 0, sizeof(struct plat_serial8250_port));
+ serial_ports[index].uartclk = clk ? *clk : BASE_BAUD * 16;
+ serial_ports[index].iobase = reg->address;
+ serial_ports[index].irq = interrupts ? interrupts[0] : 0;
+ serial_ports[index].flags = ASYNC_BOOT_AUTOCONF;

DBG("Added legacy port, index: %d, port: %x, irq: %d, clk: %d\n",
index,
- old_serial_ports[index].port,
- old_serial_ports[index].irq,
- old_serial_ports[index].baud_base * 16);
+ serial_ports[index].iobase,
+ serial_ports[index].irq,
+ serial_ports[index].uartclk);

/* Get phys address of IO reg for port 1 */
if (index != 0)
@@ -1279,19 +1278,21 @@
DBG(" <- generic_find_legacy_serial_port()\n");
}

-struct old_serial_port *get_legacy_serial_ports(unsigned int *count)
-{
- *count = old_serial_count;
- return old_serial_ports;
-}
-#else
-struct old_serial_port *get_legacy_serial_ports(unsigned int *count)
+static struct platform_device serial_device = {
+ .name = "serial8250",
+ .id = 0,
+ .dev = {
+ .platform_data = serial_ports,
+ },
+};
+
+static int __init serial_dev_init(void)
{
- *count = 0;
- return 0;
+ return platform_device_register(&serial_device);
}
+arch_initcall(serial_dev_init);
+
#endif /* CONFIG_PPC_ISERIES */
-EXPORT_SYMBOL(get_legacy_serial_ports);

int check_legacy_ioport(unsigned long base_port)
{
Index: linux-work/include/asm-ppc64/serial.h
===================================================================
--- linux-work.orig/include/asm-ppc64/serial.h 2004-10-26 08:30:21.000000000 +1000
+++ linux-work/include/asm-ppc64/serial.h 2004-11-02 15:17:27.620482800 +1100
@@ -4,8 +4,6 @@
#ifndef _PPC64_SERIAL_H
#define _PPC64_SERIAL_H

-#include <linux/config.h>
-
/*
* This assumes you have a 1.8432 MHz clock for your UART.
*
@@ -22,9 +20,4 @@
/* Default baud base if not found in device-tree */
#define BASE_BAUD ( 1843200 / 16 )

-#define ARCH_HAS_GET_LEGACY_SERIAL_PORTS
-struct old_serial_port;
-extern struct old_serial_port *get_legacy_serial_ports(unsigned int *count);
-#define UART_NR (8 + CONFIG_SERIAL_8250_NR_UARTS)
-
#endif /* _PPC64_SERIAL_H */


2004-11-02 04:28:32

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

On Sun, 2004-10-31 at 17:51 +0000, Russell King wrote:
> Ok, here's a major serial update. Items covered in this update:

Applied on top of current Linus bk, I get errors

- PCI_DEVICE_ID_DELL_RACIII undefined (not in my pci_ids.h)

- ALPHA_KLUDGE_MCR' undeclared (nobody includes serialP.h from 8250.h)


plus a few warnings

drivers/serial/8250.c: In function `serial8250_exit':
drivers/serial/8250.c:2446: warning: unused variable `i'
drivers/serial/8250.c: In function `register_serial':
drivers/serial/8250.c:2525: warning: long unsigned int format, different type arg (arg 2)

(Line numbers are after adding #include <linux/serialP.h>

ppc64 seem to be happy with slight changes of your ppc64 patch you sent me by email,
here's the corrected version.

I suppose we may want to increase CONFIG_SERIAL_8250_NR_UARTS in the pSeries and
maple defconfigs, but I'll look into doing that separately. The default of 4 is
enough to give ppl a working console at least.

Ben.

--- linux-work.orig/arch/ppc64/kernel/setup.c 2004-10-27 13:05:41.000000000 +1000
+++ linux-work/arch/ppc64/kernel/setup.c 2004-11-02 14:58:17.219370352 +1100
@@ -31,7 +31,7 @@
#include <linux/cpu.h>
#include <linux/unistd.h>
#include <linux/serial.h>
-#include <linux/8250.h>
+#include <linux/serial_8250.h>
#include <asm/io.h>
#include <asm/prom.h>
#include <asm/processor.h>
@@ -1123,8 +1123,8 @@
*/

#define MAX_LEGACY_SERIAL_PORTS 8
-static struct old_serial_port old_serial_ports[MAX_LEGACY_SERIAL_PORTS];
-static unsigned int old_serial_count;
+static struct plat_serial8250_port serial_ports[MAX_LEGACY_SERIAL_PORTS+1];
+static unsigned int old_serial_count;

void __init generic_find_legacy_serial_ports(unsigned int *default_speed)
{
@@ -1202,13 +1202,13 @@
if (index >= old_serial_count)
old_serial_count = index + 1;
/* Check if there is a port who already claimed our slot */
- if (old_serial_ports[index].port != 0) {
+ if (serial_ports[index].iobase != 0) {
/* if we still have some room, move it, else override */
if (old_serial_count < MAX_LEGACY_SERIAL_PORTS) {
DBG("Moved legacy port %d -> %d\n", index,
old_serial_count);
- old_serial_ports[old_serial_count++] =
- old_serial_ports[index];
+ serial_ports[old_serial_count++] =
+ serial_ports[index];
} else {
DBG("Replacing legacy port %d\n", index);
}
@@ -1220,18 +1220,17 @@
old_serial_count = index + 1;

/* Now fill the entry */
- memset(&old_serial_ports[index], 0, sizeof(struct old_serial_port));
- old_serial_ports[index].uart = 0;
- old_serial_ports[index].baud_base = clk ? (*clk / 16) : BASE_BAUD;
- old_serial_ports[index].port = reg->address;
- old_serial_ports[index].irq = interrupts ? interrupts[0] : 0;
- old_serial_ports[index].flags = ASYNC_BOOT_AUTOCONF;
+ memset(&serial_ports[index], 0, sizeof(struct plat_serial8250_port));
+ serial_ports[index].uartclk = clk ? *clk : BASE_BAUD * 16;
+ serial_ports[index].iobase = reg->address;
+ serial_ports[index].irq = interrupts ? interrupts[0] : 0;
+ serial_ports[index].flags = ASYNC_BOOT_AUTOCONF;

DBG("Added legacy port, index: %d, port: %x, irq: %d, clk: %d\n",
index,
- old_serial_ports[index].port,
- old_serial_ports[index].irq,
- old_serial_ports[index].baud_base * 16);
+ serial_ports[index].iobase,
+ serial_ports[index].irq,
+ serial_ports[index].uartclk);

/* Get phys address of IO reg for port 1 */
if (index != 0)
@@ -1279,19 +1278,21 @@
DBG(" <- generic_find_legacy_serial_port()\n");
}

-struct old_serial_port *get_legacy_serial_ports(unsigned int *count)
-{
- *count = old_serial_count;
- return old_serial_ports;
-}
-#else
-struct old_serial_port *get_legacy_serial_ports(unsigned int *count)
+static struct platform_device serial_device = {
+ .name = "serial8250",
+ .id = 0,
+ .dev = {
+ .platform_data = serial_ports,
+ },
+};
+
+static int __init serial_dev_init(void)
{
- *count = 0;
- return 0;
+ return platform_device_register(&serial_device);
}
+arch_initcall(serial_dev_init);
+
#endif /* CONFIG_PPC_ISERIES */
-EXPORT_SYMBOL(get_legacy_serial_ports);

int check_legacy_ioport(unsigned long base_port)
{
Index: linux-work/include/asm-ppc64/serial.h
===================================================================
--- linux-work.orig/include/asm-ppc64/serial.h 2004-10-26 08:30:21.000000000 +1000
+++ linux-work/include/asm-ppc64/serial.h 2004-11-02 14:51:17.486179496 +1100
@@ -4,8 +4,6 @@
#ifndef _PPC64_SERIAL_H
#define _PPC64_SERIAL_H

-#include <linux/config.h>
-
/*
* This assumes you have a 1.8432 MHz clock for your UART.
*
@@ -22,9 +20,4 @@
/* Default baud base if not found in device-tree */
#define BASE_BAUD ( 1843200 / 16 )

-#define ARCH_HAS_GET_LEGACY_SERIAL_PORTS
-struct old_serial_port;
-extern struct old_serial_port *get_legacy_serial_ports(unsigned int *count);
-#define UART_NR (8 + CONFIG_SERIAL_8250_NR_UARTS)
-
#endif /* _PPC64_SERIAL_H */


2004-11-02 20:05:59

by Alex Williamson

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

On Sun, 2004-10-31 at 17:51 +0000, Russell King wrote:
> Ok, here's a major serial update. Items covered in this update:
...
> People who should test this patch as a minimum:
>
> - ia64 people (ACPI port discovery)

I tried it on an hp rx2600 ia64 system. All the ports showed up,
ACPI and PCI:

Serial: 8250/16550 driver $Revision: 1.90 $ 6 ports, IRQ sharing enabled
ttyS0 at MMIO 0xf8030000 (irq = 49) is a 16550A
GSI 34 (edge, high) -> CPU 1 (0x0100) vector 65
ttyS1 at MMIO 0xff5e0000 (irq = 65) is a 16550A
GSI 35 (edge, high) -> CPU 0 (0x0000) vector 66
ttyS2 at MMIO 0xff5e2000 (irq = 66) is a 16550A
ACPI: PCI interrupt 0000:e0:01.0[A] -> GSI 82 (level, low) -> IRQ 49
ttyS3 at MMIO 0xf8031000 (irq = 49) is a 16550A
ACPI: PCI interrupt 0000:e0:01.1[A] -> GSI 82 (level, low) -> IRQ 49
ttyS0 at MMIO 0xf8030000 (irq = 49) is a 16550A
ttyS4 at MMIO 0xf8030010 (irq = 49) is a 16550A
ttyS5 at MMIO 0xf8030038 (irq = 49) is a 16550A

The setserial problem I reported w/ MMIO UARTs appears to be fixed.
Thanks,

Alex

--
Alex Williamson HP Linux & Open Source Lab

2004-11-02 23:22:40

by Russell King

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

On Tue, Nov 02, 2004 at 03:01:12PM -0800, Andrew Morton wrote:
> Russell King <[email protected]> wrote:
> >
> > On Tue, Nov 02, 2004 at 03:20:26PM +1100, Benjamin Herrenschmidt wrote:
> > > And here's another one that also fixes a little bug in the
> > > default console selection code ...
> >
> > Thanks for testing Ben, applied.
> >
> > akpm - do you want this set of serial changes to appear in one -mm
> > release before hitting Linus?
> >
>
> Not really - there's plenty of time to shake out any problems.

Ok, I'll send a pull request imminently. For those who don't want to
wait, latest patch against Linus' tree is at:

http://www.arm.linux.org.uk/~rmk/misc/linus-serial.diff

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core

2004-11-03 00:27:53

by Russell King

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

On Tue, Nov 02, 2004 at 03:20:26PM +1100, Benjamin Herrenschmidt wrote:
> And here's another one that also fixes a little bug in the
> default console selection code ...

Thanks for testing Ben, applied.

akpm - do you want this set of serial changes to appear in one -mm
release before hitting Linus?

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core

2004-11-03 00:27:58

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

Russell King <[email protected]> wrote:
>
> On Tue, Nov 02, 2004 at 03:20:26PM +1100, Benjamin Herrenschmidt wrote:
> > And here's another one that also fixes a little bug in the
> > default console selection code ...
>
> Thanks for testing Ben, applied.
>
> akpm - do you want this set of serial changes to appear in one -mm
> release before hitting Linus?
>

Not really - there's plenty of time to shake out any problems.

2004-11-04 21:23:10

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH] Serial updates

--- linus/drivers/serial/8250.c 2004-11-03 09:50:58.000000000 -0800
+++ linux-omap-dev/drivers/serial/8250.c 2004-11-04 13:14:22.000000000 -0800
@@ -1692,6 +1693,17 @@
serial_outp(up, UART_EFR, efr);
}

+#ifdef CONFIG_ARCH_OMAP1510
+ /* Workaround to enable 115200 baud on OMAP1510 internal ports */
+ if (cpu_is_omap1510() && is_omap_port(up->port.membase)) {
+ if (baud == 115200) {
+ quot = 1;
+ serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
+ } else
+ serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
+ }
+#endif
+
if (up->capabilities & UART_NATSEMI) {
/* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
serial_outp(up, UART_LCR, 0xe0);
@@ -1742,6 +1754,11 @@
unsigned int size = 8 << up->port.regshift;
int ret = 0;

+#ifdef CONFIG_ARCH_OMAP
+ if (is_omap_port(up->port.membase))
+ size = 0x16 << up->port.regshift;
+#endif
+
switch (up->port.iotype) {
case UPIO_MEM:
if (!up->port.mapbase)
--- linus/include/linux/serial_reg.h 2004-10-25 10:33:36.000000000 -0700
+++ linux-omap-dev/include/linux/serial_reg.h 2004-11-01 14:52:36.000000000 -0800
@@ -307,5 +307,19 @@
#define SERIAL_RSA_BAUD_BASE (921600)
#define SERIAL_RSA_BAUD_BASE_LO (SERIAL_RSA_BAUD_BASE / 8)

+/*
+ * Extra serial register definitions for the internal UARTs
+ * in TI OMAP processors.
+ */
+#define UART_OMAP_MDR1 0x08 /* Mode definition register */
+#define UART_OMAP_MDR2 0x09 /* Mode definition register 2 */
+#define UART_OMAP_SCR 0x10 /* Supplementary control register */
+#define UART_OMAP_SSR 0x11 /* Supplementary status register */
+#define UART_OMAP_EBLR 0x12 /* BOF length register */
+#define UART_OMAP_OSC_12M_SEL 0x13 /* OMAP1510 12MHz osc select */
+#define UART_OMAP_MVER 0x14 /* Module version register */
+#define UART_OMAP_SYSC 0x15 /* System configuration register */
+#define UART_OMAP_SYSS 0x16 /* System status register */
+
#endif /* _LINUX_SERIAL_REG_H */


Attachments:
(No filename) (763.00 B)
patch-2.6.10-rc1-current-omap-serial (1.87 kB)
Download all attachments