tty/serial: at91: add a fallback option to determine uart/usart property
authorNicolas Ferre <nicolas.ferre@atmel.com>
Thu, 17 Oct 2013 15:37:12 +0000 (17:37 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2013 20:31:19 +0000 (13:31 -0700)
On older SoC, the "name" field is not filled in the register map.
Fix the way to figure out if the serial port is an uart or an usart for these
older products (with corresponding properties).

Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/atmel_serial.c
include/linux/atmel_serial.h

index 6b0f75eac8a26de2c6a3a83eac061ae7a03295cd..c7d99af46a966f1fdc9b9ebf0359756180e90b20 100644 (file)
@@ -99,6 +99,7 @@ static void atmel_stop_rx(struct uart_port *port);
 #define UART_PUT_RTOR(port,v)  __raw_writel(v, (port)->membase + ATMEL_US_RTOR)
 #define UART_PUT_TTGR(port, v) __raw_writel(v, (port)->membase + ATMEL_US_TTGR)
 #define UART_GET_IP_NAME(port) __raw_readl((port)->membase + ATMEL_US_NAME)
+#define UART_GET_IP_VERSION(port) __raw_readl((port)->membase + ATMEL_US_VERSION)
 
  /* PDC registers */
 #define UART_PUT_PTCR(port,v)  __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
@@ -1503,6 +1504,7 @@ static void atmel_get_ip_name(struct uart_port *port)
 {
        struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
        int name = UART_GET_IP_NAME(port);
+       u32 version;
        int usart, uart;
        /* usart and uart ascii */
        usart = 0x55534152;
@@ -1517,7 +1519,22 @@ static void atmel_get_ip_name(struct uart_port *port)
                dev_dbg(port->dev, "This is uart\n");
                atmel_port->is_usart = false;
        } else {
-               dev_err(port->dev, "Not supported ip name, set to uart\n");
+               /* fallback for older SoCs: use version field */
+               version = UART_GET_IP_VERSION(port);
+               switch (version) {
+               case 0x302:
+               case 0x10213:
+                       dev_dbg(port->dev, "This version is usart\n");
+                       atmel_port->is_usart = true;
+                       break;
+               case 0x203:
+               case 0x10202:
+                       dev_dbg(port->dev, "This version is uart\n");
+                       atmel_port->is_usart = false;
+                       break;
+               default:
+                       dev_err(port->dev, "Not supported ip name nor version, set to uart\n");
+               }
        }
 }
 
index be201ca2990ce1a0363608b39f2dd210097c57a2..00beddf6be20358ca7cd108b54a45902c4478c8b 100644 (file)
 #define ATMEL_US_IF            0x4c                    /* IrDA Filter Register */
 
 #define ATMEL_US_NAME          0xf0                    /* Ip Name */
+#define ATMEL_US_VERSION       0xfc                    /* Ip Version */
 
 #endif
This page took 0.027505 seconds and 5 git commands to generate.