aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMilton Miller <miltonm@bga.com>2005-09-05 21:55:00 -0400
committerPaul Mackerras <paulus@samba.org>2005-09-06 02:07:36 -0400
commitcb14c4d641b4e083fae7ce4a0e8a3973cecb7554 (patch)
tree68f5365c31beb472c5c4df25fbcb3422cb7d76eb /arch
parent5fdabaab01ee8928597aae8a0178a3a4f7b66365 (diff)
[PATCH] ppc64: Clean up CR handling
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/ppc64/kernel/udbg.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/arch/ppc64/kernel/udbg.c b/arch/ppc64/kernel/udbg.c
index c0da45540f0f..155670a40c3b 100644
--- a/arch/ppc64/kernel/udbg.c
+++ b/arch/ppc64/kernel/udbg.c
@@ -169,12 +169,8 @@ void udbg_maple_real_putc(unsigned char c)
169 while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0) 169 while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
170 /* wait for idle */; 170 /* wait for idle */;
171 real_writeb(c, &udbg_comport->thr); eieio(); 171 real_writeb(c, &udbg_comport->thr); eieio();
172 if (c == '\n') { 172 if (c == '\n')
173 /* Also put a CR. This is for convenience. */ 173 udbg_maple_real_putc('\r');
174 while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
175 /* wait for idle */;
176 real_writeb('\r', &udbg_comport->thr); eieio();
177 }
178 } 174 }
179} 175}
180 176
@@ -194,12 +190,8 @@ void udbg_putc(unsigned char c)
194 while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0) 190 while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
195 /* wait for idle */; 191 /* wait for idle */;
196 out_8(&udbg_comport->thr, c); 192 out_8(&udbg_comport->thr, c);
197 if (c == '\n') { 193 if (c == '\n')
198 /* Also put a CR. This is for convenience. */ 194 udbg_putc('\r');
199 while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
200 /* wait for idle */;
201 out_8(&udbg_comport->thr, '\r');
202 }
203 } 195 }
204#ifdef CONFIG_PPC_PMAC 196#ifdef CONFIG_PPC_PMAC
205 else if (sccc) { 197 else if (sccc) {