This source file includes following definitions.
- sun_82072_fd_inb
- sun_82072_fd_outb
- sun_82077_fd_inb
- sun_82077_fd_outb
- virtual_dma_init
- sun_fd_disable_dma
- sun_fd_set_dma_mode
- sun_fd_set_dma_addr
- sun_fd_set_dma_count
- sun_fd_enable_dma
- sun_fd_request_irq
- sun_floppy_init
- sparc_eject
1
2
3
4
5
6 #ifndef __ASM_SPARC_FLOPPY_H
7 #define __ASM_SPARC_FLOPPY_H
8
9 #include <asm/page.h>
10 #include <asm/pgtable.h>
11 #include <asm/system.h>
12 #include <asm/idprom.h>
13 #include <asm/machines.h>
14 #include <asm/oplib.h>
15 #include <asm/auxio.h>
16 #include <asm/irq.h>
17
18
19
20
21
22
23 struct sun_flpy_controller {
24 volatile unsigned char status_82072;
25 #define dcr_82072 status_82072
26 #define status1_82077 status_82072
27
28 volatile unsigned char data_82072;
29 #define status2_82077 data_82072
30
31 volatile unsigned char dor_82077;
32 volatile unsigned char tapectl_82077;
33
34 volatile unsigned char status_82077;
35 #define drs_82077 status_82077
36
37 volatile unsigned char data_82077;
38 volatile unsigned char ___unused;
39 volatile unsigned char dir_82077;
40 #define dcr_82077 dir_82077
41 };
42
43
44 static struct sun_flpy_controller *sun_fdc = NULL;
45 volatile unsigned char *fdc_status;
46
47 struct sun_floppy_ops {
48 unsigned char (*fd_inb)(int port);
49 void (*fd_outb)(unsigned char value, int port);
50 };
51
52 static struct sun_floppy_ops sun_fdops;
53
54 #define fd_inb(port) sun_fdops.fd_inb(port)
55 #define fd_outb(value,port) sun_fdops.fd_outb(value,port)
56 #define fd_enable_dma() sun_fd_enable_dma()
57 #define fd_disable_dma() sun_fd_disable_dma()
58 #define fd_request_dma() (0)
59 #define fd_free_dma()
60 #define fd_clear_dma_ff()
61 #define fd_set_dma_mode(mode) sun_fd_set_dma_mode(mode)
62 #define fd_set_dma_addr(addr) sun_fd_set_dma_addr(addr)
63 #define fd_set_dma_count(count) sun_fd_set_dma_count(count)
64 #define fd_enable_irq()
65 #define fd_disable_irq()
66 #define fd_cacheflush(addr, size)
67 #define fd_request_irq() sun_fd_request_irq()
68 #define fd_free_irq()
69
70 #define FLOPPY_MOTOR_MASK 0x10
71
72
73 #define virt_to_bus(x) (x)
74 #define bus_to_virt(x) (x)
75
76
77 #define get_dma_residue(x) (0)
78
79 #define FLOPPY0_TYPE 4
80 #define FLOPPY1_TYPE 0
81
82
83 #undef HAVE_DISABLE_HLT
84
85
86
87
88
89 #define FDC1 sun_floppy_init()
90
91 static int FDC2=-1;
92
93 #define N_FDC 1
94 #define N_DRIVE 8
95
96
97 #define CROSS_64KB(a,s) (0)
98
99
100 static unsigned char sun_82072_fd_inb(int port)
101 {
102 switch(port & 7) {
103 default:
104 printk("floppy: Asked to read unknown port %d\n", port);
105 panic("floppy: Port bolixed.");
106 case 4:
107 return sun_fdc->status_82072 & ~STATUS_DMA;
108 case 5:
109 return sun_fdc->data_82072;
110 case 7:
111
112
113
114 return 0;
115 };
116 panic("sun_82072_fd_inb: How did I get here?");
117 }
118
119 static void sun_82072_fd_outb(unsigned char value, int port)
120 {
121 switch(port & 7) {
122 default:
123 printk("floppy: Asked to write to unknown port %d\n", port);
124 panic("floppy: Port bolixed.");
125 case 2:
126
127
128
129
130
131
132
133
134 {
135 unsigned bits = 0;
136 if (value & 0x10) bits |= AUXIO_FLPY_DSEL;
137 if ((value & 0x80) == 0) bits |= AUXIO_FLPY_EJCT;
138 set_auxio(bits, (~bits) & (AUXIO_FLPY_DSEL|AUXIO_FLPY_EJCT));
139 }
140 break;
141 case 5:
142 sun_fdc->data_82072 = value;
143 break;
144 case 7:
145 sun_fdc->dcr_82072 = value;
146 break;
147 case 4:
148 sun_fdc->status_82072 = value;
149 break;
150 };
151 return;
152 }
153
154 static unsigned char sun_82077_fd_inb(int port)
155 {
156 switch(port & 7) {
157 default:
158 printk("floppy: Asked to read unknown port %d\n", port);
159 panic("floppy: Port bolixed.");
160 case 4:
161 return sun_fdc->status_82077 & ~STATUS_DMA;
162 case 5:
163 return sun_fdc->data_82077;
164 case 7:
165
166
167
168 return 0;
169 };
170 panic("sun_82072_fd_inb: How did I get here?");
171 }
172
173 static void sun_82077_fd_outb(unsigned char value, int port)
174 {
175 switch(port & 7) {
176 default:
177 printk("floppy: Asked to write to unknown port %d\n", port);
178 panic("floppy: Port bolixed.");
179 case 2:
180
181 sun_fdc->dor_82077 = value;
182 break;
183 case 5:
184 sun_fdc->data_82077 = value;
185 break;
186 case 7:
187 sun_fdc->dcr_82077 = value;
188 break;
189 case 4:
190 sun_fdc->status_82077 = value;
191 break;
192 };
193 return;
194 }
195
196
197
198
199
200
201
202
203
204
205
206 char *pdma_vaddr;
207 unsigned long pdma_size;
208 volatile int doing_pdma = 0;
209
210
211 char *pdma_base = 0;
212 unsigned long pdma_areasize;
213
214
215 static inline void virtual_dma_init(void)
216 {
217
218 }
219
220 static inline void sun_fd_disable_dma(void)
221 {
222 doing_pdma = 0;
223 if (pdma_base) {
224 mmu_unlockarea(pdma_base, pdma_areasize);
225 pdma_base = 0;
226 }
227 }
228
229 static inline void sun_fd_set_dma_mode(int mode)
230 {
231 switch(mode) {
232 case DMA_MODE_READ:
233 doing_pdma = 1;
234 break;
235 case DMA_MODE_WRITE:
236 doing_pdma = 2;
237 break;
238 default:
239 printk("Unknown dma mode %d\n", mode);
240 panic("floppy: Giving up...");
241 }
242 }
243
244 static inline void sun_fd_set_dma_addr(char *buffer)
245 {
246 pdma_vaddr = buffer;
247 }
248
249 static inline void sun_fd_set_dma_count(int length)
250 {
251 pdma_size = length;
252 }
253
254 static inline void sun_fd_enable_dma(void)
255 {
256 pdma_vaddr = mmu_lockarea(pdma_vaddr, pdma_size);
257 pdma_base = pdma_vaddr;
258 pdma_areasize = pdma_size;
259 }
260
261
262 extern void floppy_hardint(int irq, void *unused, struct pt_regs *regs);
263
264 static int sun_fd_request_irq(void)
265 {
266 static int once = 0;
267 int error;
268
269 if(!once) {
270 once = 1;
271 error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, SA_INTERRUPT, "floppy");
272 return ((error == 0) ? 0 : -1);
273 } else return 0;
274 }
275
276 static struct linux_prom_registers fd_regs[2];
277
278 static int sun_floppy_init(void)
279 {
280 char state[128];
281 int tnode, fd_node, num_regs;
282
283 FLOPPY_IRQ = 11;
284
285
286
287 if((sparc_cpu_model != sun4c && sparc_cpu_model != sun4m) ||
288 ((idprom->id_machtype == (SM_SUN4C | SM_4C_SLC)) ||
289 (idprom->id_machtype == (SM_SUN4C | SM_4C_ELC)))) {
290
291 goto no_sun_fdc;
292 }
293
294 tnode = prom_getchild(prom_root_node);
295 fd_node = prom_searchsiblings(tnode, "obio");
296 if(fd_node != 0) {
297 tnode = prom_getchild(fd_node);
298 fd_node = prom_searchsiblings(tnode, "SUNW,fdtwo");
299 } else {
300 fd_node = prom_searchsiblings(tnode, "fd");
301 }
302 if(fd_node == 0) {
303 goto no_sun_fdc;
304 }
305
306
307 if(sparc_cpu_model == sun4m) {
308 prom_getproperty(fd_node, "status", state, sizeof(state));
309 if(!strcmp(state, "disabled")) {
310 goto no_sun_fdc;
311 }
312 }
313 num_regs = prom_getproperty(fd_node, "reg", (char *) fd_regs, sizeof(fd_regs));
314 num_regs = (num_regs / sizeof(fd_regs[0]));
315 prom_apply_obio_ranges(fd_regs, num_regs);
316 sun_fdc = (struct sun_flpy_controller *) sparc_alloc_io(fd_regs[0].phys_addr,
317 0x0,
318 fd_regs[0].reg_size,
319 "floppy",
320 fd_regs[0].which_io,
321 0x0);
322
323 if(sun_fdc->status_82072 == 0xff) {
324 sun_fdc = NULL;
325 goto no_sun_fdc;
326 }
327
328 if(sparc_cpu_model == sun4c) {
329 sun_fdops.fd_inb = sun_82072_fd_inb;
330 sun_fdops.fd_outb = sun_82072_fd_outb;
331 fdc_status = &sun_fdc->status_82072;
332
333 } else {
334 sun_fdops.fd_inb = sun_82077_fd_inb;
335 sun_fdops.fd_outb = sun_82077_fd_outb;
336 fdc_status = &sun_fdc->status_82077;
337
338 }
339
340
341 return (int) sun_fdc;
342
343 no_sun_fdc:
344 return -1;
345 }
346
347 static int sparc_eject(void)
348 {
349 set_dor(0, ~0, 0x90);
350 udelay(500);
351 set_dor(0, ~0x90, 0);
352 udelay(500);
353 return 0;
354 }
355
356 #define fd_eject(drive) sparc_eject()
357
358 #endif