linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] atmel_serial: Use the fractional divider when possible
@ 2017-02-10 15:24 Romain Izard
  2017-02-10 15:49 ` Ludovic Desroches
  0 siblings, 1 reply; 3+ messages in thread
From: Romain Izard @ 2017-02-10 15:24 UTC (permalink / raw)
  To: linux-serial, linux-arm-kernel, linux-kernel
  Cc: Greg Kroah-Hartman, Richard Genoud, Ludovic Desroches,
	Nicolas Ferre, Romain Izard

The fractional baud rate generator is available when using the
asynchronous mode of Atmel USART controllers. It makes it possible to
use higher baudrates, in exchange for a less precise clock with a
variable duty cycle.

The existing code restricts its use to the normal mode of the USART
controller, following the recommendation from the datasheet for the
first chip embedding this type of controller. This recommendation has
been removed from the documentation for the newer chips. After
verification, all revisions of this controller should be able to use the
fractional baud rate generator with the different asynchronous modes.

Removing the condition on ATMEL_US_USMODE makes it possible to get
correct baudrates at high speed in more cases.

This was tested with a board using an Atmel SAMA5D2 chip and a TI
WL1831 WiFi/Bluetooth combo chip at 3 Mbauds, with hardware flow control
enabled.

Signed-off-by: Romain Izard <romain.izard.pro@gmail.com>
---
 drivers/tty/serial/atmel_serial.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index fabbe76203bb..6684456dca9e 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -1758,7 +1758,9 @@ static void atmel_get_ip_name(struct uart_port *port)
 
 	/*
 	 * Only USART devices from at91sam9260 SOC implement fractional
-	 * baudrate.
+	 * baudrate. It is available for all asynchronous modes, with the
+	 * following restriction: the sampling clock's duty cycle is not
+	 * constant.
 	 */
 	atmel_port->has_frac_baudrate = false;
 	atmel_port->has_hw_timer = false;
@@ -2202,8 +2204,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
 	 * then
 	 * 8 CD + FP = selected clock / (2 * baudrate)
 	 */
-	if (atmel_port->has_frac_baudrate &&
-	    (mode & ATMEL_US_USMODE) == ATMEL_US_USMODE_NORMAL) {
+	if (atmel_port->has_frac_baudrate) {
 		div = DIV_ROUND_CLOSEST(port->uartclk, baud * 2);
 		cd = div >> 3;
 		fp = div & ATMEL_US_FP_MASK;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] atmel_serial: Use the fractional divider when possible
  2017-02-10 15:24 [PATCH] atmel_serial: Use the fractional divider when possible Romain Izard
@ 2017-02-10 15:49 ` Ludovic Desroches
  2017-02-13  8:07   ` Richard Genoud
  0 siblings, 1 reply; 3+ messages in thread
From: Ludovic Desroches @ 2017-02-10 15:49 UTC (permalink / raw)
  To: Romain Izard
  Cc: linux-serial, linux-arm-kernel, linux-kernel, Greg Kroah-Hartman,
	Richard Genoud, Ludovic Desroches, Nicolas Ferre

On Fri, Feb 10, 2017 at 04:24:46PM +0100, Romain Izard wrote:
> The fractional baud rate generator is available when using the
> asynchronous mode of Atmel USART controllers. It makes it possible to
> use higher baudrates, in exchange for a less precise clock with a
> variable duty cycle.
> 
> The existing code restricts its use to the normal mode of the USART
> controller, following the recommendation from the datasheet for the
> first chip embedding this type of controller. This recommendation has
> been removed from the documentation for the newer chips. After
> verification, all revisions of this controller should be able to use the
> fractional baud rate generator with the different asynchronous modes.
> 
> Removing the condition on ATMEL_US_USMODE makes it possible to get
> correct baudrates at high speed in more cases.
> 
> This was tested with a board using an Atmel SAMA5D2 chip and a TI
> WL1831 WiFi/Bluetooth combo chip at 3 Mbauds, with hardware flow control
> enabled.
> 
> Signed-off-by: Romain Izard <romain.izard.pro@gmail.com>

Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com>

Thanks

> ---
>  drivers/tty/serial/atmel_serial.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
> index fabbe76203bb..6684456dca9e 100644
> --- a/drivers/tty/serial/atmel_serial.c
> +++ b/drivers/tty/serial/atmel_serial.c
> @@ -1758,7 +1758,9 @@ static void atmel_get_ip_name(struct uart_port *port)
>  
>  	/*
>  	 * Only USART devices from at91sam9260 SOC implement fractional
> -	 * baudrate.
> +	 * baudrate. It is available for all asynchronous modes, with the
> +	 * following restriction: the sampling clock's duty cycle is not
> +	 * constant.
>  	 */
>  	atmel_port->has_frac_baudrate = false;
>  	atmel_port->has_hw_timer = false;
> @@ -2202,8 +2204,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
>  	 * then
>  	 * 8 CD + FP = selected clock / (2 * baudrate)
>  	 */
> -	if (atmel_port->has_frac_baudrate &&
> -	    (mode & ATMEL_US_USMODE) == ATMEL_US_USMODE_NORMAL) {
> +	if (atmel_port->has_frac_baudrate) {
>  		div = DIV_ROUND_CLOSEST(port->uartclk, baud * 2);
>  		cd = div >> 3;
>  		fp = div & ATMEL_US_FP_MASK;
> -- 
> 2.9.3
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] atmel_serial: Use the fractional divider when possible
  2017-02-10 15:49 ` Ludovic Desroches
