Hello Greg,

mcfserial tweaks [2/3] - Support fine baudrate adjustment on M5272
(ported forward from 2.4.20-uc0)

Patch submitted by Bernardo Innocenti <bernie@develer.com>
Applies to 2.5.75-uc0 (and most probably 2.6.0-test1).

diff -Nru linux-2.5.75-uc0/drivers/serial/mcfserial.c linux-2.5.75-uc0-develer/drivers/serial/mcfserial.c
--- linux-2.5.75-uc0/drivers/serial/mcfserial.c	2003-07-12 20:25:18.000000000 +0200
+++ linux-2.5.75-uc0-develer/drivers/serial/mcfserial.c	2003-07-15 20:22:28.000000000 +0200
@@ -608,6 +609,9 @@
 	unsigned long		flags;
 	unsigned char		mr1, mr2;
 	int			i;
+#ifdef	CONFIG_M5272
+	unsigned int		fraction;
+#endif
 
 	if (!info->tty || !info->tty->termios)
 		return;
@@ -631,7 +635,20 @@
 		mcfrs_setsignals(info, 0, -1);
 		return;
 	}
+
+	/* compute the baudrate clock */
+#ifdef	CONFIG_M5272
+	/*
+	 * For the MCF5272, also compute the baudrate fraction.
+	 */
+	baudclk = (MCF_BUSCLK / mcfrs_baud_table[i]) / 32;
+	fraction = MCF_BUSCLK - (baudclk * 32 * mcfrs_baud_table[i]);
+	fraction *= 16;
+	fraction /= (32 * mcfrs_baud_table[i]);
+#else
 	baudclk = ((MCF_BUSCLK / mcfrs_baud_table[i]) + 16) / 32;
+#endif
+
 	info->baud = mcfrs_baud_table[i];
 
 	mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR;
@@ -695,6 +712,9 @@
 	uartp[MCFUART_UMR] = mr2;
 	uartp[MCFUART_UBG1] = (baudclk & 0xff00) >> 8;	/* set msb byte */
 	uartp[MCFUART_UBG2] = (baudclk & 0xff);		/* set lsb byte */
+#ifdef	CONFIG_M5272
+	uartp[MCFUART_UFPD] = (fraction & 0xf);		/* set fraction */
+#endif
 	uartp[MCFUART_UCSR] = MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER;
 	uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE;
 	mcfrs_setsignals(info, 1, -1);
@@ -1570,6 +1660,7 @@
 	.start = mcfrs_start,
 	.hangup = mcfrs_hangup,
 	.read_proc = mcfrs_readproc,
+	.wait_until_sent = mcfrs_wait_until_sent,
 };
 
 /* mcfrs_init inits the driver */
