public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] s3c44b0 serial driver questions
@ 2010-06-21 12:45 Brian Cavagnolo
  2010-06-22 17:11 ` Andrea Scian
  0 siblings, 1 reply; 3+ messages in thread
From: Brian Cavagnolo @ 2010-06-21 12:45 UTC (permalink / raw)
  To: u-boot

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();

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

end of thread, other threads:[~2010-06-29 16:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-21 12:45 [U-Boot] s3c44b0 serial driver questions Brian Cavagnolo
2010-06-22 17:11 ` Andrea Scian
2010-06-29 16:54   ` Brian Cavagnolo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox