diff options
-rw-r--r-- | drivers/tty/serial/atmel_serial.c | 19 | ||||
-rw-r--r-- | include/linux/atmel_serial.h | 1 |
2 files changed, 19 insertions, 1 deletions
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 6b0f75eac8a2..c7d99af46a96 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c | |||
@@ -99,6 +99,7 @@ static void atmel_stop_rx(struct uart_port *port); | |||
99 | #define UART_PUT_RTOR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_RTOR) | 99 | #define UART_PUT_RTOR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_RTOR) |
100 | #define UART_PUT_TTGR(port, v) __raw_writel(v, (port)->membase + ATMEL_US_TTGR) | 100 | #define UART_PUT_TTGR(port, v) __raw_writel(v, (port)->membase + ATMEL_US_TTGR) |
101 | #define UART_GET_IP_NAME(port) __raw_readl((port)->membase + ATMEL_US_NAME) | 101 | #define UART_GET_IP_NAME(port) __raw_readl((port)->membase + ATMEL_US_NAME) |
102 | #define UART_GET_IP_VERSION(port) __raw_readl((port)->membase + ATMEL_US_VERSION) | ||
102 | 103 | ||
103 | /* PDC registers */ | 104 | /* PDC registers */ |
104 | #define UART_PUT_PTCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR) | 105 | #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) | |||
1503 | { | 1504 | { |
1504 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); | 1505 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
1505 | int name = UART_GET_IP_NAME(port); | 1506 | int name = UART_GET_IP_NAME(port); |
1507 | u32 version; | ||
1506 | int usart, uart; | 1508 | int usart, uart; |
1507 | /* usart and uart ascii */ | 1509 | /* usart and uart ascii */ |
1508 | usart = 0x55534152; | 1510 | usart = 0x55534152; |
@@ -1517,7 +1519,22 @@ static void atmel_get_ip_name(struct uart_port *port) | |||
1517 | dev_dbg(port->dev, "This is uart\n"); | 1519 | dev_dbg(port->dev, "This is uart\n"); |
1518 | atmel_port->is_usart = false; | 1520 | atmel_port->is_usart = false; |
1519 | } else { | 1521 | } else { |
1520 | dev_err(port->dev, "Not supported ip name, set to uart\n"); | 1522 | /* fallback for older SoCs: use version field */ |
1523 | version = UART_GET_IP_VERSION(port); | ||
1524 | switch (version) { | ||
1525 | case 0x302: | ||
1526 | case 0x10213: | ||
1527 | dev_dbg(port->dev, "This version is usart\n"); | ||
1528 | atmel_port->is_usart = true; | ||
1529 | break; | ||
1530 | case 0x203: | ||
1531 | case 0x10202: | ||
1532 | dev_dbg(port->dev, "This version is uart\n"); | ||
1533 | atmel_port->is_usart = false; | ||
1534 | break; | ||
1535 | default: | ||
1536 | dev_err(port->dev, "Not supported ip name nor version, set to uart\n"); | ||
1537 | } | ||
1521 | } | 1538 | } |
1522 | } | 1539 | } |
1523 | 1540 | ||
diff --git a/include/linux/atmel_serial.h b/include/linux/atmel_serial.h index be201ca2990c..00beddf6be20 100644 --- a/include/linux/atmel_serial.h +++ b/include/linux/atmel_serial.h | |||
@@ -125,5 +125,6 @@ | |||
125 | #define ATMEL_US_IF 0x4c /* IrDA Filter Register */ | 125 | #define ATMEL_US_IF 0x4c /* IrDA Filter Register */ |
126 | 126 | ||
127 | #define ATMEL_US_NAME 0xf0 /* Ip Name */ | 127 | #define ATMEL_US_NAME 0xf0 /* Ip Name */ |
128 | #define ATMEL_US_VERSION 0xfc /* Ip Version */ | ||
128 | 129 | ||
129 | #endif | 130 | #endif |