1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/types.h>
14#include <linux/tty.h>
15#include <linux/console.h>
16#include <linux/init.h>
17#include <linux/delay.h>
18
19#include <asm/atarihw.h>
20#include <asm/atariints.h>
21
22
23int atari_MFP_init_done;
24
25int atari_SCC_init_done;
26
27
28int atari_SCC_reset_done;
29
30static struct console atari_console_driver = {
31 .name = "debug",
32 .flags = CON_PRINTBUFFER,
33 .index = -1,
34};
35
36
37static inline void ata_mfp_out(char c)
38{
39 while (!(mfp.trn_stat & 0x80))
40 barrier();
41 mfp.usart_dta = c;
42}
43
44void atari_mfp_console_write(struct console *co, const char *str,
45 unsigned int count)
46{
47 while (count--) {
48 if (*str == '\n')
49 ata_mfp_out('\r');
50 ata_mfp_out(*str++);
51 }
52}
53
54static inline void ata_scc_out(char c)
55{
56 do {
57 MFPDELAY();
58 } while (!(scc.cha_b_ctrl & 0x04));
59 MFPDELAY();
60 scc.cha_b_data = c;
61}
62
63void atari_scc_console_write(struct console *co, const char *str,
64 unsigned int count)
65{
66 while (count--) {
67 if (*str == '\n')
68 ata_scc_out('\r');
69 ata_scc_out(*str++);
70 }
71}
72
73static inline void ata_midi_out(char c)
74{
75 while (!(acia.mid_ctrl & ACIA_TDRE))
76 barrier();
77 acia.mid_data = c;
78}
79
80void atari_midi_console_write(struct console *co, const char *str,
81 unsigned int count)
82{
83 while (count--) {
84 if (*str == '\n')
85 ata_midi_out('\r');
86 ata_midi_out(*str++);
87 }
88}
89
90static int ata_par_out(char c)
91{
92 unsigned char tmp;
93
94 unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
95
96 while ((mfp.par_dt_reg & 1) && --i)
97 ;
98 if (!i)
99 return 0;
100
101 sound_ym.rd_data_reg_sel = 15;
102 sound_ym.wd_data = c;
103 sound_ym.rd_data_reg_sel = 14;
104 tmp = sound_ym.rd_data_reg_sel;
105 sound_ym.wd_data = tmp & ~0x20;
106 MFPDELAY();
107 sound_ym.wd_data = tmp | 0x20;
108 return 1;
109}
110
111static void atari_par_console_write(struct console *co, const char *str,
112 unsigned int count)
113{
114 static int printer_present = 1;
115
116 if (!printer_present)
117 return;
118
119 while (count--) {
120 if (*str == '\n') {
121 if (!ata_par_out('\r')) {
122 printer_present = 0;
123 return;
124 }
125 }
126 if (!ata_par_out(*str++)) {
127 printer_present = 0;
128 return;
129 }
130 }
131}
132
133#ifdef CONFIG_SERIAL_CONSOLE
134int atari_mfp_console_wait_key(struct console *co)
135{
136 while (!(mfp.rcv_stat & 0x80))
137 barrier();
138 return mfp.usart_dta;
139}
140
141int atari_scc_console_wait_key(struct console *co)
142{
143 do {
144 MFPDELAY();
145 } while (!(scc.cha_b_ctrl & 0x01));
146 MFPDELAY();
147 return scc.cha_b_data;
148}
149
150int atari_midi_console_wait_key(struct console *co)
151{
152 while (!(acia.mid_ctrl & ACIA_RDRF))
153 barrier();
154 return acia.mid_data;
155}
156#endif
157
158
159
160
161
162
163#ifndef CONFIG_SERIAL_CONSOLE
164static void __init atari_init_mfp_port(int cflag)
165#else
166void atari_init_mfp_port(int cflag)
167#endif
168{
169
170
171
172
173 static int baud_table[9] = { 16, 11, 8, 4, 2, 1, 175, 143, 128 };
174 int baud = cflag & CBAUD;
175 int parity = (cflag & PARENB) ? ((cflag & PARODD) ? 0x04 : 0x06) : 0;
176 int csize = ((cflag & CSIZE) == CS7) ? 0x20 : 0x00;
177
178 if (cflag & CBAUDEX)
179 baud += B38400;
180 if (baud < B1200 || baud > B38400+2)
181 baud = B9600;
182 baud -= B1200;
183
184 mfp.trn_stat &= ~0x01;
185 mfp.usart_ctr = parity | csize | 0x88;
186 mfp.tim_ct_cd &= 0x70;
187 mfp.tim_dt_d = baud_table[baud];
188 mfp.tim_ct_cd |= 0x01;
189 mfp.trn_stat |= 0x01;
190
191 atari_MFP_init_done = 1;
192}
193
194#define SCC_WRITE(reg, val) \
195 do { \
196 scc.cha_b_ctrl = (reg); \
197 MFPDELAY(); \
198 scc.cha_b_ctrl = (val); \
199 MFPDELAY(); \
200 } while (0)
201
202
203
204#define LONG_DELAY() \
205 do { \
206 int i; \
207 for (i = 100; i > 0; --i) \
208 MFPDELAY(); \
209 } while (0)
210
211#ifndef CONFIG_SERIAL_CONSOLE
212static void __init atari_init_scc_port(int cflag)
213#else
214void atari_init_scc_port(int cflag)
215#endif
216{
217 extern int atari_SCC_reset_done;
218 static int clksrc_table[9] =
219
220 { 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
221 static int brgsrc_table[9] =
222
223 { 2, 2, 2, 2, 2, 2, 0, 2, 2 };
224 static int clkmode_table[9] =
225
226 { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };
227 static int div_table[9] =
228
229 { 208, 138, 103, 50, 24, 11, 1, 0, 0 };
230
231 int baud = cflag & CBAUD;
232 int clksrc, clkmode, div, reg3, reg5;
233
234 if (cflag & CBAUDEX)
235 baud += B38400;
236 if (baud < B1200 || baud > B38400+2)
237 baud = B9600;
238 baud -= B1200;
239
240 clksrc = clksrc_table[baud];
241 clkmode = clkmode_table[baud];
242 div = div_table[baud];
243 if (ATARIHW_PRESENT(TT_MFP) && baud >= 6) {
244
245 clksrc = 0x28;
246 clkmode = baud == 6 ? 0xc0 :
247 baud == 7 ? 0x80 :
248 0x40;
249 div = 0;
250 }
251
252 reg3 = (cflag & CSIZE) == CS8 ? 0xc0 : 0x40;
253 reg5 = (cflag & CSIZE) == CS8 ? 0x60 : 0x20 | 0x82 ;
254
255 (void)scc.cha_b_ctrl;
256 SCC_WRITE(9, 0xc0);
257 LONG_DELAY();
258 SCC_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03)
259 : 0 | 0x04 | clkmode);
260 SCC_WRITE(3, reg3);
261 SCC_WRITE(5, reg5);
262 SCC_WRITE(9, 0);
263 LONG_DELAY();
264 SCC_WRITE(10, 0);
265 SCC_WRITE(11, clksrc);
266 SCC_WRITE(12, div);
267 SCC_WRITE(13, 0);
268 SCC_WRITE(14, brgsrc_table[baud]);
269 SCC_WRITE(14, brgsrc_table[baud] | (div ? 1 : 0));
270 SCC_WRITE(3, reg3 | 1);
271 SCC_WRITE(5, reg5 | 8);
272
273 atari_SCC_reset_done = 1;
274 atari_SCC_init_done = 1;
275}
276
277#ifndef CONFIG_SERIAL_CONSOLE
278static void __init atari_init_midi_port(int cflag)
279#else
280void atari_init_midi_port(int cflag)
281#endif
282{
283 int baud = cflag & CBAUD;
284 int csize = ((cflag & CSIZE) == CS8) ? 0x10 : 0x00;
285
286 int parity = (cflag & PARENB) ? ((cflag & PARODD) ? 0x0c : 0x08) : 0x04;
287 int div;
288
289
290
291 if (cflag & CBAUDEX)
292 baud += B38400;
293 if (baud == B4800)
294 div = ACIA_DIV64;
295 else if (baud == B38400+2 )
296 div = ACIA_DIV1;
297 else
298 div = ACIA_DIV16;
299
300
301 acia.mid_ctrl = div | csize | parity |
302 ((atari_switches & ATARI_SWITCH_MIDI) ?
303 ACIA_RHTID : ACIA_RLTID);
304}
305
306static int __init atari_debug_setup(char *arg)
307{
308 if (!MACH_IS_ATARI)
309 return 0;
310
311 if (!strcmp(arg, "ser"))
312
313 arg = MACH_IS_FALCON ? "ser2" : "ser1";
314
315 if (!strcmp(arg, "ser1")) {
316
317 atari_init_mfp_port(B9600|CS8);
318 atari_console_driver.write = atari_mfp_console_write;
319 } else if (!strcmp(arg, "ser2")) {
320
321 atari_init_scc_port(B9600|CS8);
322 atari_console_driver.write = atari_scc_console_write;
323 } else if (!strcmp(arg, "midi")) {
324
325 atari_init_midi_port(B9600|CS8);
326 atari_console_driver.write = atari_midi_console_write;
327 } else if (!strcmp(arg, "par")) {
328
329 atari_turnoff_irq(IRQ_MFP_BUSY);
330 sound_ym.rd_data_reg_sel = 7;
331 sound_ym.wd_data = 0xff;
332 sound_ym.rd_data_reg_sel = 15;
333 sound_ym.wd_data = 0;
334 sound_ym.rd_data_reg_sel = 14;
335 sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x20;
336 atari_console_driver.write = atari_par_console_write;
337 }
338 if (atari_console_driver.write)
339 register_console(&atari_console_driver);
340
341 return 0;
342}
343
344early_param("debug", atari_debug_setup);
345