2 * (C) Copyright 2000 - 2003
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 * Hacked for MPC8260 by Murray.Jensen@cmst.csiro.au, 19-Oct-00, with
24 * changes based on the file arch/powerpc/mbxboot/m8260_tty.c from the
25 * Linux/PPC sources (m8260_tty.c had no copyright info in it).
27 * Martin Krause, 8 Jun 2006
28 * Added SERIAL_MULTI support
32 * Minimal serial functions needed to use one of the PSC ports
33 * as serial console interface.
37 #include <linux/compiler.h>
41 DECLARE_GLOBAL_DATA_PTR
;
43 #if defined(CONFIG_PSC_CONSOLE)
45 #if CONFIG_PSC_CONSOLE == 1
46 #define PSC_BASE MPC5XXX_PSC1
47 #elif CONFIG_PSC_CONSOLE == 2
48 #define PSC_BASE MPC5XXX_PSC2
49 #elif CONFIG_PSC_CONSOLE == 3
50 #define PSC_BASE MPC5XXX_PSC3
51 #elif CONFIG_PSC_CONSOLE == 4
52 #define PSC_BASE MPC5XXX_PSC4
53 #elif CONFIG_PSC_CONSOLE == 5
54 #define PSC_BASE MPC5XXX_PSC5
55 #elif CONFIG_PSC_CONSOLE == 6
56 #define PSC_BASE MPC5XXX_PSC6
58 #error CONFIG_PSC_CONSOLE must be in 1 ... 6
61 #if defined(CONFIG_PSC_CONSOLE2)
63 #if CONFIG_PSC_CONSOLE2 == 1
64 #define PSC_BASE2 MPC5XXX_PSC1
65 #elif CONFIG_PSC_CONSOLE2 == 2
66 #define PSC_BASE2 MPC5XXX_PSC2
67 #elif CONFIG_PSC_CONSOLE2 == 3
68 #define PSC_BASE2 MPC5XXX_PSC3
69 #elif CONFIG_PSC_CONSOLE2 == 4
70 #define PSC_BASE2 MPC5XXX_PSC4
71 #elif CONFIG_PSC_CONSOLE2 == 5
72 #define PSC_BASE2 MPC5XXX_PSC5
73 #elif CONFIG_PSC_CONSOLE2 == 6
74 #define PSC_BASE2 MPC5XXX_PSC6
76 #error CONFIG_PSC_CONSOLE2 must be in 1 ... 6
81 int serial_init_dev (unsigned long dev_base
)
83 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
84 unsigned long baseclk
;
88 psc
->command
= PSC_SEL_MODE_REG_1
;
90 /* select clock sources */
91 psc
->psc_clock_select
= 0;
92 baseclk
= (gd
->arch
.ipb_clk
+ 16) / 32;
94 /* switch to UART mode */
97 /* configure parity, bit length and so on */
98 psc
->mode
= PSC_MODE_8_BITS
| PSC_MODE_PARNONE
;
99 psc
->mode
= PSC_MODE_ONE_STOP
;
101 /* set up UART divisor */
102 div
= (baseclk
+ (gd
->baudrate
/2)) / gd
->baudrate
;
103 psc
->ctur
= (div
>> 8) & 0xff;
104 psc
->ctlr
= div
& 0xff;
106 /* disable all interrupts */
109 /* reset and enable Rx/Tx */
110 psc
->command
= PSC_RST_RX
;
111 psc
->command
= PSC_RST_TX
;
112 psc
->command
= PSC_RX_ENABLE
| PSC_TX_ENABLE
;
117 void serial_putc_dev (unsigned long dev_base
, const char c
)
119 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
122 serial_putc_dev (dev_base
, '\r');
124 /* Wait for last character to go. */
125 while (!(psc
->psc_status
& PSC_SR_TXEMP
))
128 psc
->psc_buffer_8
= c
;
131 void serial_putc_raw_dev(unsigned long dev_base
, const char c
)
133 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
134 /* Wait for last character to go. */
135 while (!(psc
->psc_status
& PSC_SR_TXEMP
))
138 psc
->psc_buffer_8
= c
;
142 void serial_puts_dev (unsigned long dev_base
, const char *s
)
145 serial_putc_dev (dev_base
, *s
++);
149 int serial_getc_dev (unsigned long dev_base
)
151 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
153 /* Wait for a character to arrive. */
154 while (!(psc
->psc_status
& PSC_SR_RXRDY
))
157 return psc
->psc_buffer_8
;
160 int serial_tstc_dev (unsigned long dev_base
)
162 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
164 return (psc
->psc_status
& PSC_SR_RXRDY
);
167 void serial_setbrg_dev (unsigned long dev_base
)
169 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
170 unsigned long baseclk
, div
;
172 baseclk
= (gd
->arch
.ipb_clk
+ 16) / 32;
174 /* set up UART divisor */
175 div
= (baseclk
+ (gd
->baudrate
/2)) / gd
->baudrate
;
176 psc
->ctur
= (div
>> 8) & 0xFF;
177 psc
->ctlr
= div
& 0xff;
180 void serial_setrts_dev (unsigned long dev_base
, int s
)
182 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
185 /* Assert RTS (become LOW) */
189 /* Negate RTS (become HIGH) */
194 int serial_getcts_dev (unsigned long dev_base
)
196 volatile struct mpc5xxx_psc
*psc
= (struct mpc5xxx_psc
*)dev_base
;
198 return (psc
->ip
& 0x1) ? 0 : 1;
201 int serial0_init(void)
203 return (serial_init_dev(PSC_BASE
));
206 void serial0_setbrg (void)
208 serial_setbrg_dev(PSC_BASE
);
211 void serial0_putc(const char c
)
213 serial_putc_dev(PSC_BASE
,c
);
216 void serial0_puts(const char *s
)
218 serial_puts_dev(PSC_BASE
, s
);
221 int serial0_getc(void)
223 return(serial_getc_dev(PSC_BASE
));
226 int serial0_tstc(void)
228 return (serial_tstc_dev(PSC_BASE
));
231 struct serial_device serial0_device
=
234 .start
= serial0_init
,
236 .setbrg
= serial0_setbrg
,
237 .getc
= serial0_getc
,
238 .tstc
= serial0_tstc
,
239 .putc
= serial0_putc
,
240 .puts
= serial0_puts
,
243 __weak
struct serial_device
*default_serial_console(void)
245 return &serial0_device
;
248 #ifdef CONFIG_PSC_CONSOLE2
249 int serial1_init(void)
251 return serial_init_dev(PSC_BASE2
);
254 void serial1_setbrg(void)
256 serial_setbrg_dev(PSC_BASE2
);
259 void serial1_putc(const char c
)
261 serial_putc_dev(PSC_BASE2
, c
);
264 void serial1_puts(const char *s
)
266 serial_puts_dev(PSC_BASE2
, s
);
269 int serial1_getc(void)
271 return serial_getc_dev(PSC_BASE2
);
274 int serial1_tstc(void)
276 return serial_tstc_dev(PSC_BASE2
);
279 struct serial_device serial1_device
=
282 .start
= serial1_init
,
284 .setbrg
= serial1_setbrg
,
285 .getc
= serial1_getc
,
286 .tstc
= serial1_tstc
,
287 .putc
= serial1_putc
,
288 .puts
= serial1_puts
,
290 #endif /* CONFIG_PSC_CONSOLE2 */
292 #endif /* CONFIG_PSC_CONSOLE */