[U-Boot-Users] [PATCH V2] Round the serial port clock divisor value returned by calc_divisor()

Round the serial port clock divisor value returned by calc_divisor().
Signed-off-by: Hugo Villeneuve hugo.villeneuve@lyrtech.com Signed-off-by: John Roberts john.roberts@pwav.com
---
Rounding is important, especially when using high baud rates values like 115200bps. When using the non-rounded value, some boards will work and some won't.
drivers/serial/serial.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 76425d8..1192f07 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -144,8 +144,12 @@ static int calc_divisor (NS16550_t port) #else #define MODE_X_DIV 16 #endif - return (CFG_NS16550_CLK / MODE_X_DIV / gd->baudrate);
+ /* Compute divisor value. Normally, we should simply return: + * CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate + * but we need to round that value by adding 0.5 or 8/16. + * Rounding is especially important at high baud rates. */ + return (((16 * CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate) + 8) / 16; }
#if !defined(CONFIG_SERIAL_MULTI)

In message 1215543298-26921-1-git-send-email-hugo.villeneuve@lyrtech.com you wrote:
Round the serial port clock divisor value returned by calc_divisor().
Signed-off-by: Hugo Villeneuve hugo.villeneuve@lyrtech.com Signed-off-by: John Roberts john.roberts@pwav.com
Rounding is important, especially when using high baud rates values like 115200bps. When using the non-rounded value, some boards will work and some won't.
drivers/serial/serial.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
Applied (afterfixing the broken multi-line comment). Thanks.
Best regards,
Wolfgang Denk

In message 1215543298-26921-1-git-send-email-hugo.villeneuve@lyrtech.com you wrote:
Round the serial port clock divisor value returned by calc_divisor().
Signed-off-by: Hugo Villeneuve hugo.villeneuve@lyrtech.com Signed-off-by: John Roberts john.roberts@pwav.com
Rounding is important, especially when using high baud rates values like 115200bps. When using the non-rounded value, some boards will work and some won't.
drivers/serial/serial.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 76425d8..1192f07 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -144,8 +144,12 @@ static int calc_divisor (NS16550_t port) #else #define MODE_X_DIV 16 #endif
- return (CFG_NS16550_CLK / MODE_X_DIV / gd->baudrate);
- /* Compute divisor value. Normally, we should simply return:
* CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate
* but we need to round that value by adding 0.5 or 8/16.
* Rounding is especially important at high baud rates. */
- return (((16 * CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate) + 8) / 16;
}
Your patch causes problems with some boards:
Configuring for SBC8540 board... serial.c: In function 'calc_divisor': serial.c:153: warning: integer overflow in expression serial.c:153: warning: integer overflow in expression
Configuring for sbc8548 board... serial.c: In function 'calc_divisor': serial.c:153: warning: integer overflow in expression serial.c:153: warning: integer overflow in expression
Do you have a quick fix, or shall I back out the patch?
Best regards,
Wolfgang Denk

Wolfgang Denk wrote:
In message 1215543298-26921-1-git-send-email-hugo.villeneuve@lyrtech.com you wrote:
Round the serial port clock divisor value returned by calc_divisor().
Signed-off-by: Hugo Villeneuve hugo.villeneuve@lyrtech.com Signed-off-by: John Roberts john.roberts@pwav.com
Rounding is important, especially when using high baud rates values like 115200bps. When using the non-rounded value, some boards will work and some won't.
drivers/serial/serial.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 76425d8..1192f07 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -144,8 +144,12 @@ static int calc_divisor (NS16550_t port) #else #define MODE_X_DIV 16 #endif
- return (CFG_NS16550_CLK / MODE_X_DIV / gd->baudrate);
- /* Compute divisor value. Normally, we should simply return:
* CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate
* but we need to round that value by adding 0.5 or 8/16.
* Rounding is especially important at high baud rates. */
- return (((16 * CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate) + 8) / 16;
}
Your patch causes problems with some boards:
Configuring for SBC8540 board... serial.c: In function 'calc_divisor': serial.c:153: warning: integer overflow in expression serial.c:153: warning: integer overflow in expression
Configuring for sbc8548 board... serial.c: In function 'calc_divisor': serial.c:153: warning: integer overflow in expression serial.c:153: warning: integer overflow in expression
Do you have a quick fix, or shall I back out the patch?
Best regards,
Wolfgang Denk
The formula I proposed previously in this thread compiles OK. I cannot verify it is correct on real hardware, however. http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/43499/focus=43506
My apologies for providing the patch as an attachment. I need to add the external editor plugin so I can use tbird for proper inline patches.
Best regards, gvb
participants (3)
-
Hugo Villeneuve
-
Jerry Van Baren
-
Wolfgang Denk