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