Re: [PATCH 2/2] tty/serial: at91: add a fallback option to determine uart/usart property

Jean-Christophe PLAGNIOL-VILLARD
2013-10-14T14:08:27Z

On 10:43 Thu 10 Oct , Nicolas Ferre wrote:
> 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>
> ---
> drivers/tty/serial/atmel_serial.c | 19 ++++++++++++++++++-
> include/linux/atmel_serial.h | 1 +
> 2 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
> index 6b0f75e..c7d99af 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);
> #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");

it's not really an error a dev_warn is more oppropriate
> + }
> }
> }
>
> diff --git a/include/linux/atmel_serial.h b/include/linux/atmel_serial.h
> index be201ca..00beddf 100644
> --- a/include/linux/atmel_serial.h
> +++ b/include/linux/atmel_serial.h
> @@ -125,5 +125,6 @@
> #define ATMEL_US_IF 0x4c /* IrDA Filter Register */
>
> #define ATMEL_US_NAME 0xf0 /* Ip Name */
> +#define ATMEL_US_VERSION 0xfc /* Ip Version */
>
> #endif
> --
> 1.8.2.2
>