[U-Boot] s3c44b0 serial driver questions

Brian Cavagnolo
2010-06-29T16:54:31Z

On Tue, Jun 22, 2010 at 10:11 AM, Andrea Scian
<andrea.scian@dave-tech.it> wrote:
>
> Dear Brian,
>
> yes it can be. IIRC I worked only with 75MHz version of S3C44B0, I've never
> used a 66MHz one.

It seems that no existing boards use this driver in the 66MHz mode.
So perhaps nobody has used it:)

> Unfortunately I do not have such a board here, neither the time ;-), to
> check your bug report..
> Did you already check the 66MHz BRD formula?

Yes. The existing dividers are correct for the 75MHz case, but are
all off by 5 or 10% for the 66MHz case.

> If it's correct in you testbed to me you can send the patch for commiting

I'm not testing on an ARM7/B2. I'm testing on an ARM9 called Pollux
that has similar serial hardware. My proposed change is meant to
groom the driver so it can work for S3C44B0 and Pollux targets (and
perhaps others). I'll submit the patch for review shortly.

Ciao,
Brian

>
> Best Regards,
>
> --
>
>
> Andrea Scian
>
> DAVE Srl - Electronics System House
> via Forniz 2/1
> 33080 Porcia (PN) - Italy
> Telephone: +39.0434.921215
> Telefax: +39.0434.1994030
> web: www.dave-tech.it
> e-mail address: andrea.scian at dave-tech.it
> how to reach us: http://mail.map24.com/dave
>
>
> On 21/06/2010 14.45, Brian Cavagnolo wrote:
>>
>> 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();
>>
>>
>