[PATCH 5/7] serial: at91: distinguish usart and uart

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Tue Jul 9 07:25:00 EDT 2013


On 14:33 Tue 09 Jul     , Elen Song wrote:
> Distinguish usart and uart by read ip name register,
> dbgu regards as uart.
> 
> Signed-off-by: Elen Song <elen.song at atmel.com>
> ---
>  drivers/tty/serial/atmel_serial.c |   35 +++++++++++++++++++++++++++++++++++
>  include/linux/atmel_serial.h      |    2 ++
>  2 files changed, 37 insertions(+)
> 
> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
> index 52beb7e..5762244 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_BRGR(port,v)	__raw_writel(v, (port)->membase + ATMEL_US_BRGR)
>  #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)
>  
>   /* PDC registers */
>  #define UART_PUT_PTCR(port,v)	__raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
> @@ -169,6 +170,7 @@ struct atmel_uart_port {
>  	struct serial_rs485	rs485;		/* rs485 settings */
>  	unsigned int		tx_done_mask;
>  	struct timer_list 	uart_timer;	/* dbgu timer */
> +	bool			is_usart;	/* usart or uart */
>  };
>  
>  static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
> @@ -1328,6 +1330,34 @@ static void atmel_tasklet_func(unsigned long data)
>  }
>  
>  /*
> + * Get ip name usart or uart
> + */
> +static inline unsigned int atmel_get_ip_name(struct uart_port *port)
> +{
> +	struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
> +	unsigned int name = cpu_to_be32(UART_GET_IP_NAME(port));
> +	char *ip_name = (char *)&name;
> +	char *usart = "USAR";
> +	char *uart = "DBGU";
> +
> +	atmel_port->is_usart = false;
> +
> +	/* USAR is regards as usart, DBGU is regards as uart */
> +	if (!strncmp(ip_name, usart, 4)) {
> +		dev_dbg(port->dev, "This is usart\n");
> +		atmel_port->is_usart = true;
> +	} else if (!strncmp(ip_name, uart, 4)) {
> +		dev_dbg(port->dev, "This is uart\n");
> +		atmel_port->is_usart = false;
do not use string just value
> +	} else {
> +		dev_err(port->dev, "Not supported ip name, set to uart\n");
> +		return -EINVAL;
> +	}

> +
> +	return 0;
> +}
> +
> +/*
>   * Perform initialization and enable port for reception
>   */
>  static int atmel_startup(struct uart_port *port)
> @@ -1354,6 +1384,11 @@ static int atmel_startup(struct uart_port *port)
>  	}
>  
>  	/*
> +	 * Get port name of usart or uart
> +	 */
> +	atmel_get_ip_name(port);
> +
> +	/*
>  	 * Initialize DMA (if necessary)
>  	 */
>  	if (atmel_use_pdc_rx(port)) {
> diff --git a/include/linux/atmel_serial.h b/include/linux/atmel_serial.h
> index fd68337..be201ca 100644
> --- a/include/linux/atmel_serial.h
> +++ b/include/linux/atmel_serial.h
> @@ -124,4 +124,6 @@
>  #define ATMEL_US_NER		0x44			/* Number of Errors Register */
>  #define ATMEL_US_IF		0x4c			/* IrDA Filter Register */
>  
> +#define ATMEL_US_NAME		0xf0			/* Ip Name */
> +
>  #endif
> -- 
> 1.7.9.5
> 



More information about the linux-arm-kernel mailing list