Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
[linux-2.6] / arch / mips / jmr3927 / common / puts.c
1 /*
2  *
3  * BRIEF MODULE DESCRIPTION
4  *      Low level uart routines to directly access a TX[34]927 SIO.
5  *
6  * Copyright 2001 MontaVista Software Inc.
7  * Author: MontaVista Software, Inc.
8  *              ahennessy@mvista.com or source@mvista.com
9  *
10  * Copyright (C) 2000-2001 Toshiba Corporation
11  *
12  * Based on arch/mips/au1000/common/puts.c
13  *
14  *  This program is free software; you can redistribute  it and/or modify it
15  *  under  the terms of  the GNU General  Public License as published by the
16  *  Free Software Foundation;  either version 2 of the  License, or (at your
17  *  option) any later version.
18  *
19  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
20  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
21  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
22  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
23  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
25  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
27  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  *  You should have received a copy of the  GNU General Public License along
31  *  with this program; if not, write  to the Free Software Foundation, Inc.,
32  *  675 Mass Ave, Cambridge, MA 02139, USA.
33  */
34
35 #include <linux/types.h>
36 #include <asm/jmr3927/txx927.h>
37 #include <asm/jmr3927/tx3927.h>
38 #include <asm/jmr3927/jmr3927.h>
39
40 #define TIMEOUT       0xffffff
41 #define SLOW_DOWN
42
43 static const char digits[16] = "0123456789abcdef";
44
45 #ifdef SLOW_DOWN
46 #define slow_down() { int k; for (k=0; k<10000; k++); }
47 #else
48 #define slow_down()
49 #endif
50
51 void
52 putch(const unsigned char c)
53 {
54         int i = 0;
55
56         do {
57             slow_down();
58             i++;
59             if (i>TIMEOUT) {
60                 break;
61             }
62         } while (!(tx3927_sioptr(1)->cisr & TXx927_SICISR_TXALS));
63         tx3927_sioptr(1)->tfifo = c;
64         return;
65 }
66
67 unsigned char getch(void)
68 {
69         int i = 0;
70         int dicr;
71         char c;
72
73         /* diable RX int. */
74         dicr = tx3927_sioptr(1)->dicr;
75         tx3927_sioptr(1)->dicr = 0;
76
77         do {
78             slow_down();
79             i++;
80             if (i>TIMEOUT) {
81                 break;
82             }
83         } while (tx3927_sioptr(1)->disr & TXx927_SIDISR_UVALID)
84                 ;
85         c = tx3927_sioptr(1)->rfifo;
86
87         /* clear RX int. status */
88         tx3927_sioptr(1)->disr &= ~TXx927_SIDISR_RDIS;
89         /* enable RX int. */
90         tx3927_sioptr(1)->dicr = dicr;
91
92         return c;
93 }
94 void
95 do_jmr3927_led_set(char n)
96 {
97     /* and with current leds */
98     jmr3927_led_and_set(n);
99 }
100
101 void
102 puts(unsigned char *cp)
103 {
104     int i = 0;
105
106     while (*cp) {
107         do {
108             slow_down();
109             i++;
110             if (i>TIMEOUT) {
111                 break;
112             }
113         } while (!(tx3927_sioptr(1)->cisr & TXx927_SICISR_TXALS));
114         tx3927_sioptr(1)->tfifo = *cp++;
115     }
116     putch('\r');
117     putch('\n');
118 }
119
120 void
121 fputs(unsigned char *cp)
122 {
123     int i = 0;
124
125     while (*cp) {
126         do {
127              slow_down();
128             i++;
129             if (i>TIMEOUT) {
130                 break;
131             }
132         } while (!(tx3927_sioptr(1)->cisr & TXx927_SICISR_TXALS));
133         tx3927_sioptr(1)->tfifo = *cp++;
134     }
135 }
136
137
138 void
139 put64(uint64_t ul)
140 {
141     int cnt;
142     unsigned ch;
143
144     cnt = 16;            /* 16 nibbles in a 64 bit long */
145     putch('0');
146     putch('x');
147     do {
148         cnt--;
149         ch = (unsigned char)(ul >> cnt * 4) & 0x0F;
150                 putch(digits[ch]);
151     } while (cnt > 0);
152 }
153
154 void
155 put32(unsigned u)
156 {
157     int cnt;
158     unsigned ch;
159
160     cnt = 8;            /* 8 nibbles in a 32 bit long */
161     putch('0');
162     putch('x');
163     do {
164         cnt--;
165         ch = (unsigned char)(u >> cnt * 4) & 0x0F;
166                 putch(digits[ch]);
167     } while (cnt > 0);
168 }