[U-Boot] s3c44b0 serial driver questions

Brian Cavagnolo
2010-06-21T12:45:30Z

Hello,

I'm hoping to use the s3c44b0 serial driver for a CPU with very similar serial
hardware. One change that I must make is to calculate the baud rate divisor
with a macro because this operation is board-specific. I propose to clean up
the large switch statement in the existing code with a macro that calculates
the BRD using the formula in the datasheet ("S3C44B0X RISC MICROPROCESSOR"
pg. 10-7; See proposed patch below.) However, the BRD values in the current
code for the 66MHz case do not match the formula in the data sheet. They are
all skewed high. Is this a bug?

Ciao,
Brian

diff --git a/arch/arm/include/asm/arch-s3c44b0/hardware.h
b/arch/arm/include/asm/arch-s3c44b0/hardware.h
index 146e265..38ff32c 100644
--- a/arch/arm/include/asm/arch-s3c44b0/hardware.h
+++ b/arch/arm/include/asm/arch-s3c44b0/hardware.h
@@ -11,7 +11,8 @@
#define REGL(addr) (*(volatile unsigned int *)(REGBASE+addr))
#define REGW(addr) (*(volatile unsigned short *)(REGBASE+addr))
#define REGB(addr) (*(volatile unsigned char *)(REGBASE+addr))
-
+#define BRD(bps) (DIV_ROUND(CONFIG_S3C44B0_CLOCK_SPEED * 1000000, \
+ (bps)*16) - 1)

/*****************************/
/* CPU Wrapper Registers */
diff --git a/drivers/serial/serial_s3c44b0.c b/drivers/serial/serial_s3c44b0.c
index 95d0266..e6c535c 100644
--- a/drivers/serial/serial_s3c44b0.c
+++ b/drivers/serial/serial_s3c44b0.c
@@ -70,68 +70,7 @@ static int serial_flush_output(void)

void serial_setbrg (void)
{
- u32 divisor = 0;
-
- /* get correct divisor */
- switch(gd->baudrate) {
-
- case 1200:
-#if CONFIG_S3C44B0_CLOCK_SPEED==66
- divisor = 3124;
-#elif CONFIG_S3C44B0_CLOCK_SPEED==75
- divisor = 3905;
-#else
-# error CONFIG_S3C44B0_CLOCK_SPEED undefined
-#endif
- break;
-
- case 9600:
-#if CONFIG_S3C44B0_CLOCK_SPEED==66
- divisor = 390;
-#elif CONFIG_S3C44B0_CLOCK_SPEED==75
- divisor = 487;
-#else
-# error CONFIG_S3C44B0_CLOCK_SPEED undefined
-#endif
- break;
-
- case 19200:
-#if CONFIG_S3C44B0_CLOCK_SPEED==66
- divisor = 194;
-#elif CONFIG_S3C44B0_CLOCK_SPEED==75
- divisor = 243;
-#else
-# error CONFIG_S3C44B0_CLOCK_SPEED undefined
-#endif
- break;
-
- case 38400:
-#if CONFIG_S3C44B0_CLOCK_SPEED==66
- divisor = 97;
-#elif CONFIG_S3C44B0_CLOCK_SPEED==75
- divisor = 121;
-#else
-# error CONFIG_S3C44B0_CLOCK_SPEED undefined
-#endif /* break; */
-
- case 57600:
-#if CONFIG_S3C44B0_CLOCK_SPEED==66
- divisor = 64;
-#elif CONFIG_S3C44B0_CLOCK_SPEED==75
- divisor = 80;
-#else
-# error CONFIG_S3C44B0_CLOCK_SPEED undefined
-#endif /* break; */
-
- case 115200:
-#if CONFIG_S3C44B0_CLOCK_SPEED==66
- divisor = 32;
-#elif CONFIG_S3C44B0_CLOCK_SPEED==75
- divisor = 40;
-#else
-# error CONFIG_S3C44B0_CLOCK_SPEED undefined
-#endif /* break; */
- }
+ u32 divisor = BRD(gd->baudrate);

serial_flush_output();
serial_flush_input();