@ 2017-02-13  8:07   ` Richard Genoud
  0 siblings, 0 replies; 3+ messages in thread
From: Richard Genoud @ 2017-02-13  8:07 UTC (permalink / raw)
  To: Romain Izard, linux-serial, linux-arm-kernel, linux-kernel,
	Greg Kroah-Hartman, Richard Genoud, Nicolas Ferre
  Cc: Ludovic Desroches

2017-02-10 16:49 GMT+01:00 Ludovic Desroches <ludovic.desroches@microchip.com>:
> On Fri, Feb 10, 2017 at 04:24:46PM +0100, Romain Izard wrote:
>> The fractional baud rate generator is available when using the
>> asynchronous mode of Atmel USART controllers. It makes it possible to
>> use higher baudrates, in exchange for a less precise clock with a
>> variable duty cycle.
>>
>> The existing code restricts its use to the normal mode of the USART
>> controller, following the recommendation from the datasheet for the
>> first chip embedding this type of controller. This recommendation has
>> been removed from the documentation for the newer chips. After
>> verification, all revisions of this controller should be able to use the
>> fractional baud rate generator with the different asynchronous modes.
>>
>> Removing the condition on ATMEL_US_USMODE makes it possible to get
>> correct baudrates at high speed in more cases.
>>
>> This was tested with a board using an Atmel SAMA5D2 chip and a TI
>> WL1831 WiFi/Bluetooth combo chip at 3 Mbauds, with hardware flow control
>> enabled.
>>
>> Signed-off-by: Romain Izard <romain.izard.pro@gmail.com>
>
> Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com>

Signed-off-by: Richard Genoud <richard.genoud@gmail.com>

Thanks !
> Thanks
>
>> ---
>>  drivers/tty/serial/atmel_serial.c | 7 ++++---
>>  1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
>> index fabbe76203bb..6684456dca9e 100644
>> --- a/drivers/tty/serial/atmel_serial.c
>> +++ b/drivers/tty/serial/atmel_serial.c
>> @@ -1758,7 +1758,9 @@ static void atmel_get_ip_name(struct uart_port *port)
>>
>>       /*
>>        * Only USART devices from at91sam9260 SOC implement fractional
>> -      * baudrate.
>> +      * baudrate. It is available for all asynchronous modes, with the
>> +      * following restriction: the sampling clock's duty cycle is not
>> +      * constant.
>>        */
>>       atmel_port->has_frac_baudrate = false;
>>       atmel_port->has_hw_timer = false;
>> @@ -2202,8 +2204,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
>>        * then
>>        * 8 CD + FP = selected clock / (2 * baudrate)
>>        */
>> -     if (atmel_port->has_frac_baudrate &&
>> -         (mode & ATMEL_US_USMODE) == ATMEL_US_USMODE_NORMAL) {
>> +     if (atmel_port->has_frac_baudrate) {
>>               div = DIV_ROUND_CLOSEST(port->uartclk, baud * 2);
>>               cd = div >> 3;
>>               fp = div & ATMEL_US_FP_MASK;
>> --
>> 2.9.3
>>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-02-13  8:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-10 15:24 [PATCH] atmel_serial: Use the fractional divider when possible Romain Izard
2017-02-10 15:49 ` Ludovic Desroches
2017-02-13  8:07   ` Richard Genoud

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).