Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Linux: Kernel

Re: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support

 

 

Linux kernel RSS feed   Index | Next | Previous | View Threaded


rmk+lkml at arm

Jun 5, 2006, 3:04 AM

Post #1 of 6 (478 views)
Permalink
Re: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support

On Thu, May 18, 2006 at 12:00:43PM +0800, Zang Roy-r61911 wrote:
>
> -----Original Message-----
> From: Kumar Gala [mailto:galak [at] kernel]
> Sent: 2006???5???17??? 21:26
> To: Zang Roy-r61911
> Cc: Paul Mackerras; linuxppc-dev list; Alexandre.Bounine [at] tundra; Yang Xin-Xin-r48390
> Subject: Re: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support
>
>
>
> On May 17, 2006, at 5:14 AM, Zang Roy-r61911 wrote:
>
> > This patch contains changes to the serial device driver specific
> > for integrated
> > serial port in Tsi108 Host Bridge.

There's no explaination about why this is required. What is the problem?
Which changes relate directly to this problem and which changes are
related to fixing some other issue not related to the errata?

Plus, every patch line is prefixed by "> "... patch doesn't like that.

> >
> > Signed-off-by: Alexandre Bounine <alexandreb [at] tundra>
> > Signed-off-by: Roy Zang <tie-fei.zang [at] freescale>
> >
> >> From nobody Mon Sep 17 00:00:00 2001
> > From: roy zang <tie-fei.zang [at] freescale>
> > Date: Tue May 16 15:26:02 2006 +0800
> > Subject: [PATCH] Add tsi108 serial support
>
> This patch needs to go to Russell King as uart/8250 driver maintainer.
>
> - kumar
>
> >
> > ---
> >
> > drivers/serial/8250.c | 17 +++++++++++++++++
> > 1 files changed, 17 insertions(+), 0 deletions(-)
> >
> > 6cb950357e9970afa671d59f172dbc4b03f11560
> > diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
> > index bbf78aa..c12f516 100644
> > --- a/drivers/serial/8250.c
> > +++ b/drivers/serial/8250.c
> > @@ -723,7 +723,9 @@ static int broken_efr(struct uart_8250_p
> > static void autoconfig_16550a(struct uart_8250_port *up)
> > {
> > unsigned char status1, status2;
> > +#ifndef CONFIG_TSI108_BRIDGE
> > unsigned int iersave;
> > +#endif
> >
> > up->port.type = PORT_16550A;
> > up->capabilities |= UART_CAP_FIFO;
> > @@ -833,6 +835,7 @@ static void autoconfig_16550a(struct uar
> > * trying to write and read a 1 just to make sure it's not
> > * already a 1 and maybe locked there before we even start start.
> > */
> > +#ifndef CONFIG_TSI108_BRIDGE
> > iersave = serial_in(up, UART_IER);
> > serial_outp(up, UART_IER, iersave & ~UART_IER_UUE);
> > if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
> > @@ -859,6 +862,7 @@ static void autoconfig_16550a(struct uar
> > DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
> > }
> > serial_outp(up, UART_IER, iersave);
> > +#endif
> > }
> >
> > /*
> > @@ -1348,7 +1352,12 @@ static irqreturn_t serial8250_interrupt(
> >
> > up = list_entry(l, struct uart_8250_port, list);
> >
> > +#ifdef CONFIG_TSI108_BRIDGE /* for TSI108_REV_Z1 errata U2 */
> > + /* read IIR as part of 32-bit word */
> > + iir = (in_be32((u32 *)(up->port.membase + UART_RX)) >> 8) & 0xff;
> > +#else
> > iir = serial_in(up, UART_IIR);
> > +#endif
> > if (!(iir & UART_IIR_NO_INT)) {
> > serial8250_handle_port(up, regs);
> >
> > @@ -1529,7 +1538,9 @@ static int serial8250_startup(struct uar
> > {
> > struct uart_8250_port *up = (struct uart_8250_port *)port;
> > unsigned long flags;
> > +#ifndef CONFIG_TSI108_BRIDGE
> > unsigned char lsr, iir;
> > +#endif
> > int retval;
> >
> > up->capabilities = uart_config[up->port.type].flags;
> > @@ -1567,7 +1578,9 @@ #endif
> > */
> > (void) serial_inp(up, UART_LSR);
> > (void) serial_inp(up, UART_RX);
> > +#ifndef CONFIG_TSI108_BRIDGE /* for TSI108_REV_Z1 errata U2 */
> > (void) serial_inp(up, UART_IIR);
> > +#endif
> > (void) serial_inp(up, UART_MSR);
> >
> > /*
> > @@ -1634,6 +1647,7 @@ #endif
> >
> > serial8250_set_mctrl(&up->port, up->port.mctrl);
> >
> > +#ifndef CONFIG_TSI108_BRIDGE
> > /*
> > * Do a quick test to see if we receive an
> > * interrupt when we enable the TX irq.
> > @@ -1652,6 +1666,7 @@ #endif
> > } else {
> > up->bugs &= ~UART_BUG_TXEN;
> > }
> > +#endif
> >
> > spin_unlock_irqrestore(&up->port.lock, flags);
> >
> > @@ -1678,7 +1693,9 @@ #endif
> > */
> > (void) serial_inp(up, UART_LSR);
> > (void) serial_inp(up, UART_RX);
> > +#ifndef CONFIG_TSI108_BRIDGE /* for TSI108_REV_Z1 errata U2 */
> > (void) serial_inp(up, UART_IIR);
> > +#endif
> > (void) serial_inp(up, UART_MSR);
> >
> > return 0;
> > --
> > 1.3.0
> > _______________________________________________
> > Linuxppc-dev mailing list
> > Linuxppc-dev [at] ozlabs
> > https://ozlabs.org/mailman/listinfo/linuxppc-dev

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


tie-fei.zang at freescale

Jun 12, 2006, 10:39 PM

Post #2 of 6 (470 views)
Permalink
RE: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support [In reply to]

> >
> > On May 17, 2006, at 5:14 AM, Zang Roy-r61911 wrote:
> >
> > > This patch contains changes to the serial device driver
> specific for
> > > integrated serial port in Tsi108 Host Bridge.
>
> There's no explaination about why this is required. What is
> the problem?
> Which changes relate directly to this problem and which
> changes are related to fixing some other issue not related to
> the errata?
>
> Plus, every patch line is prefixed by "> "... patch doesn't like that.

The reason is that the serial port on tsi108/9 is a bit difference with the
standard 8250 serial port. the patch deal with the difference.
The prefixed ">" is caused by "Fw" the email. Sorry for that. The following
is the original patch.

Signed-off-by: Alexandre Bounine <alexandreb [at] tundra>
Signed-off-by: Roy Zang <tie-fei.zang [at] freescale>

drivers/serial/8250.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)

6cb950357e9970afa671d59f172dbc4b03f11560
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index bbf78aa..c12f516 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -723,7 +723,9 @@ static int broken_efr(struct uart_8250_p static void autoconfig_16550a(struct uart_8250_port *up) {
unsigned char status1, status2;
+#ifndef CONFIG_TSI108_BRIDGE
unsigned int iersave;
+#endif

up->port.type = PORT_16550A;
up->capabilities |= UART_CAP_FIFO;
@@ -833,6 +835,7 @@ static void autoconfig_16550a(struct uar
* trying to write and read a 1 just to make sure it's not
* already a 1 and maybe locked there before we even start start.
*/
+#ifndef CONFIG_TSI108_BRIDGE
iersave = serial_in(up, UART_IER);
serial_outp(up, UART_IER, iersave & ~UART_IER_UUE);
if (!(serial_in(up, UART_IER) & UART_IER_UUE)) { @@ -859,6 +862,7 @@ static void autoconfig_16550a(struct uar
DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
}
serial_outp(up, UART_IER, iersave);
+#endif
}

/*
@@ -1348,7 +1352,12 @@ static irqreturn_t serial8250_interrupt(

up = list_entry(l, struct uart_8250_port, list);

+#ifdef CONFIG_TSI108_BRIDGE /* for TSI108_REV_Z1 errata U2 */
+ /* read IIR as part of 32-bit word */
+ iir = (in_be32((u32 *)(up->port.membase + UART_RX)) >> 8) & 0xff;
+#else
iir = serial_in(up, UART_IIR);
+#endif
if (!(iir & UART_IIR_NO_INT)) {
serial8250_handle_port(up, regs);

@@ -1529,7 +1538,9 @@ static int serial8250_startup(struct uar {
struct uart_8250_port *up = (struct uart_8250_port *)port;
unsigned long flags;
+#ifndef CONFIG_TSI108_BRIDGE
unsigned char lsr, iir;
+#endif
int retval;

up->capabilities = uart_config[up->port.type].flags; @@ -1567,7 +1578,9 @@ #endif
*/
(void) serial_inp(up, UART_LSR);
(void) serial_inp(up, UART_RX);
+#ifndef CONFIG_TSI108_BRIDGE /* for TSI108_REV_Z1 errata U2 */
(void) serial_inp(up, UART_IIR);
+#endif
(void) serial_inp(up, UART_MSR);

/*
@@ -1634,6 +1647,7 @@ #endif

serial8250_set_mctrl(&up->port, up->port.mctrl);

+#ifndef CONFIG_TSI108_BRIDGE
/*
* Do a quick test to see if we receive an
* interrupt when we enable the TX irq.
@@ -1652,6 +1666,7 @@ #endif
} else {
up->bugs &= ~UART_BUG_TXEN;
}
+#endif

spin_unlock_irqrestore(&up->port.lock, flags);

@@ -1678,7 +1693,9 @@ #endif
*/
(void) serial_inp(up, UART_LSR);
(void) serial_inp(up, UART_RX);
+#ifndef CONFIG_TSI108_BRIDGE /* for TSI108_REV_Z1 errata U2 */
(void) serial_inp(up, UART_IIR);
+#endif
(void) serial_inp(up, UART_MSR);

return 0;
--
1.3.0


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


adrian at humboldt

Jun 14, 2006, 7:25 AM

Post #3 of 6 (469 views)
Permalink
RE: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support [In reply to]

On Tue, 2006-06-13 at 13:39 +0800, Zang Roy-r61911 wrote:

> The reason is that the serial port on tsi108/9 is a bit difference with the
> standard 8250 serial port. the patch deal with the difference.
> The prefixed ">" is caused by "Fw" the email. Sorry for that. The following
> is the original patch.

The problem I see is that the code uses a CONFIG option, to change the
behaviour of the generic 8250 driver. What happens if somebody adds a
PCI serial card to a tsi108 based machine?

Perhaps you should define a new value for uart_8250_port.port.iotype,
and add code to serial_in and serial_out to handle the IIR register.

--
Adrian Cox <adrian [at] humboldt>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


tie-fei.zang at freescale

Jun 14, 2006, 8:27 PM

Post #4 of 6 (445 views)
Permalink
RE: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support [In reply to]

> On Tue, 2006-06-13 at 13:39 +0800, Zang Roy-r61911 wrote:
>
> > The reason is that the serial port on tsi108/9 is a bit difference
> > with the standard 8250 serial port. the patch deal with the
> difference.
> > The prefixed ">" is caused by "Fw" the email. Sorry for that. The
> > following is the original patch.
>
> The problem I see is that the code uses a CONFIG option, to
> change the behaviour of the generic 8250 driver. What happens
> if somebody adds a PCI serial card to a tsi108 based machine?

I do not like CONFIG option:). It might be a problem in the environment you suggesting.

>
> Perhaps you should define a new value for
> uart_8250_port.port.iotype, and add code to serial_in and
> serial_out to handle the IIR register.
I will consider it.
>
> --
> Adrian Cox <adrian [at] humboldt>
>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


tie-fei.zang at freescale

Jun 14, 2006, 10:13 PM

Post #5 of 6 (458 views)
Permalink
RE: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support [In reply to]

> > On May 17, 2006, at 5:14 AM, Zang Roy-r61911 wrote:
> >
> > > This patch contains changes to the serial device driver
> specific for
> > > integrated serial port in Tsi108 Host Bridge.
>
> There's no explaination about why this is required. What is
> the problem?
> Which changes relate directly to this problem and which
> changes are related to fixing some other issue not related to
> the errata?
>

More detailed explanation:

This patch addresses two differences in the Tsi108/109 UART behavior from the standard one.

1. Check for UART_IER_UUE bit in the autoconfig routine. This section of autoconfig is excluded for
Tsi108/109 because bits 7 and 6 are reserved for internal use. They are R/W bits. In addition to incorrect
identification, changing these bits (from 00) will make Tsi108/109 UART non-functional.

2. ERRATA. Reading the UART's Interrupt Identification Register (IIR) clears the Transmit
Holding Register Empty (THRE) and Transmit buffer Empty (TEMP) interrupts even
if they are not enabled in the Interrupt Enable Register (IER). This leads to loss of the interrupts.
Interrupts are not cleared when reading UART registers as 32-bit word.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


tie-fei.zang at freescale

Jun 15, 2006, 4:04 AM

Post #6 of 6 (452 views)
Permalink
RE: [PATCH/2.6.17-rc4 8/10] Add tsi108 8250 serial support [In reply to]

>
> Perhaps you should define a new value for
> uart_8250_port.port.iotype, and add code to serial_in and
> serial_out to handle the IIR register.
>
> --
> Adrian Cox <adrian [at] humboldt>
>
The following patch gets rid of CONFIG_TSI108_BRIDGE.
I add UPIO_TSI to handle IIR and IER register in serial_in and
serial_out.

(1) the reason to rewrite serial_in:
TSI108 rev Z1 version ERRATA. Reading the UART's Interrupt Identification Register (IIR) clears the Transmit
Holding Register Empty (THRE) and Transmit buffer Empty (TEMP) interrupts even if they are not enabled in
the Interrupt Enable Register (IER). This leads to loss of the interrupts. Interrupts are not cleared
when reading UART registers as 32-bit word.

(2) the reason to rewrite serial_out:
Check for UART_IER_UUE bit in the autoconfig routine. This section of autoconfig is excluded for
Tsi108/109 because bits 7 and 6 are reserved for internal use. They are R/W bits. In addition to
incorrect identification, changing these bits (from 00) will make Tsi108/109 UART non-functional.


diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index bbf78aa..6343d7a 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -300,6 +300,7 @@ #endif

static unsigned int serial_in(struct uart_8250_port *up, int offset)
{
+ unsigned int tmp;
offset = map_8250_in_reg(up, offset) << up->port.regshift;

switch (up->port.iotype) {
@@ -317,6 +318,13 @@ #ifdef CONFIG_SERIAL_8250_AU1X00
case UPIO_AU:
return __raw_readl(up->port.membase + offset);
#endif
+
+ case UPIO_TSI:
+ if (offset == UART_IIR){
+ tmp = readl((u32 *)(up->port.membase + UART_RX)) ;
+ return (cpu_to_le32(tmp)>> 8) & 0xff;
+ }else
+ return readb(up->port.membase + offset);

default:
return inb(up->port.iobase + offset);
@@ -347,6 +355,10 @@ #ifdef CONFIG_SERIAL_8250_AU1X00
__raw_writel(value, up->port.membase + offset);
break;
#endif
+ case UPIO_TSI:
+ if (!((offset == UART_IER) && (value & UART_IER_UUE)))
+ writeb(value, up->port.membase + offset);
+ break;

default:
outb(value, up->port.iobase + offset);
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index bd14858..fcf48d3 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -224,6 +224,7 @@ #define UPIO_HUB6 (1)
#define UPIO_MEM (2)
#define UPIO_MEM32 (3)
#define UPIO_AU (4) /* Au1x00 type IO */
+#define UPIO_TSI (5) /* Tsi108/109 type IO */

unsigned int read_status_mask; /* driver specific */
unsigned int ignore_status_mask; /* driver specific */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Linux kernel RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.