[PATCH] ppc64: Clean up CR handling
authorMilton Miller <miltonm@bga.com>
Tue, 6 Sep 2005 01:55:00 +0000 (11:55 +1000)
committerPaul Mackerras <paulus@samba.org>
Tue, 6 Sep 2005 06:07:36 +0000 (16:07 +1000)
Make the 16550 and real mode 16550 use tail recursion like the scc code
instead of repeating the routine except for the character sent.

Gcc recoginizes the tail recursion and handles it efficently without
stack allocations.  The maple real putc shrinks from 188 to 104 bytes
of instructions.  udbg_putc drops from 188 to 140 bytes.

Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/ppc64/kernel/udbg.c

index c0da45540f0f50e1a2695b4f325e99831cccd3e1..155670a40c3b8186988b3ea7f1d39a245d9fb787 100644 (file)
@@ -169,12 +169,8 @@ void udbg_maple_real_putc(unsigned char c)
                while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
                real_writeb(c, &udbg_comport->thr); eieio();
-               if (c == '\n') {
-                       /* Also put a CR.  This is for convenience. */
-                       while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
-                               /* wait for idle */;
-                       real_writeb('\r', &udbg_comport->thr); eieio();
-               }
+               if (c == '\n')
+                       udbg_maple_real_putc('\r');
        }
 }
 
@@ -194,12 +190,8 @@ void udbg_putc(unsigned char c)
                while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
                out_8(&udbg_comport->thr, c);
-               if (c == '\n') {
-                       /* Also put a CR.  This is for convenience. */
-                       while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
-                               /* wait for idle */; 
-                       out_8(&udbg_comport->thr, '\r');
-               }
+               if (c == '\n')
+                       udbg_putc('\r');
        }
 #ifdef CONFIG_PPC_PMAC
        else if (sccc) {