RE: [patch 1/2] serial: add tsi108 8250 serial support




The following patch fixes the tsi108 port report information.
Signed-off-by: Roy Zang <tie-fei.zang@xxxxxxxxxxxxx>

--
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 17839e7..9d45af1 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -2028,6 +2028,7 @@ uart_report_port(struct uart_driver *drv
case UPIO_MEM:
case UPIO_MEM32:
case UPIO_AU:
+ case UPIO_TSI:
snprintf(address, sizeof(address),
"MMIO 0x%lx", port->mapbase);
break;




From: Zang Roy-r61911 <tie-fei.zang@xxxxxxxxxxxxx>

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.

Cc: Russell King <rmk@xxxxxxxxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

drivers/serial/8250.c | 12 ++++++++++++
include/linux/serial_core.h | 1 +
2 files changed, 13 insertions(+)

diff -puN
drivers/serial/8250.c~serial-add-tsi108-8250-serial-support
drivers/serial/8250.c
--- a/drivers/serial/8250.c~serial-add-tsi108-8250-serial-support
+++ a/drivers/serial/8250.c
@@ -300,6 +300,7 @@ static inline int map_8250_out_reg(struc

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 @@ static unsigned int serial_in(struct uar
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 @@ serial_out(struct uart_8250_port *up, in
__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
-puN
include/linux/serial_core.h~serial-add-tsi108-8250-serial-supp
ort include/linux/serial_core.h
---
a/include/linux/serial_core.h~serial-add-tsi108-8250-serial-support
+++ a/include/linux/serial_core.h
@@ -223,6 +223,7 @@ struct uart_port {
#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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: Handling PCI interrupts
    ... That makes sense but it also means the 'software interrupts' only occur on ... Your driver will probably be in a stack of its own. ... The DSP has standard PCI interrupts, but in addition ... driver by flipping bits in a separate register. ...
    (microsoft.public.development.device.drivers)
  • [PATCH] smc911x: Re-release spinlock on spurious interrupt
    ... The smc911x driver forgets to release the spinlock on spurious ... interrupts. ... This little patch fixes it. ...
    (Linux-Kernel)
  • [PATCH] FRV: Use virtual interrupt disablement
    ... The attached patch makes the FRV arch use virtual interrupt disablement because ... time (separate h/w and inter-core interrupts). ... inside the kernel. ... flag out of the CCR register, shifting it down and masking it off. ...
    (Linux-Kernel)
  • Re: Xilinx Virtex-4 OCM Usage Issues
    ... correct and then register 5 is copied into register 6. ... anything about how interrupts work on the PPC, so I'll have to read up ... Since Ben mentioned interrupts a couple of times, and you say this, let ... and also mentioned in the OS and Libraries Documentation, ...
    (comp.arch.fpga)
  • [Patch 06/08] Staging: heci - fix setting h_is bit in h_csr register
    ... Subject: [PATCH] heci: fix setting h_is bit in h_csr register. ... Host software could issue interrupts to ME firmware, ... host software should preserve all the other bits in H_CSR ...
    (Linux-Kernel)