[U-Boot] [PATCH] bug fix and cleanup for s3c44b0 serial driver

Brian Cavagnolo brian at cozybit.com
Tue Jun 29 18:58:47 CEST 2010


Specifically, don't dereference the URXH0 register twice; calculate the BRD
based on the formula in the databook instead of using a messy switch statement;
and migrate the BRD calculation to the hardware hardware header because it's
board specific.

Signed-off-by: Brian Cavagnolo <brian at cozybit.com>
---
 arch/arm/include/asm/arch-s3c44b0/hardware.h |    3 +-
 drivers/serial/serial_s3c44b0.c              |   65 +-------------------------
 2 files changed, 4 insertions(+), 64 deletions(-)

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
@@ -48,7 +48,7 @@ static int serial_flush_input(void)
 
 	/* keep on reading as long as the receiver is not empty */
 	while(UTRSTAT0&0x01) {
-		tmp = REGB(URXH0);
+		tmp = URXH0;
 	}
 
 	return 0;
@@ -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();
-- 
1.6.0.4



More information about the U-Boot mailing list